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

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
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -34,8 +34,6 @@ static inline bool efi_have_uv1_memmap(void)
#define EFI32_LOADER_SIGNATURE	"EL32"
#define EFI64_LOADER_SIGNATURE	"EL64"

#define MAX_CMDLINE_ADDRESS	UINT_MAX

#define ARCH_EFI_IRQ_FLAGS_MASK	X86_EFLAGS_IF

/*
+1 −1
Original line number Diff line number Diff line
@@ -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
	 * 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) {
		pr_efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n");
		status = EFI_OUT_OF_RESOURCES;
+2 −7
Original line number Diff line number Diff line
@@ -497,17 +497,13 @@ static u8 *efi_utf16_to_utf8(u8 *dst, const u16 *src, int n)
	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.
 * 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)
			  int *cmd_line_len, unsigned long max_addr)
{
	const u16 *s2;
	u8 *s1 = NULL;
@@ -535,8 +531,7 @@ char *efi_convert_cmdline(efi_loaded_image_t *image,

	options_bytes++;	/* NUL termination */

	status = efi_allocate_pages(options_bytes, &cmdline_addr,
				MAX_CMDLINE_ADDRESS);
	status = efi_allocate_pages(options_bytes, &cmdline_addr, max_addr);
	if (status != EFI_SUCCESS)
		return NULL;

+2 −1
Original line number Diff line number Diff line
@@ -578,7 +578,8 @@ void efi_printk(char *str);

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);

+3 −2
Original line number Diff line number Diff line
@@ -405,7 +405,8 @@ 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);
	cmdline_ptr = efi_convert_cmdline(image, &options_size,
					  above4g ? ULONG_MAX : UINT_MAX);
	if (!cmdline_ptr)
		goto fail;

@@ -445,7 +446,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
	/* not reached */

fail2:
	efi_free(options_size, hdr->cmd_line_ptr);
	efi_free(options_size, (unsigned long)cmdline_ptr);
fail:
	efi_free(0x4000, (unsigned long)boot_params);