Skip to content

Commit 5bc653b

Browse files
amlutoIngo Molnar
authored andcommitted
x86/efi: Allocate a trampoline if needed in efi_free_boot_services()
On my Dell XPS 13 9350 with firmware 1.4.4 and SGX on, if I boot Fedora 24's grub2-efi off a hard disk, my first 1MB of RAM looks like: efi: mem00: [Runtime Data |RUN| | | | | | | |WB|WT|WC|UC] range=[0x0000000000000000-0x0000000000000fff] (0MB) efi: mem01: [Boot Data | | | | | | | | |WB|WT|WC|UC] range=[0x0000000000001000-0x0000000000027fff] (0MB) efi: mem02: [Loader Data | | | | | | | | |WB|WT|WC|UC] range=[0x0000000000028000-0x0000000000029fff] (0MB) efi: mem03: [Reserved | | | | | | | | |WB|WT|WC|UC] range=[0x000000000002a000-0x000000000002bfff] (0MB) efi: mem04: [Runtime Data |RUN| | | | | | | |WB|WT|WC|UC] range=[0x000000000002c000-0x000000000002cfff] (0MB) efi: mem05: [Loader Data | | | | | | | | |WB|WT|WC|UC] range=[0x000000000002d000-0x000000000002dfff] (0MB) efi: mem06: [Conventional Memory| | | | | | | | |WB|WT|WC|UC] range=[0x000000000002e000-0x0000000000057fff] (0MB) efi: mem07: [Reserved | | | | | | | | |WB|WT|WC|UC] range=[0x0000000000058000-0x0000000000058fff] (0MB) efi: mem08: [Conventional Memory| | | | | | | | |WB|WT|WC|UC] range=[0x0000000000059000-0x000000000009ffff] (0MB) My EBDA is at 0x2c000, which blocks off everything from 0x2c000 and up, and my trampoline is 0x6000 bytes (6 pages), so it doesn't fit in the loader data range at 0x28000. Without this patch, it panics due to a failure to allocate the trampoline. With this patch, it works: [ +0.001744] Base memory trampoline at [ffff880000001000] 1000 size 24576 Signed-off-by: Andy Lutomirski <luto@kernel.org> Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mario Limonciello <mario_limonciello@dell.com> Cc: Matt Fleming <mfleming@suse.de> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/998c77b3bf709f3dfed85cb30701ed1a5d8a438b.1470821230.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent 5ff3e2c commit 5bc653b

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

arch/x86/platform/efi/quirks.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ void __init efi_free_boot_services(void)
254254
for_each_efi_memory_desc(md) {
255255
unsigned long long start = md->phys_addr;
256256
unsigned long long size = md->num_pages << EFI_PAGE_SHIFT;
257+
size_t rm_size;
257258

258259
if (md->type != EFI_BOOT_SERVICES_CODE &&
259260
md->type != EFI_BOOT_SERVICES_DATA)
@@ -263,6 +264,26 @@ void __init efi_free_boot_services(void)
263264
if (md->attribute & EFI_MEMORY_RUNTIME)
264265
continue;
265266

267+
/*
268+
* Nasty quirk: if all sub-1MB memory is used for boot
269+
* services, we can get here without having allocated the
270+
* real mode trampoline. It's too late to hand boot services
271+
* memory back to the memblock allocator, so instead
272+
* try to manually allocate the trampoline if needed.
273+
*
274+
* I've seen this on a Dell XPS 13 9350 with firmware
275+
* 1.4.4 with SGX enabled booting Linux via Fedora 24's
276+
* grub2-efi on a hard disk. (And no, I don't know why
277+
* this happened, but Linux should still try to boot rather
278+
* panicing early.)
279+
*/
280+
rm_size = real_mode_size_needed();
281+
if (rm_size && (start + rm_size) < (1<<20) && size >= rm_size) {
282+
set_real_mode_mem(start, rm_size);
283+
start += rm_size;
284+
size -= rm_size;
285+
}
286+
266287
free_bootmem_late(start, size);
267288
}
268289

0 commit comments

Comments
 (0)