Patch "x86/apic: Handle no CONFIG_X86_X2APIC on systems with x2APIC enabled by BIOS" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/apic: Handle no CONFIG_X86_X2APIC on systems with x2APIC enabled by BIOS

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-apic-handle-no-config_x86_x2apic-on-systems-with.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 34c48e8f66b1a8e26a485f6f2bb0cd8d0b75fbb9
Author: Mateusz Jończyk <mat.jonczyk@xxxxx>
Date:   Tue Nov 29 22:50:08 2022 +0100

    x86/apic: Handle no CONFIG_X86_X2APIC on systems with x2APIC enabled by BIOS
    
    [ Upstream commit e3998434da4f5b1f57f8d6a8a9f8502ee3723bae ]
    
    A kernel that was compiled without CONFIG_X86_X2APIC was unable to boot on
    platforms that have x2APIC already enabled in the BIOS before starting the
    kernel.
    
    The kernel was supposed to panic with an approprite error message in
    validate_x2apic() due to the missing X2APIC support.
    
    However, validate_x2apic() was run too late in the boot cycle, and the
    kernel tried to initialize the APIC nonetheless. This resulted in an
    earlier panic in setup_local_APIC() because the APIC was not registered.
    
    In my experiments, a panic message in setup_local_APIC() was not visible
    in the graphical console, which resulted in a hang with no indication
    what has gone wrong.
    
    Instead of calling panic(), disable the APIC, which results in a somewhat
    working system with the PIC only (and no SMP). This way the user is able to
    diagnose the problem more easily.
    
    Disabling X2APIC mode is not an option because it's impossible on systems
    with locked x2APIC.
    
    The proper place to disable the APIC in this case is in check_x2apic(),
    which is called early from setup_arch(). Doing this in
    __apic_intr_mode_select() is too late.
    
    Make check_x2apic() unconditionally available and remove the empty stub.
    
    Reported-by: Paul Menzel <pmenzel@xxxxxxxxxxxxx>
    Reported-by: Robert Elliott (Servers) <elliott@xxxxxxx>
    Signed-off-by: Mateusz Jończyk <mat.jonczyk@xxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/lkml/d573ba1c-0dc4-3016-712a-cc23a8a33d42@xxxxxxxxxxxxx
    Link: https://lore.kernel.org/lkml/20220911084711.13694-3-mat.jonczyk@xxxxx
    Link: https://lore.kernel.org/all/20221129215008.7247-1-mat.jonczyk@xxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4728d3f5d5c4..3fec0e9d9241 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -450,8 +450,8 @@ config X86_X2APIC
 
 	  Some Intel systems circa 2022 and later are locked into x2APIC mode
 	  and can not fall back to the legacy APIC modes if SGX or TDX are
-	  enabled in the BIOS.  They will be unable to boot without enabling
-	  this option.
+	  enabled in the BIOS. They will boot with very reduced functionality
+	  without enabling this option.
 
 	  If you don't know what to do here, say N.
 
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 3415321c8240..3216da7074ba 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -249,7 +249,6 @@ static inline u64 native_x2apic_icr_read(void)
 extern int x2apic_mode;
 extern int x2apic_phys;
 extern void __init x2apic_set_max_apicid(u32 apicid);
-extern void __init check_x2apic(void);
 extern void x2apic_setup(void);
 static inline int x2apic_enabled(void)
 {
@@ -258,13 +257,13 @@ static inline int x2apic_enabled(void)
 
 #define x2apic_supported()	(boot_cpu_has(X86_FEATURE_X2APIC))
 #else /* !CONFIG_X86_X2APIC */
-static inline void check_x2apic(void) { }
 static inline void x2apic_setup(void) { }
 static inline int x2apic_enabled(void) { return 0; }
 
 #define x2apic_mode		(0)
 #define	x2apic_supported()	(0)
 #endif /* !CONFIG_X86_X2APIC */
+extern void __init check_x2apic(void);
 
 struct irq_data;
 
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index c6876d3ea4b1..20d9a604da7c 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1931,16 +1931,19 @@ void __init check_x2apic(void)
 	}
 }
 #else /* CONFIG_X86_X2APIC */
-static int __init validate_x2apic(void)
+void __init check_x2apic(void)
 {
 	if (!apic_is_x2apic_enabled())
-		return 0;
+		return;
 	/*
-	 * Checkme: Can we simply turn off x2apic here instead of panic?
+	 * Checkme: Can we simply turn off x2APIC here instead of disabling the APIC?
 	 */
-	panic("BIOS has enabled x2apic but kernel doesn't support x2apic, please disable x2apic in BIOS.\n");
+	pr_err("Kernel does not support x2APIC, please recompile with CONFIG_X86_X2APIC.\n");
+	pr_err("Disabling APIC, expect reduced performance and functionality.\n");
+
+	disable_apic = 1;
+	setup_clear_cpu_cap(X86_FEATURE_APIC);
 }
-early_initcall(validate_x2apic);
 
 static inline void try_to_enable_x2apic(int remap_mode) { }
 static inline void __x2apic_enable(void) { }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux