Commit 5bc653b7318217c54244a14f248f1f07abe0a865

Authored by Andy Lutomirski
Committed by Ingo Molnar
1 parent 5ff3e2c3c3

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>

Showing 1 changed file with 21 additions and 0 deletions Side-by-side Diff

arch/x86/platform/efi/quirks.c
... ... @@ -254,6 +254,7 @@
254 254 for_each_efi_memory_desc(md) {
255 255 unsigned long long start = md->phys_addr;
256 256 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT;
  257 + size_t rm_size;
257 258  
258 259 if (md->type != EFI_BOOT_SERVICES_CODE &&
259 260 md->type != EFI_BOOT_SERVICES_DATA)
... ... @@ -262,6 +263,26 @@
262 263 /* Do not free, someone else owns it: */
263 264 if (md->attribute & EFI_MEMORY_RUNTIME)
264 265 continue;
  266 +
  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 + }
265 286  
266 287 free_bootmem_late(start, size);
267 288 }