[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230717223223.971994770@linutronix.de>
Date: Tue, 18 Jul 2023 01:14:57 +0200 (CEST)
From: Thomas Gleixner <tglx@...utronix.de>
To: LKML <linux-kernel@...r.kernel.org>
Cc: x86@...nel.org, Linus Torvalds <torvalds@...ux-foundation.org>,
Andrew Cooper <andrew.cooper3@...rix.com>,
Tom Lendacky <thomas.lendacky@....com>,
Paolo Bonzini <pbonzini@...hat.com>,
Wei Liu <wei.liu@...nel.org>,
Arjan van de Ven <arjan@...ux.intel.com>,
Juergen Gross <jgross@...e.com>
Subject: [patch 15/58] x86/apic: Sanitize APIC address setup
Convert places which just write mp_lapic_addr and let them register the
local APIC address directly instead of relying on magic other code to do
so.
Add a WARN_ON() into register_lapic_address() which is raised when
register_lapic_address() is invoked more than once during boot.
Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
---
arch/x86/kernel/apic/apic.c | 25 ++++++++-----------------
1 file changed, 8 insertions(+), 17 deletions(-)
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2009,12 +2009,12 @@ static bool __init detect_init_APIC(void
return false;
}
- mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
+ register_lapic_address(APIC_DEFAULT_PHYS_BASE);
return true;
}
#else
-static bool __init apic_verify(void)
+static bool __init apic_verify(unsigned long addr)
{
u32 features, h, l;
@@ -2028,15 +2028,15 @@ static bool __init apic_verify(void)
return false;
}
set_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC);
- mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
/* The BIOS may have set up the APIC at some other address */
if (boot_cpu_data.x86 >= 6) {
rdmsr(MSR_IA32_APICBASE, l, h);
if (l & MSR_IA32_APICBASE_ENABLE)
- mp_lapic_addr = l & MSR_IA32_APICBASE_BASE;
+ addr = l & MSR_IA32_APICBASE_BASE;
}
+ register_lapic_address(addr);
pr_info("Found and enabled local APIC!\n");
return true;
}
@@ -2063,7 +2063,7 @@ bool __init apic_force_enable(unsigned l
enabled_via_apicbase = 1;
}
}
- return apic_verify();
+ return apic_verify(addr);
}
/*
@@ -2105,7 +2105,7 @@ static bool __init detect_init_APIC(void
if (!apic_force_enable(APIC_DEFAULT_PHYS_BASE))
return false;
} else {
- if (!apic_verify())
+ if (!apic_verify(APIC_DEFAULT_PHYS_BASE))
return false;
}
@@ -2130,20 +2130,9 @@ void __init init_apic_mappings(void)
if (x2apic_mode)
return;
- /* If no local APIC can be found return early */
if (!smp_found_config && !detect_init_APIC()) {
- /* lets NOP'ify apic operations */
pr_info("APIC: disable apic facility\n");
apic_disable();
- } else {
- apic_phys = mp_lapic_addr;
-
- /*
- * If the system has ACPI MADT tables or MP info, the LAPIC
- * address is already registered.
- */
- if (!acpi_lapic && !smp_found_config)
- register_lapic_address(apic_phys);
}
}
@@ -2158,6 +2147,8 @@ static __init void apic_set_fixmap(void)
void __init register_lapic_address(unsigned long address)
{
+ /* This should only happen once */
+ WARN_ON_ONCE(mp_lapic_addr);
mp_lapic_addr = address;
if (!x2apic_mode)
Powered by blists - more mailing lists