efi/libstub/x86: Permit bootparams struct to be allocated above 4 GB
authorArd Biesheuvel <ardb@kernel.org>
Mon, 10 Feb 2020 16:02:39 +0000 (17:02 +0100)
committerArd Biesheuvel <ardb@kernel.org>
Sun, 23 Feb 2020 20:57:15 +0000 (21:57 +0100)
We now support bootparams structures that are located in memory that
is not 32-bit addressable, so relax the allocation limit on systems
where this feature is enabled.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
drivers/firmware/efi/libstub/x86-stub.c

index 7e7c50883cce8d7cb553da06665e0c782b5977d6..9d60352baa0fa26d287fd639a8ce84bf6f276a3b 100644 (file)
@@ -363,6 +363,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
        char *cmdline_ptr;
        unsigned long ramdisk_addr;
        unsigned long ramdisk_size;
+       bool above4g;
 
        sys_table = sys_table_arg;
 
@@ -376,7 +377,11 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
                return status;
        }
 
-       status = efi_low_alloc(0x4000, 1, (unsigned long *)&boot_params);
+       hdr = &((struct boot_params *)image->image_base)->hdr;
+       above4g = hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G;
+
+       status = efi_allocate_pages(0x4000, (unsigned long *)&boot_params,
+                                   above4g ? ULONG_MAX : UINT_MAX);
        if (status != EFI_SUCCESS) {
                efi_printk("Failed to allocate lowmem for boot params\n");
                return status;