| From 0a27bc3f95c077083570734d8283e29f70f9ce3b Mon Sep 17 00:00:00 2001 |
| From: Mohit Gambhir <mohit.gambhir@oracle.com> |
| Date: Thu, 26 Jan 2017 13:12:27 -0500 |
| Subject: [PATCH] x86/xen: Fix APIC id mismatch warning on Intel |
| |
| commit cc272163ea554a97dac180fa8dd6cd54c2810bd1 upstream. |
| |
| This patch fixes the following warning message seen when booting the |
| kernel as Dom0 with Xen on Intel machines. |
| |
| [0.003000] [Firmware Bug]: CPU1: APIC id mismatch. Firmware: 0 APIC: 1] |
| |
| The code generating the warning in validate_apic_and_package_id() matches |
| cpu_data(cpu).apicid (initialized in init_intel()-> |
| detect_extended_topology() using cpuid) against the apicid returned from |
| xen_apic_read(). Now, xen_apic_read() makes a hypercall to retrieve apicid |
| for the boot cpu but returns 0 otherwise. Hence the warning gets thrown |
| for all but the boot cpu. |
| |
| The idea behind xen_apic_read() returning 0 for apicid is that the |
| guests (even Dom0) should not need to know what physical processor their |
| vcpus are running on. This is because we currently do not have topology |
| information in Xen and also because xen allows more vcpus than physical |
| processors. However, boot cpu's apicid is required for loading |
| xen-acpi-processor driver on AMD machines. Look at following patch for |
| details: |
| |
| commit 558daa289a40 ("xen/apic: Return the APIC ID (and version) for CPU |
| 0.") |
| |
| So to get rid of the warning, this patch modifies |
| xen_cpu_present_to_apicid() to return cpu_data(cpu).apicid instead of |
| calling xen_apic_read(). |
| |
| The warning is not seen on AMD machines because init_amd() populates |
| cpu_data(cpu).apicid by calling hard_smp_processor_id()->xen_apic_read() |
| as opposed to using apicid from cpuid as is done on Intel machines. |
| |
| Signed-off-by: Mohit Gambhir <mohit.gambhir@oracle.com> |
| Reviewed-by: Juergen Gross <jgross@suse.com> |
| Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/xen/apic.c b/arch/x86/xen/apic.c |
| index 44c88ad1841a..bcea81f36fc5 100644 |
| --- a/arch/x86/xen/apic.c |
| +++ b/arch/x86/xen/apic.c |
| @@ -145,7 +145,7 @@ static void xen_silent_inquire(int apicid) |
| static int xen_cpu_present_to_apicid(int cpu) |
| { |
| if (cpu_present(cpu)) |
| - return xen_get_apic_id(xen_apic_read(APIC_ID)); |
| + return cpu_data(cpu).apicid; |
| else |
| return BAD_APICID; |
| } |
| -- |
| 2.12.0 |
| |