linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86: efi: Turn off efi_enabled after setup on mixed fw/kernel
@ 2012-08-19 21:48 Olof Johansson
  2012-08-20  9:56 ` Matt Fleming
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Olof Johansson @ 2012-08-19 21:48 UTC (permalink / raw)
  To: hpa
  Cc: linux-kernel, mk, Marko Kohtala, Olof Johansson, Matt Fleming,
	Matthew Garrett

When 32-bit EFI is used with 64-bit kernel (or vice versa), turn off
efi_enabled once setup is done. Beyond setup, it is normally used to
determine if runtime services are available and we will have none.

This will resolve issues stemming from efivars modprobe panicking on a
32/64-bit setup, as well as some reboot issues on similar setups.

Signed-off-by: Olof Johansson <olof@lixom.net>
Cc: stable@kernel.org # 3.4 and 3.5
Cc: Matt Fleming <matt.fleming@intel.com>
Cc: Matthew Garrett <mjg@redhat.com>
---
 arch/x86/kernel/setup.c     | 11 +++++++++++
 arch/x86/platform/efi/efi.c | 14 ++++++++------
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index f4b9b80..dad38ac 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1034,6 +1034,17 @@ void __init setup_arch(char **cmdline_p)
 	mcheck_init();
 
 	arch_init_ideal_nops();
+
+#ifdef CONFIG_EFI
+	/* Once setup is done above, disable efi_enabled on mismatched
+	 * firmware/kernel archtectures since there is no support for
+	 * runtime services.
+	 */
+	if (IS_ENABLED(CONFIG_X86_64) ^ efi_64bit) {
+		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
+		efi_enabled = 0;
+	}
+#endif
 }
 
 #ifdef CONFIG_X86_32
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 2dc29f5..17d7d50 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -69,11 +69,15 @@ EXPORT_SYMBOL(efi);
 struct efi_memory_map memmap;
 
 bool efi_64bit;
-static bool efi_native;
 
 static struct efi efi_phys __initdata;
 static efi_system_table_t efi_systab __initdata;
 
+static inline bool efi_is_native(void)
+{
+	return !(IS_ENABLED(CONFIG_X86_64) ^ efi_64bit);
+}
+
 static int __init setup_noefi(char *arg)
 {
 	efi_enabled = 0;
@@ -650,12 +654,10 @@ void __init efi_init(void)
 		return;
 	}
 	efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
-	efi_native = !efi_64bit;
 #else
 	efi_phys.systab = (efi_system_table_t *)
 			  (boot_params.efi_info.efi_systab |
 			  ((__u64)boot_params.efi_info.efi_systab_hi<<32));
-	efi_native = efi_64bit;
 #endif
 
 	if (efi_systab_init(efi_phys.systab)) {
@@ -689,7 +691,7 @@ void __init efi_init(void)
 	 * that doesn't match the kernel 32/64-bit mode.
 	 */
 
-	if (!efi_native)
+	if (!efi_is_native())
 		pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
 	else if (efi_runtime_init()) {
 		efi_enabled = 0;
@@ -700,7 +702,7 @@ void __init efi_init(void)
 		efi_enabled = 0;
 		return;
 	}
-	if (efi_native) {
+	if (efi_is_native()) {
 		x86_platform.get_wallclock = efi_get_time;
 		x86_platform.set_wallclock = efi_set_rtc_mmss;
 	}
@@ -765,7 +767,7 @@ void __init efi_enter_virtual_mode(void)
 	 * non-native EFI
 	 */
 
-	if (!efi_native)
+	if (!efi_is_native())
 		goto out;
 
 	/* Merge contiguous regions of the same type and attribute */
-- 
1.7.10.1.488.g05fbf7a


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2012-10-25 17:05 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-19 21:48 [PATCH] x86: efi: Turn off efi_enabled after setup on mixed fw/kernel Olof Johansson
2012-08-20  9:56 ` Matt Fleming
2012-08-20 10:13 ` Maarten Lankhorst
2012-08-20 21:59   ` Olof Johansson
2012-08-21 14:39     ` Matt Fleming
2012-08-21 14:53       ` H. Peter Anvin
2012-10-08 14:28 ` Matt Fleming
2012-10-24  6:24   ` [PATCH v2] " Olof Johansson
2012-10-24  8:40     ` Maarten Lankhorst
2012-10-24 15:21       ` Olof Johansson
2012-10-24 15:50         ` Maarten Lankhorst
2012-10-24 17:00     ` [PATCH v3] " Olof Johansson
2012-10-25 10:56       ` Matt Fleming
2012-10-25 13:20       ` Matt Fleming
2012-10-25 17:05         ` Olof Johansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).