efi/libstub: Use pool allocation for the command line
authorArd Biesheuvel <ardb@kernel.org>
Tue, 19 May 2020 08:43:01 +0000 (10:43 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Fri, 22 May 2020 15:05:08 +0000 (17:05 +0200)
Now that we removed the memory limit for the allocation of the
command line, there is no longer a need to use the page based
allocator so switch to a pool allocation instead.

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

index dbfaf8d..89f0752 100644 (file)
@@ -212,8 +212,7 @@ efi_status_t efi_parse_options(char const *cmdline)
  * Size of memory allocated return in *cmd_line_len.
  * Returns NULL on error.
  */
-char *efi_convert_cmdline(efi_loaded_image_t *image,
-                         int *cmd_line_len, unsigned long max_addr)
+char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len)
 {
        const u16 *s2;
        unsigned long cmdline_addr = 0;
@@ -275,7 +274,8 @@ char *efi_convert_cmdline(efi_loaded_image_t *image,
 
        options_bytes++;        /* NUL termination */
 
-       status = efi_allocate_pages(options_bytes, &cmdline_addr, max_addr);
+       status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, options_bytes,
+                            (void **)&cmdline_addr);
        if (status != EFI_SUCCESS)
                return NULL;
 
index c2484bf..cc8d6f5 100644 (file)
@@ -198,7 +198,7 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
         * protocol. We are going to copy the command line into the
         * device tree, so this can be allocated anywhere.
         */
-       cmdline_ptr = efi_convert_cmdline(image, &cmdline_size, ULONG_MAX);
+       cmdline_ptr = efi_convert_cmdline(image, &cmdline_size);
        if (!cmdline_ptr) {
                efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n");
                status = EFI_OUT_OF_RESOURCES;
@@ -339,7 +339,7 @@ fail_free_image:
 fail_free_screeninfo:
        free_screen_info(si);
 fail_free_cmdline:
-       efi_free(cmdline_size, (unsigned long)cmdline_ptr);
+       efi_bs_call(free_pool, cmdline_ptr);
 fail:
        return status;
 }
index ad7e040..1de8dc0 100644 (file)
@@ -708,8 +708,7 @@ __printf(1, 2) int efi_printk(char const *fmt, ...);
 
 void efi_free(unsigned long size, unsigned long addr);
 
-char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len,
-                         unsigned long max_addr);
+char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
 
 efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
 
index 37154bb..072b7cf 100644 (file)
@@ -404,7 +404,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
        hdr->type_of_loader = 0x21;
 
        /* Convert unicode cmdline to ascii */
-       cmdline_ptr = efi_convert_cmdline(image, &options_size, ULONG_MAX);
+       cmdline_ptr = efi_convert_cmdline(image, &options_size);
        if (!cmdline_ptr)
                goto fail;