diff options
authorJeremy Fitzhardinge <jeremy@goop.org>2008-09-11 16:42:00 -0700
committerIngo Molnar <mingo@elte.hu>2008-09-12 11:40:57 +0200
commit0ad5bce7409d681a5655c66e64bb0eb740b89c1f (patch)
parentf461a1d80c865e5ec4d24107adbab8b010b60e32 (diff)
x86: fix possible x86_64 and EFI regression
Russ Anderson reported a boot crash with EFI and latest mainline: BIOS-e820: 00000000fffa0000 - 00000000fffac000 (reserved) Pid: 0, comm: swapper Not tainted 2.6.27-rc5-00100-gec0c15a-dirty #5 Call Trace: [<ffffffff80849195>] early_idt_handler+0x55/0x69 [<ffffffff80313e52>] __memcpy+0x12/0xa4 [<ffffffff80859015>] efi_init+0xce/0x932 [<ffffffff80869c83>] setup_early_serial8250_console+0x2d/0x36a [<ffffffff80238688>] __insert_resource+0x18/0xc8 [<ffffffff8084f6de>] setup_arch+0x3a7/0x632 [<ffffffff808499ed>] start_kernel+0x91/0x367 [<ffffffff80849393>] x86_64_start_kernel+0xe3/0xe7 [<ffffffff808492b0>] x86_64_start_kernel+0x0/0xe7 RIP 0x10 Such a crash is possible if the CPU in this system is a 64-bit processor which doesn't support NX (ie, old Intel P4 -based64-bit processors). Certainly, if we support such processors, then we should start with _PAGE_NX initially clear in __supported_pte_flags, and then set it once we've established that the processor does indeed support NX. That will prevent early_ioremap - or anything else - from trying to set it. The simple fix is to simply call check_efer() earlier. Reported-by: Russ Anderson <rja@sgi.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 362d4e7f2d3..9838f2539df 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -670,6 +670,10 @@ void __init setup_arch(char **cmdline_p)
+#ifdef CONFIG_X86_64
+ check_efer();
#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
* Must be before kernel pagetables are setup
@@ -738,7 +742,6 @@ void __init setup_arch(char **cmdline_p)
num_physpages = max_pfn;
- check_efer();
/* How many end-of-memory variables you have, grandma! */
/* need this before calling reserve_initrd */