efi, x86: Pass a proper identity mapping in efi_call_phys_prelog
commit
b8f2c21db390273c3eaf0e5308faeaeb1e233840 upstream.
Update efi_call_phys_prelog to install an identity mapping of all available
memory. This corrects a bug on very large systems with more then 512 GB in
which bios would not be able to access addresses above not in the mapping.
The result is a crash that looks much like this.
BUG: unable to handle kernel paging request at
000000effd870020
IP: [<
0000000078bce331>] 0x78bce330
PGD 0
Oops: 0000 [#1] SMP
Modules linked in:
CPU 0
Pid: 0, comm: swapper/0 Tainted: G W 3.8.0-rc1-next-
20121224-medusa_ntz+ #2 Intel Corp. Stoutland Platform
RIP: 0010:[<
0000000078bce331>] [<
0000000078bce331>] 0x78bce330
RSP: 0000:
ffffffff81601d28 EFLAGS:
00010006
RAX:
0000000078b80e18 RBX:
0000000000000004 RCX:
0000000000000004
RDX:
0000000078bcf958 RSI:
0000000000002400 RDI:
8000000000000000
RBP:
0000000078bcf760 R08:
000000effd870000 R09:
0000000000000000
R10:
0000000000000000 R11:
00000000000000c3 R12:
0000000000000030
R13:
000000effd870000 R14:
0000000000000000 R15:
ffff88effd870000
FS:
0000000000000000(0000) GS:
ffff88effe400000(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
000000effd870020 CR3:
000000000160c000 CR4:
00000000000006b0
DR0:
0000000000000000 DR1:
0000000000000000 DR2:
0000000000000000
DR3:
0000000000000000 DR6:
00000000ffff0ff0 DR7:
0000000000000400
Process swapper/0 (pid: 0, threadinfo
ffffffff81600000, task
ffffffff81614400)
Stack:
0000000078b80d18 0000000000000004 0000000078bced7b ffff880078b81fff
0000000000000000 0000000000000082 0000000078bce3a8 0000000000002400
0000000060000202 0000000078b80da0 0000000078bce45d ffffffff8107cb5a
Call Trace:
[<
ffffffff8107cb5a>] ? on_each_cpu+0x77/0x83
[<
ffffffff8102f4eb>] ? change_page_attr_set_clr+0x32f/0x3ed
[<
ffffffff81035946>] ? efi_call4+0x46/0x80
[<
ffffffff816c5abb>] ? efi_enter_virtual_mode+0x1f5/0x305
[<
ffffffff816aeb24>] ? start_kernel+0x34a/0x3d2
[<
ffffffff816ae5ed>] ? repair_env_string+0x60/0x60
[<
ffffffff816ae2be>] ? x86_64_start_reservations+0xba/0xc1
[<
ffffffff816ae120>] ? early_idt_handlers+0x120/0x120
[<
ffffffff816ae419>] ? x86_64_start_kernel+0x154/0x163
Code: Bad RIP value.
RIP [<
0000000078bce331>] 0x78bce330
RSP <
ffffffff81601d28>
CR2:
000000effd870020
---[ end trace
ead828934fef5eab ]---
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Nathan Zimmer <nzimmer@sgi.com>
Signed-off-by: Robin Holt <holt@sgi.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>