Commit 216705d2 authored by Hugh Dickins's avatar Hugh Dickins Committed by Ingo Molnar

x86: fix Intel Mac booting with EFI

Fedora reports that mem_init()'s zap_low_mappings(), extended to SMP in
61165d7a x86: fix app crashes after SMP
resume causes 32-bit Intel Mac machines to reboot very early when
booting with EFI.

The EFI code appears to manage low mappings for itself when needed; but
like many before it, confuses PSE with PAE.  So it has only been mapping
half the space it needed when PSE but not PAE.  This remained unnoticed
until we moved the SMP zap_low_mappings() before
efi_enter_virtual_mode().  Presumably could have been noticed years ago
if anyone ran a UP kernel on such machines?
Reported-by: default avatarPeter Jones <pjones@redhat.com>
Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
Cc: Peter Jones <pjones@redhat.com>
Cc: Glauber Costa <gcosta@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Tested-by: default avatarPeter Jones <pjones@redhat.com>
parent efac4189
...@@ -49,13 +49,13 @@ void efi_call_phys_prelog(void) ...@@ -49,13 +49,13 @@ void efi_call_phys_prelog(void)
local_irq_save(efi_rt_eflags); local_irq_save(efi_rt_eflags);
/* /*
* If I don't have PSE, I should just duplicate two entries in page * If I don't have PAE, I should just duplicate two entries in page
* directory. If I have PSE, I just need to duplicate one entry in * directory. If I have PAE, I just need to duplicate one entry in
* page directory. * page directory.
*/ */
cr4 = read_cr4(); cr4 = read_cr4();
if (cr4 & X86_CR4_PSE) { if (cr4 & X86_CR4_PAE) {
efi_bak_pg_dir_pointer[0].pgd = efi_bak_pg_dir_pointer[0].pgd =
swapper_pg_dir[pgd_index(0)].pgd; swapper_pg_dir[pgd_index(0)].pgd;
swapper_pg_dir[0].pgd = swapper_pg_dir[0].pgd =
...@@ -93,7 +93,7 @@ void efi_call_phys_epilog(void) ...@@ -93,7 +93,7 @@ void efi_call_phys_epilog(void)
cr4 = read_cr4(); cr4 = read_cr4();
if (cr4 & X86_CR4_PSE) { if (cr4 & X86_CR4_PAE) {
swapper_pg_dir[pgd_index(0)].pgd = swapper_pg_dir[pgd_index(0)].pgd =
efi_bak_pg_dir_pointer[0].pgd; efi_bak_pg_dir_pointer[0].pgd;
} else { } else {
......
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