diff options
| author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-09-11 19:42:00 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-09-12 05:40:57 -0400 |
| commit | 0ad5bce7409d681a5655c66e64bb0eb740b89c1f (patch) | |
| tree | 2dfda9205b3d920b45c90d710769d7c5c8c1201c /arch/x86/kernel | |
| parent | f461a1d80c865e5ec4d24107adbab8b010b60e32 (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>
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/setup.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 362d4e7f2d38..9838f2539dfc 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -670,6 +670,10 @@ void __init setup_arch(char **cmdline_p) | |||
| 670 | 670 | ||
| 671 | parse_early_param(); | 671 | parse_early_param(); |
| 672 | 672 | ||
| 673 | #ifdef CONFIG_X86_64 | ||
| 674 | check_efer(); | ||
| 675 | #endif | ||
| 676 | |||
| 673 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | 677 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) |
| 674 | /* | 678 | /* |
| 675 | * Must be before kernel pagetables are setup | 679 | * Must be before kernel pagetables are setup |
| @@ -738,7 +742,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 738 | #else | 742 | #else |
| 739 | num_physpages = max_pfn; | 743 | num_physpages = max_pfn; |
| 740 | 744 | ||
| 741 | check_efer(); | ||
| 742 | 745 | ||
| 743 | /* How many end-of-memory variables you have, grandma! */ | 746 | /* How many end-of-memory variables you have, grandma! */ |
| 744 | /* need this before calling reserve_initrd */ | 747 | /* need this before calling reserve_initrd */ |
