Commit 0ad5bce7 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

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-gec0c15af-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: default avatarRuss Anderson <rja@sgi.com>
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f461a1d8
...@@ -670,6 +670,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -670,6 +670,10 @@ void __init setup_arch(char **cmdline_p)
parse_early_param(); parse_early_param();
#ifdef CONFIG_X86_64
check_efer();
#endif
#if defined(CONFIG_VMI) && defined(CONFIG_X86_32) #if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
/* /*
* Must be before kernel pagetables are setup * Must be before kernel pagetables are setup
...@@ -738,7 +742,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -738,7 +742,6 @@ void __init setup_arch(char **cmdline_p)
#else #else
num_physpages = max_pfn; num_physpages = max_pfn;
check_efer();
/* How many end-of-memory variables you have, grandma! */ /* How many end-of-memory variables you have, grandma! */
/* need this before calling reserve_initrd */ /* need this before calling reserve_initrd */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment