x86/xen: return a sane initial apic id when running as PV guest

With recent sanity checks for topology information added, there are now
warnings issued for APs when running as a Xen PV guest:

  [Firmware Bug]: CPU   1: APIC ID mismatch. CPUID: 0x0000 APIC: 0x0001

This is due to the initial APIC ID obtained via CPUID for PV guests is
always 0.

Avoid the warnings by synthesizing the CPUID data to contain the same
initial APIC ID as xen_pv_smp_config() is using for registering the
APIC IDs of all CPUs.

Fixes: 52128a7a21 ("86/cpu/topology: Make the APIC mismatch warnings complete")
Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
Juergen Gross 2024-04-05 14:15:47 +02:00
parent 8a95db3bf8
commit 802600ebdf
1 changed files with 10 additions and 1 deletions

View File

@ -219,13 +219,21 @@ static __read_mostly unsigned int cpuid_leaf5_edx_val;
static void xen_cpuid(unsigned int *ax, unsigned int *bx, static void xen_cpuid(unsigned int *ax, unsigned int *bx,
unsigned int *cx, unsigned int *dx) unsigned int *cx, unsigned int *dx)
{ {
unsigned maskebx = ~0; unsigned int maskebx = ~0;
unsigned int or_ebx = 0;
/* /*
* Mask out inconvenient features, to try and disable as many * Mask out inconvenient features, to try and disable as many
* unsupported kernel subsystems as possible. * unsupported kernel subsystems as possible.
*/ */
switch (*ax) { switch (*ax) {
case 0x1:
/* Replace initial APIC ID in bits 24-31 of EBX. */
/* See xen_pv_smp_config() for related topology preparations. */
maskebx = 0x00ffffff;
or_ebx = smp_processor_id() << 24;
break;
case CPUID_MWAIT_LEAF: case CPUID_MWAIT_LEAF:
/* Synthesize the values.. */ /* Synthesize the values.. */
*ax = 0; *ax = 0;
@ -248,6 +256,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
: "0" (*ax), "2" (*cx)); : "0" (*ax), "2" (*cx));
*bx &= maskebx; *bx &= maskebx;
*bx |= or_ebx;
} }
static bool __init xen_check_mwait(void) static bool __init xen_check_mwait(void)