Messages in this thread Patch in this message | | | From | Dheeraj Kumar Srivastava <> | Subject | [PATCH v1] x86/apic: Fix kernel panic when "intremap=off" and "x2apic_phys" are set | Date | Sat, 17 Jun 2023 02:52:36 +0530 |
| |
x2APIC mode requires "Interrupt Remapping" to be enabled and the "physical x2apic" driver can be used only when x2APIC mode is enabled. However when "intremap=off" and "x2apic_phys" kernel command line parameters are passed, "physical x2apic" driver is being used even when x2APIC mode is disabled ("intremap=off" disables x2APIC mode). This results in the below kernel panic:
unchecked MSR access error: RDMSR from 0x80f at rIP: 0xffffffff87eab4ec (native_read_msr+0xc/0x40) Call Trace: <TASK> native_apic_msr_read+0x1f/0x30 setup_local_APIC+0x4e/0x380 ? zen_untrain_ret+0x1/0x1 ? enable_IR_x2apic+0xe8/0x250 apic_intr_mode_init+0x4c/0x120 x86_late_time_init+0x28/0x40 start_kernel+0x626/0xa80 x86_64_start_reservations+0x1c/0x30 x86_64_start_kernel+0xbf/0x110 secondary_startup_64_no_verify+0x10b/0x10b </TASK>
This is due to an incorrect conditional check in x2apic_phys_probe(). Fix it here by returning 0 when "x2apic_mode" is not set in x2apic_phys_probe(). This now prevents default_setup_apic_routing() from selecting "physical x2apic" driver.
Fixes: 9ebd680bd029 ("x86, apic: Use probe routines to simplify apic selection") Reviewed-by: Kishon Vijay Abraham I <kvijayab@amd.com> Reviewed-by: Vasant Hegde <vasant.hegde@amd.com> Signed-off-by: Dheeraj Kumar Srivastava <dheerajkumar.srivastava@amd.com> --- arch/x86/kernel/apic/x2apic_phys.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 6bde05a86b4e..896bc41cb2ba 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c @@ -97,7 +97,10 @@ static void init_x2apic_ldr(void) static int x2apic_phys_probe(void) { - if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys())) + if (!x2apic_mode) + return 0; + + if (x2apic_phys || x2apic_fadt_phys()) return 1; return apic == &apic_x2apic_phys; -- 2.25.1
| |