diff options
author | Jan Beulich <jbeulich@novell.com> | 2012-07-09 10:22:24 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2012-07-09 10:22:24 +0100 |
commit | 9bf475a1be5d76895a3ddb50a032363b01768ee3 (patch) | |
tree | 72eded2804ffb78c70e438d299ae2a7dab179ab0 | |
parent | 1336fa74787d3da1ac1a1a7beb6836c6fdce63d3 (diff) | |
download | xen-9bf475a1be5d76895a3ddb50a032363b01768ee3.tar.gz xen-9bf475a1be5d76895a3ddb50a032363b01768ee3.tar.bz2 xen-9bf475a1be5d76895a3ddb50a032363b01768ee3.zip |
pm: don't truncate processors' ACPI IDs to 8 bits
This is just another adjustment to allow systems with very many CPUs
(or unusual ACPI IDs) to be properly power-managed.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen-unstable changeset: 23781:0849b0e59e24
xen-unstable date: Mon Aug 22 10:10:39 2011 +0100
-rw-r--r-- | xen/arch/ia64/linux-xen/acpi.c | 5 | ||||
-rw-r--r-- | xen/arch/x86/acpi/cpu_idle.c | 7 | ||||
-rw-r--r-- | xen/include/acpi/cpufreq/processor_perf.h | 2 |
3 files changed, 10 insertions, 4 deletions
diff --git a/xen/arch/ia64/linux-xen/acpi.c b/xen/arch/ia64/linux-xen/acpi.c index e9a25962cf..0580adb4bf 100644 --- a/xen/arch/ia64/linux-xen/acpi.c +++ b/xen/arch/ia64/linux-xen/acpi.c @@ -223,11 +223,14 @@ static u16 ia64_acpiid_to_sapicid[ MAX_LOCAL_SAPIC ] = {[0 ... MAX_LOCAL_SAPIC - 1] = 0xffff }; /* acpi id to cpu id */ -int get_cpu_id(u8 acpi_id) +int get_cpu_id(u32 acpi_id) { int i; u16 apic_id; + if ( acpi_id >= MAX_LOCAL_SAPIC ) + return -EINVAL; + apic_id = ia64_acpiid_to_sapicid[acpi_id]; if ( apic_id == 0xffff ) return -EINVAL; diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index 122e7f90cb..a8d160da81 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -902,11 +902,14 @@ static void set_cx( acpi_power->safe_state = cx; } -int get_cpu_id(u8 acpi_id) +int get_cpu_id(u32 acpi_id) { int i; u32 apic_id; + if ( acpi_id >= MAX_MADT_ENTRIES ) + return -1; + apic_id = x86_acpiid_to_apicid[acpi_id]; if ( apic_id == BAD_APICID ) return -1; @@ -983,7 +986,7 @@ long set_cx_pminfo(uint32_t cpu, struct xen_processor_power *power) print_cx_pminfo(cpu, power); /* map from acpi_id to cpu_id */ - cpu_id = get_cpu_id((u8)cpu); + cpu_id = get_cpu_id(cpu); if ( cpu_id == -1 ) { printk(XENLOG_ERR "no cpu_id for acpi_id %d\n", cpu); diff --git a/xen/include/acpi/cpufreq/processor_perf.h b/xen/include/acpi/cpufreq/processor_perf.h index 5402ba1f50..7ad75e29fc 100644 --- a/xen/include/acpi/cpufreq/processor_perf.h +++ b/xen/include/acpi/cpufreq/processor_perf.h @@ -6,7 +6,7 @@ #define XEN_PX_INIT 0x80000000 -int get_cpu_id(u8); +int get_cpu_id(u32); int powernow_cpufreq_init(void); unsigned int powernow_register_driver(void); unsigned int get_measured_perf(unsigned int cpu, unsigned int flag); |