Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46f4582e authored by Roy Franz's avatar Roy Franz Committed by Matt Fleming
Browse files

efi: Generalize handle_ramdisks() and rename to handle_cmdline_files().



The handle_cmdline_files now takes the option to handle as a string,
and returns the loaded data through parameters, rather than taking
an x86 specific setup_header structure.  For ARM, this will be used
to load a device tree blob in addition to initrd images.

Signed-off-by: default avatarRoy Franz <roy.franz@linaro.org>
Acked-by: default avatarMark Salter <msalter@redhat.com>
Reviewed-by: default avatarGrant Likely <grant.likely@linaro.org>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent 0e1cadb0
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -442,6 +442,8 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)
	u16 *s2;
	u8 *s1;
	int i;
	unsigned long ramdisk_addr;
	unsigned long ramdisk_size;

	sys_table = _table;

@@ -500,9 +502,14 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)

	memset(sdt, 0, sizeof(*sdt));

	status = handle_ramdisks(sys_table, image, hdr);
	status = handle_cmdline_files(sys_table, image,
				      (char *)(unsigned long)hdr->cmd_line_ptr,
				      "initrd=", hdr->initrd_addr_max,
				      &ramdisk_addr, &ramdisk_size);
	if (status != EFI_SUCCESS)
		goto fail2;
	hdr->ramdisk_image = ramdisk_addr;
	hdr->ramdisk_size = ramdisk_size;

	return boot_params;
fail2:
+30 −21
Original line number Diff line number Diff line
@@ -269,9 +269,12 @@ static void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
 * We only support loading an initrd from the same filesystem as the
 * kernel image.
 */
static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
					 efi_loaded_image_t *image,
				    struct setup_header *hdr)
					 char *cmd_line, char *option_string,
					 unsigned long max_addr,
					 unsigned long *load_addr,
					 unsigned long *load_size)
{
	struct initrd *initrds;
	unsigned long initrd_addr;
@@ -287,19 +290,25 @@ static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
	initrd_addr = 0;
	initrd_total = 0;

	str = (char *)(unsigned long)hdr->cmd_line_ptr;
	str = cmd_line;

	j = 0;			/* See close_handles */

	if (!load_addr || !load_size)
		return EFI_INVALID_PARAMETER;

	*load_addr = 0;
	*load_size = 0;

	if (!str || !*str)
		return EFI_SUCCESS;

	for (nr_initrds = 0; *str; nr_initrds++) {
		str = strstr(str, "initrd=");
		str = strstr(str, option_string);
		if (!str)
			break;

		str += 7;
		str += strlen(option_string);

		/* Skip any leading slashes */
		while (*str == '/' || *str == '\\')
@@ -317,11 +326,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
				nr_initrds * sizeof(*initrds),
				&initrds);
	if (status != EFI_SUCCESS) {
		efi_printk(sys_table_arg, "Failed to alloc mem for initrds\n");
		efi_printk(sys_table_arg, "Failed to alloc mem for file load\n");
		goto fail;
	}

	str = (char *)(unsigned long)hdr->cmd_line_ptr;
	str = cmd_line;
	for (i = 0; i < nr_initrds; i++) {
		struct initrd *initrd;
		efi_file_handle_t *h;
@@ -332,11 +341,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
		efi_char16_t *p;
		u64 file_sz;

		str = strstr(str, "initrd=");
		str = strstr(str, option_string);
		if (!str)
			break;

		str += 7;
		str += strlen(option_string);

		initrd = &initrds[i];
		p = filename_16;
@@ -382,7 +391,7 @@ static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
		status = efi_call_phys5(fh->open, fh, &h, filename_16,
					EFI_FILE_MODE_READ, (u64)0);
		if (status != EFI_SUCCESS) {
			efi_printk(sys_table_arg, "Failed to open initrd file: ");
			efi_printk(sys_table_arg, "Failed to open file: ");
			efi_char16_printk(sys_table_arg, filename_16);
			efi_printk(sys_table_arg, "\n");
			goto close_handles;
@@ -394,7 +403,7 @@ static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
		status = efi_call_phys4(h->get_info, h, &info_guid,
					&info_sz, NULL);
		if (status != EFI_BUFFER_TOO_SMALL) {
			efi_printk(sys_table_arg, "Failed to get initrd info size\n");
			efi_printk(sys_table_arg, "Failed to get file info size\n");
			goto close_handles;
		}

@@ -402,7 +411,7 @@ grow:
		status = efi_call_phys3(sys_table_arg->boottime->allocate_pool,
					EFI_LOADER_DATA, info_sz, &info);
		if (status != EFI_SUCCESS) {
			efi_printk(sys_table_arg, "Failed to alloc mem for initrd info\n");
			efi_printk(sys_table_arg, "Failed to alloc mem for file info\n");
			goto close_handles;
		}

@@ -418,7 +427,7 @@ grow:
		efi_call_phys1(sys_table_arg->boottime->free_pool, info);

		if (status != EFI_SUCCESS) {
			efi_printk(sys_table_arg, "Failed to get initrd info\n");
			efi_printk(sys_table_arg, "Failed to get file info\n");
			goto close_handles;
		}

@@ -435,14 +444,14 @@ grow:
		 * all the initrd's.
		 */
		status = efi_high_alloc(sys_table_arg, initrd_total, 0x1000,
				    &initrd_addr, hdr->initrd_addr_max);
				    &initrd_addr, max_addr);
		if (status != EFI_SUCCESS) {
			efi_printk(sys_table_arg, "Failed to alloc highmem for initrds\n");
			goto close_handles;
		}

		/* We've run out of free low memory. */
		if (initrd_addr > hdr->initrd_addr_max) {
		if (initrd_addr > max_addr) {
			efi_printk(sys_table_arg, "We've run out of free low memory\n");
			status = EFI_INVALID_PARAMETER;
			goto free_initrd_total;
@@ -463,7 +472,7 @@ grow:
							initrds[j].handle,
							&chunksize, addr);
				if (status != EFI_SUCCESS) {
					efi_printk(sys_table_arg, "Failed to read initrd\n");
					efi_printk(sys_table_arg, "Failed to read file\n");
					goto free_initrd_total;
				}
				addr += chunksize;
@@ -477,8 +486,8 @@ grow:

	efi_call_phys1(sys_table_arg->boottime->free_pool, initrds);

	hdr->ramdisk_image = initrd_addr;
	hdr->ramdisk_size = initrd_total;
	*load_addr = initrd_addr;
	*load_size = initrd_total;

	return status;

@@ -491,8 +500,8 @@ close_handles:
free_initrds:
	efi_call_phys1(sys_table_arg->boottime->free_pool, initrds);
fail:
	hdr->ramdisk_image = 0;
	hdr->ramdisk_size = 0;
	*load_addr = 0;
	*load_size = 0;

	return status;
}