Commit 1e45bf73 authored by Ard Biesheuvel's avatar Ard Biesheuvel

efi/libstub/x86: Permit cmdline data to be allocated above 4 GB

We now support cmdline data that is located in memory that is not
32-bit addressable, so relax the allocation limit on systems where
this feature is enabled.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 8166ec09
...@@ -34,8 +34,6 @@ static inline bool efi_have_uv1_memmap(void) ...@@ -34,8 +34,6 @@ static inline bool efi_have_uv1_memmap(void)
#define EFI32_LOADER_SIGNATURE "EL32" #define EFI32_LOADER_SIGNATURE "EL32"
#define EFI64_LOADER_SIGNATURE "EL64" #define EFI64_LOADER_SIGNATURE "EL64"
#define MAX_CMDLINE_ADDRESS UINT_MAX
#define ARCH_EFI_IRQ_FLAGS_MASK X86_EFLAGS_IF #define ARCH_EFI_IRQ_FLAGS_MASK X86_EFLAGS_IF
/* /*
......
...@@ -169,7 +169,7 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg) ...@@ -169,7 +169,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 * protocol. We are going to copy the command line into the
* device tree, so this can be allocated anywhere. * device tree, so this can be allocated anywhere.
*/ */
cmdline_ptr = efi_convert_cmdline(image, &cmdline_size); cmdline_ptr = efi_convert_cmdline(image, &cmdline_size, ULONG_MAX);
if (!cmdline_ptr) { if (!cmdline_ptr) {
pr_efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n"); pr_efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n");
status = EFI_OUT_OF_RESOURCES; status = EFI_OUT_OF_RESOURCES;
......
...@@ -497,17 +497,13 @@ static u8 *efi_utf16_to_utf8(u8 *dst, const u16 *src, int n) ...@@ -497,17 +497,13 @@ static u8 *efi_utf16_to_utf8(u8 *dst, const u16 *src, int n)
return dst; return dst;
} }
#ifndef MAX_CMDLINE_ADDRESS
#define MAX_CMDLINE_ADDRESS ULONG_MAX
#endif
/* /*
* Convert the unicode UEFI command line to ASCII to pass to kernel. * Convert the unicode UEFI command line to ASCII to pass to kernel.
* Size of memory allocated return in *cmd_line_len. * Size of memory allocated return in *cmd_line_len.
* Returns NULL on error. * Returns NULL on error.
*/ */
char *efi_convert_cmdline(efi_loaded_image_t *image, char *efi_convert_cmdline(efi_loaded_image_t *image,
int *cmd_line_len) int *cmd_line_len, unsigned long max_addr)
{ {
const u16 *s2; const u16 *s2;
u8 *s1 = NULL; u8 *s1 = NULL;
...@@ -535,8 +531,7 @@ char *efi_convert_cmdline(efi_loaded_image_t *image, ...@@ -535,8 +531,7 @@ char *efi_convert_cmdline(efi_loaded_image_t *image,
options_bytes++; /* NUL termination */ options_bytes++; /* NUL termination */
status = efi_allocate_pages(options_bytes, &cmdline_addr, status = efi_allocate_pages(options_bytes, &cmdline_addr, max_addr);
MAX_CMDLINE_ADDRESS);
if (status != EFI_SUCCESS) if (status != EFI_SUCCESS)
return NULL; return NULL;
......
...@@ -578,7 +578,8 @@ void efi_printk(char *str); ...@@ -578,7 +578,8 @@ void efi_printk(char *str);
void efi_free(unsigned long size, unsigned long addr); void efi_free(unsigned long size, unsigned long addr);
char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len); char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len,
unsigned long max_addr);
efi_status_t efi_get_memory_map(struct efi_boot_memmap *map); efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
......
...@@ -405,7 +405,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, ...@@ -405,7 +405,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
hdr->type_of_loader = 0x21; hdr->type_of_loader = 0x21;
/* Convert unicode cmdline to ascii */ /* Convert unicode cmdline to ascii */
cmdline_ptr = efi_convert_cmdline(image, &options_size); cmdline_ptr = efi_convert_cmdline(image, &options_size,
above4g ? ULONG_MAX : UINT_MAX);
if (!cmdline_ptr) if (!cmdline_ptr)
goto fail; goto fail;
...@@ -445,7 +446,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, ...@@ -445,7 +446,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
/* not reached */ /* not reached */
fail2: fail2:
efi_free(options_size, hdr->cmd_line_ptr); efi_free(options_size, (unsigned long)cmdline_ptr);
fail: fail:
efi_free(0x4000, (unsigned long)boot_params); efi_free(0x4000, (unsigned long)boot_params);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment