Message ID | 20230508185219.070274100@linutronix.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | cpu/hotplug, x86: Reworked parallel CPU bringup | expand |
Hello! On 5/8/23 10:44 PM, Thomas Gleixner wrote: > From: Thomas Gleixner <tglx@linutronix.de> > > For parallel CPU brinugp it's required to read the APIC ID in the low level > startup code. The virtual APIC base address is a constant because its a > fix-mapped address. Exposing that constant which is composed via macros to > assembly code is non-trivial dues to header inclusion hell. s/dues/due/? > Aside of that it's constant only because of the vsyscall ABI > requirement. Once vsyscall is out of the picture the fixmap can be placed > at runtime. > > Avoid header hell, stay flexible and store the address in a variable which > can be exposed to the low level startup code. > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Tested-by: Michael Kelley <mikelley@microsoft.com> [...] MBR, Sergey
--- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h @@ -196,6 +196,7 @@ extern void nmi_selftest(void); #endif extern unsigned int smpboot_control; +extern unsigned long apic_mmio_base; #endif /* !__ASSEMBLY__ */ --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -101,6 +101,9 @@ static int apic_extnmi __ro_after_init = */ static bool virt_ext_dest_id __ro_after_init; +/* For parallel bootup. */ +unsigned long apic_mmio_base __ro_after_init; + /* * Map cpu index to physical APIC ID */ @@ -2163,6 +2166,7 @@ void __init register_lapic_address(unsig if (!x2apic_mode) { set_fixmap_nocache(FIX_APIC_BASE, address); + apic_mmio_base = APIC_BASE; apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n", APIC_BASE, address); }