efi/libstub: Add limit argument to efi_random_alloc()
authorArd Biesheuvel <ardb@kernel.org>
Mon, 7 Aug 2023 16:27:18 +0000 (18:27 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 7 Aug 2023 19:01:46 +0000 (21:01 +0200)
x86 will need to limit the kernel memory allocation to the lowest 512
MiB of memory, to match the behavior of the existing bare metal KASLR
physical randomization logic. So in preparation for that, add a limit
parameter to efi_random_alloc() and wire it up.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20230807162720.545787-22-ardb@kernel.org
drivers/firmware/efi/libstub/arm64-stub.c
drivers/firmware/efi/libstub/efistub.h
drivers/firmware/efi/libstub/randomalloc.c
drivers/firmware/efi/libstub/zboot.c

index 770b8ecb73984c6115a5c37e2105637d4ec9bfd6..8c40fc89f5f992092955919f4481d6dbdd0078e9 100644 (file)
@@ -106,7 +106,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
                 */
                status = efi_random_alloc(*reserve_size, min_kimg_align,
                                          reserve_addr, phys_seed,
-                                         EFI_LOADER_CODE);
+                                         EFI_LOADER_CODE, EFI_ALLOC_LIMIT);
                if (status != EFI_SUCCESS)
                        efi_warn("efi_random_alloc() failed: 0x%lx\n", status);
        } else {
index 06b7abc92ced9e189b64f4b8030a5a1fe0825991..9823f6fb3e01f71878e9d1179bd3eee971955692 100644 (file)
@@ -956,7 +956,7 @@ efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
 
 efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
                              unsigned long *addr, unsigned long random_seed,
-                             int memory_type);
+                             int memory_type, unsigned long alloc_limit);
 
 efi_status_t efi_random_get_seed(void);
 
index 32c7a54923b4c1273feee1db101accd48083256c..674a064b8f7adc68edf2412bb8e012250077c717 100644 (file)
@@ -16,7 +16,8 @@
  */
 static unsigned long get_entry_num_slots(efi_memory_desc_t *md,
                                         unsigned long size,
-                                        unsigned long align_shift)
+                                        unsigned long align_shift,
+                                        u64 alloc_limit)
 {
        unsigned long align = 1UL << align_shift;
        u64 first_slot, last_slot, region_end;
@@ -29,7 +30,7 @@ static unsigned long get_entry_num_slots(efi_memory_desc_t *md,
                return 0;
 
        region_end = min(md->phys_addr + md->num_pages * EFI_PAGE_SIZE - 1,
-                        (u64)EFI_ALLOC_LIMIT);
+                        alloc_limit);
        if (region_end < size)
                return 0;
 
@@ -54,7 +55,8 @@ efi_status_t efi_random_alloc(unsigned long size,
                              unsigned long align,
                              unsigned long *addr,
                              unsigned long random_seed,
-                             int memory_type)
+                             int memory_type,
+                             unsigned long alloc_limit)
 {
        unsigned long total_slots = 0, target_slot;
        unsigned long total_mirrored_slots = 0;
@@ -76,7 +78,7 @@ efi_status_t efi_random_alloc(unsigned long size,
                efi_memory_desc_t *md = (void *)map->map + map_offset;
                unsigned long slots;
 
-               slots = get_entry_num_slots(md, size, ilog2(align));
+               slots = get_entry_num_slots(md, size, ilog2(align), alloc_limit);
                MD_NUM_SLOTS(md) = slots;
                total_slots += slots;
                if (md->attribute & EFI_MEMORY_MORE_RELIABLE)
index e5d7fa1f1d8fd1602c86e2e39bddfd3fb672ddfa..bdb17eac0cb401befbcc8b13820f9a3b416b6f19 100644 (file)
@@ -119,7 +119,7 @@ efi_zboot_entry(efi_handle_t handle, efi_system_table_t *systab)
                }
 
                status = efi_random_alloc(alloc_size, min_kimg_align, &image_base,
-                                         seed, EFI_LOADER_CODE);
+                                         seed, EFI_LOADER_CODE, EFI_ALLOC_LIMIT);
                if (status != EFI_SUCCESS) {
                        efi_err("Failed to allocate memory\n");
                        goto free_cmdline;