diff options
author | Keir Fraser <keir@xen.org> | 2010-12-15 11:55:48 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-12-15 11:55:48 +0000 |
commit | 613407d5903e76e51f3573b3a465b064cb390331 (patch) | |
tree | 0a706d4769d40163eef83a1822e262e637cd7b92 | |
parent | 06e127fc275cd524a0f1dc8e2fa974de46619c10 (diff) | |
download | xen-613407d5903e76e51f3573b3a465b064cb390331.tar.gz xen-613407d5903e76e51f3573b3a465b064cb390331.tar.bz2 xen-613407d5903e76e51f3573b3a465b064cb390331.zip |
x86: increase MAX_LOCAL_APIC
otherwise apicid_to_node[MAX_LOCAL_APIC] will be overrun if apicid >
255. After patch, the mapping get right.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Make this and also MAX_MADT_ENTRIES loosely depend on NR_CPUS. Tie
MAX_APICS to MAX_LOCAL_APIC. Fix initializer of x86_acpiid_to_apicid[]
to match the array member type of u32, as well as all checks in
readers of this array and x86_cpu_to_apicid[].
While the adjustment to xen_vcpu_physid_to_x86_{acpi,apic}id() is not
backward compatible, I think it should still be done this way as the
former reserving of values beyond 0xff should never have been part of
the interface. If considered impossible, a second best solution would
appear to be to make the macros depend on __XEN_INTERFACE_VERSION__.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
-rw-r--r-- | xen/arch/x86/acpi/boot.c | 9 | ||||
-rw-r--r-- | xen/arch/x86/acpi/cpu_idle.c | 2 | ||||
-rw-r--r-- | xen/arch/x86/smpboot.c | 7 | ||||
-rw-r--r-- | xen/include/asm-x86/acpi.h | 6 | ||||
-rw-r--r-- | xen/include/asm-x86/numa.h | 2 | ||||
-rw-r--r-- | xen/include/public/vcpu.h | 9 |
6 files changed, 18 insertions, 17 deletions
diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c index 5ea885e1ad..ad8ee4869d 100644 --- a/xen/arch/x86/acpi/boot.c +++ b/xen/arch/x86/acpi/boot.c @@ -82,7 +82,7 @@ u8 acpi_enable_value, acpi_disable_value; #endif u32 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] = - {[0 ... MAX_MADT_ENTRIES - 1] = 0xff }; + {[0 ... MAX_MADT_ENTRIES - 1] = BAD_APICID }; EXPORT_SYMBOL(x86_acpiid_to_apicid); /* -------------------------------------------------------------------------- @@ -534,6 +534,7 @@ static int __init acpi_parse_madt_lapic_entries(void) mp_register_lapic_address(acpi_lapic_addr); + BUILD_BUG_ON(MAX_APICS != MAX_LOCAL_APIC); count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic, MAX_APICS); x2count = acpi_table_parse_madt(ACPI_MADT_X2APIC, acpi_parse_x2apic, @@ -1000,12 +1001,12 @@ unsigned int acpi_get_processor_id(unsigned int cpu) { unsigned int acpiid, apicid; - if ((apicid = x86_cpu_to_apicid[cpu]) == 0xff) - return 0xff; + if ((apicid = x86_cpu_to_apicid[cpu]) == BAD_APICID) + return INVALID_ACPIID; for (acpiid = 0; acpiid < ARRAY_SIZE(x86_acpiid_to_apicid); acpiid++) if (x86_acpiid_to_apicid[acpiid] == apicid) return acpiid; - return 0xff; + return INVALID_ACPIID; } diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index d43561ddcc..57b21a6547 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -869,7 +869,7 @@ int get_cpu_id(u8 acpi_id) u32 apic_id; apic_id = x86_acpiid_to_apicid[acpi_id]; - if ( apic_id == 0xff ) + if ( apic_id == BAD_APICID ) return -1; for ( i = 0; i < NR_CPUS; i++ ) diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 40b60ae746..e5fc896363 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -67,7 +67,8 @@ EXPORT_SYMBOL(cpu_online_map); struct cpuinfo_x86 cpu_data[NR_CPUS]; -u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = -1U }; +u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly = + { [0 ... NR_CPUS-1] = BAD_APICID }; static void map_cpu_to_logical_apicid(void); @@ -882,7 +883,7 @@ int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm) return -EBUSY; /* Detect if the cpu has been added before */ - if ( x86_acpiid_to_apicid[acpi_id] != 0xff ) + if ( x86_acpiid_to_apicid[acpi_id] != BAD_APICID ) { cpu = (x86_acpiid_to_apicid[acpi_id] != apic_id) ? -EINVAL : -EEXIST; @@ -906,7 +907,7 @@ int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm) { dprintk(XENLOG_WARNING, "Setup node failed for pxm %x\n", pxm); - x86_acpiid_to_apicid[acpi_id] = 0xff; + x86_acpiid_to_apicid[acpi_id] = BAD_APICID; mp_unregister_lapic(apic_id, cpu); cpu = node; goto out; diff --git a/xen/include/asm-x86/acpi.h b/xen/include/asm-x86/acpi.h index ddff9516aa..ba8ab2a35f 100644 --- a/xen/include/asm-x86/acpi.h +++ b/xen/include/asm-x86/acpi.h @@ -150,9 +150,11 @@ struct acpi_sleep_info { #endif /* CONFIG_ACPI_SLEEP */ -#define MAX_MADT_ENTRIES 256 +#define MAX_MADT_ENTRIES MAX(256, 2 * NR_CPUS) extern u32 x86_acpiid_to_apicid[]; -#define MAX_LOCAL_APIC 256 +#define MAX_LOCAL_APIC MAX(256, 4 * NR_CPUS) + +#define INVALID_ACPIID (-1U) extern u32 pmtmr_ioport; diff --git a/xen/include/asm-x86/numa.h b/xen/include/asm-x86/numa.h index 27d4e30e8a..b2a2255eb3 100644 --- a/xen/include/asm-x86/numa.h +++ b/xen/include/asm-x86/numa.h @@ -37,7 +37,7 @@ extern int setup_node(int pxm); extern void srat_detect_node(int cpu); extern void setup_node_bootmem(int nodeid, u64 start, u64 end); -extern unsigned char apicid_to_node[256]; +extern unsigned char apicid_to_node[]; #ifdef CONFIG_NUMA extern void __init init_cpu_to_node(void); diff --git a/xen/include/public/vcpu.h b/xen/include/public/vcpu.h index c98e6be0e1..d52f12139a 100644 --- a/xen/include/public/vcpu.h +++ b/xen/include/public/vcpu.h @@ -187,8 +187,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); /* * Get the physical ID information for a pinned vcpu's underlying physical * processor. The physical ID informmation is architecture-specific. - * On x86: id[31:0]=apic_id, id[63:32]=acpi_id, and all values 0xff and - * greater are reserved. + * On x86: id[31:0]=apic_id, id[63:32]=acpi_id. * This command returns -EINVAL if it is not a valid operation for this VCPU. */ #define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */ @@ -197,10 +196,8 @@ struct vcpu_get_physid { }; typedef struct vcpu_get_physid vcpu_get_physid_t; DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); -#define xen_vcpu_physid_to_x86_apicid(physid) \ - ((((uint32_t)(physid)) >= 0xff) ? 0xff : ((uint8_t)(physid))) -#define xen_vcpu_physid_to_x86_acpiid(physid) \ - ((((uint32_t)((physid)>>32)) >= 0xff) ? 0xff : ((uint8_t)((physid)>>32))) +#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid)) +#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32)) /* * Register a memory location to get a secondary copy of the vcpu time |