On 2/14/19 8:56 AM, AKASHI Takahiro wrote: > In this patch, do_bootefi() will be reworked, without any functional > change, as it is a bit sloppy after Heinrich's "efi_loader: rework > loading and starting of images." > > Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> > --- > cmd/bootefi.c | 101 ++++++++++++++++++++++++++------------------------ > 1 file changed, 52 insertions(+), 49 deletions(-)
I agree that cmd/bootefi.c is not very easy to read. We just went through a refactoring by Simon in v2019.01. - With your proposal the total code does not get any shorter. - The function modules do not get shorter. - No bug is resolved. I tend to revisit this after switching both the bootmgr and the non-bootmgr paths to call LoadImage() and relying on Exit() to clean up the image. > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > index e064edcd0cdb..159dc1ab8a30 100644 > --- a/cmd/bootefi.c > +++ b/cmd/bootefi.c > @@ -361,34 +361,68 @@ err_add_protocol: > return ret; > } > > -static int do_bootefi_bootmgr_exec(void) > +static int do_bootefi_load_and_exec(const char *arg) > { > - struct efi_device_path *device_path, *file_path; > - void *addr; > + void *image_buf; > + struct efi_device_path *device_path, *image_path; > + const char *saddr; > + unsigned long addr, size; Please, use a pointer when referring to an address in memory and size_t when referring to the difference between two pointers. Outside of GCC there is no rule requiring unsigned long to have the size of a pointer. > efi_status_t r; > > - addr = efi_bootmgr_load(&device_path, &file_path); > - if (!addr) > - return 1; > + if (!strcmp(arg, "bootmgr")) { > + image_buf = efi_bootmgr_load(&device_path, &image_path); > + if (!image_buf) > + return CMD_RET_FAILURE; > + > + addr = map_to_sysmem(image_buf); > + } else > +#ifdef CONFIG_CMD_BOOTEFI_HELLO > + if (!strcmp(arg, "hello")) { > + saddr = env_get("loadaddr"); > + size = __efi_helloworld_end - __efi_helloworld_begin; > + > + if (saddr) > + addr = simple_strtoul(saddr, NULL, 16); > + else > + addr = CONFIG_SYS_LOAD_ADDR; > + > + image_buf = map_sysmem(addr, size); > + memcpy(image_buf, __efi_helloworld_begin, size); > + > + device_path = NULL; > + image_path = NULL; > + } else/a > +#endif > + { > + saddr = arg; > + size = 0; > + > + addr = simple_strtoul(saddr, NULL, 16); > + /* Check that a numeric value was passed */ > + if (!addr && *saddr != '0') > + return CMD_RET_USAGE; > + > + image_buf = map_sysmem(addr, size); > + > + device_path = bootefi_device_path; > + image_path = bootefi_image_path; > + } > > - printf("## Starting EFI application at %p ...\n", addr); > - r = do_bootefi_exec(addr, device_path, file_path); > - printf("## Application terminated, r = %lu\n", > - r & ~EFI_ERROR_MASK); > + printf("## Starting EFI application at %08lx ...\n", addr); Can we be sure we will never load above 4 GiB? Using %p is a better choice. > + r = do_bootefi_exec(image_buf, device_path, image_path); > + printf("## Application terminated, r = %lu\n", r & ~EFI_ERROR_MASK); > > if (r != EFI_SUCCESS) > - return 1; > + return CMD_RET_FAILURE; That's the style I prefer (and Simon dislikes). > > - return 0; > + return CMD_RET_SUCCESS; Best regards Heinrich > } > > /* Interpreter command to boot an arbitrary EFI image from memory */ > static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const > argv[]) > { > - unsigned long addr; > - char *saddr; > - efi_status_t r; > unsigned long fdt_addr; > + efi_status_t r; > > /* Allow unaligned memory access */ > allow_unaligned(); > @@ -421,18 +455,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > efi_install_configuration_table(&efi_guid_fdt, NULL); > printf("WARNING: booting without device tree\n"); > } > -#ifdef CONFIG_CMD_BOOTEFI_HELLO > - if (!strcmp(argv[1], "hello")) { > - ulong size = __efi_helloworld_end - __efi_helloworld_begin; > > - saddr = env_get("loadaddr"); > - if (saddr) > - addr = simple_strtoul(saddr, NULL, 16); > - else > - addr = CONFIG_SYS_LOAD_ADDR; > - memcpy(map_sysmem(addr, size), __efi_helloworld_begin, size); > - } else > -#endif > #ifdef CONFIG_CMD_BOOTEFI_SELFTEST > if (!strcmp(argv[1], "selftest")) { > struct efi_loaded_image_obj *image_obj; > @@ -447,30 +470,10 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > r = efi_selftest(&image_obj->header, &systab); > bootefi_run_finish(image_obj, loaded_image_info); > return r != EFI_SUCCESS; > - } else > -#endif > - if (!strcmp(argv[1], "bootmgr")) { > - return do_bootefi_bootmgr_exec(); > - } else { > - saddr = argv[1]; > - > - addr = simple_strtoul(saddr, NULL, 16); > - /* Check that a numeric value was passed */ > - if (!addr && *saddr != '0') > - return CMD_RET_USAGE; > - > } > +#endif > > - printf("## Starting EFI application at %08lx ...\n", addr); > - r = do_bootefi_exec(map_sysmem(addr, 0), bootefi_device_path, > - bootefi_image_path); > - printf("## Application terminated, r = %lu\n", > - r & ~EFI_ERROR_MASK); > - > - if (r != EFI_SUCCESS) > - return 1; > - else > - return 0; > + return do_bootefi_load_and_exec(argv[1]); > } > > #ifdef CONFIG_SYS_LONGHELP > @@ -489,7 +492,7 @@ static char bootefi_help_text[] = > " Use environment variable efi_selftest to select a single test.\n" > " Use 'setenv efi_selftest list' to enumerate all tests.\n" > #endif > - "bootefi bootmgr [fdt addr]\n" > + "bootefi bootmgr [fdt address]\n" > " - load and boot EFI payload based on BootOrder/BootXXXX variables.\n" > "\n" > " If specified, the device tree located at <fdt address> gets\n" > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot