From 7ea79e511d308fb8aea4189d1617ee59887d3807 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Fri, 29 Apr 2022 07:15:04 +0200 Subject: [PATCH 1/6] efi_loader: don't call log with __func__ as parameter The log functions print file name, line number, and function name if selected via the log command or customizing. Don't print the function name twice. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_bootmgr.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 8c04ecbdc8..d1c14f1bbc 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -70,8 +70,8 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, if (lo.attributes & LOAD_OPTION_ACTIVE) { u32 attributes; - log_debug("%s: trying to load \"%ls\" from %pD\n", - __func__, lo.label, lo.file_path); + log_debug("trying to load \"%ls\" from %pD\n", lo.label, + lo.file_path); ret = EFI_CALL(efi_load_image(true, efi_root, lo.file_path, NULL, 0, handle)); @@ -187,8 +187,7 @@ efi_status_t efi_bootmgr_load(efi_handle_t *handle, void **load_options) num = size / sizeof(uint16_t); for (i = 0; i < num; i++) { - log_debug("%s trying to load Boot%04X\n", __func__, - bootorder[i]); + log_debug("trying to load Boot%04X\n", bootorder[i]); ret = try_load_entry(bootorder[i], handle, load_options); if (ret == EFI_SUCCESS) break; From dd1086ac6bda9d464abc9be6a7e24a843b9bf30b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Mon, 25 Apr 2022 23:21:20 +0200 Subject: [PATCH 2/6] efi: fix devpath_is_partition() If the path consists only of an end node, it does not refer to a partition. Avoid returning a random value from the stack in this case. Signed-off-by: Heinrich Schuchardt --- lib/efi/efi_app.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c index 1e5606c7b8..2209410f35 100644 --- a/lib/efi/efi_app.c +++ b/lib/efi/efi_app.c @@ -190,7 +190,7 @@ static void free_memory(struct efi_priv *priv) static bool devpath_is_partition(const struct efi_device_path *path) { const struct efi_device_path *p; - bool was_part; + bool was_part = false; for (p = path; p->type != DEVICE_PATH_TYPE_END; p = (void *)p + p->length) { From 4f419960bff5bbc646e28da3f8c953455319ea16 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Mon, 25 Apr 2022 23:35:01 +0200 Subject: [PATCH 3/6] efi_loader: simplify try_load_entry() Use function efi_create_indexed_name() to create the BootXXXX variable name. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_bootmgr.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index d1c14f1bbc..52bea4d541 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -46,16 +46,12 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, void **load_options) { struct efi_load_option lo; - u16 varname[] = u"Boot0000"; - u16 hexmap[] = u"0123456789ABCDEF"; + u16 varname[9]; void *load_option; efi_uintn_t size; efi_status_t ret; - varname[4] = hexmap[(n & 0xf000) >> 12]; - varname[5] = hexmap[(n & 0x0f00) >> 8]; - varname[6] = hexmap[(n & 0x00f0) >> 4]; - varname[7] = hexmap[(n & 0x000f) >> 0]; + efi_create_indexed_name(varname, sizeof(varname), "Boot", n); load_option = efi_get_var(varname, &efi_global_variable_guid, &size); if (!load_option) From 8da26f51569aa3f9b6a0be49058399a0a036c14a Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Mon, 25 Apr 2022 23:54:48 +0200 Subject: [PATCH 4/6] efi_loader: simplify efi_add_conventional_memory_map() Remove redundant constraint. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c index 1c51a3fc45..e048a545e4 100644 --- a/lib/efi_loader/efi_memory.c +++ b/lib/efi_loader/efi_memory.c @@ -771,7 +771,7 @@ efi_status_t efi_add_conventional_memory_map(u64 ram_start, u64 ram_end, /* ram_top is before this region, reserve all */ efi_add_memory_map_pg(ram_start, pages, EFI_BOOT_SERVICES_DATA, true); - } else if ((ram_top >= ram_start) && (ram_top < ram_end)) { + } else if (ram_top < ram_end) { /* ram_top is inside this region, reserve parts */ pages = (ram_end - ram_top) >> EFI_PAGE_SHIFT; From 6c640422baa46c5061efa5d2ff1b386bca72253c Mon Sep 17 00:00:00 2001 From: AKASHI Takahiro Date: Thu, 28 Apr 2022 13:49:16 +0900 Subject: [PATCH 5/6] efi_loader: disk: allow blk devices even without UCLASS_PARTITION While GPT partition is mandated in UEFI specification, CONFIG_PARTITION is seen optional under the current implementation. So modify efi_disk_rw_blocks() to allow accepting UCLASS_BLK devices. Fixes: commit d97e98c887ed ("efi_loader: disk: use udevice instead of blk_desc") Signed-off-by: AKASHI Takahiro Reviewed-by: Heinrich Schuchardt Tested-by: Mark Kettenis --- lib/efi_loader/efi_disk.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 8fb5b2363c..f5b462fb16 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -99,21 +99,22 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this, if (buffer_size & (blksz - 1)) return EFI_BAD_BUFFER_SIZE; -#if CONFIG_IS_ENABLED(PARTITIONS) - if (direction == EFI_DISK_READ) - n = dev_read(diskobj->dev, lba, blocks, buffer); - else - n = dev_write(diskobj->dev, lba, blocks, buffer); -#else - /* dev is always a block device (UCLASS_BLK) */ - struct blk_desc *desc; + if (CONFIG_IS_ENABLED(PARTITIONS) && + device_get_uclass_id(diskobj->dev) == UCLASS_PARTITION) { + if (direction == EFI_DISK_READ) + n = dev_read(diskobj->dev, lba, blocks, buffer); + else + n = dev_write(diskobj->dev, lba, blocks, buffer); + } else { + /* dev is a block device (UCLASS_BLK) */ + struct blk_desc *desc; - desc = dev_get_uclass_plat(diskobj->dev); - if (direction == EFI_DISK_READ) - n = blk_dread(desc, lba, blocks, buffer); - else - n = blk_dwrite(desc, lba, blocks, buffer); -#endif + desc = dev_get_uclass_plat(diskobj->dev); + if (direction == EFI_DISK_READ) + n = blk_dread(desc, lba, blocks, buffer); + else + n = blk_dwrite(desc, lba, blocks, buffer); + } /* We don't do interrupts, so check for timers cooperatively */ efi_timer_check(); From 5e847f7729b3cc34b572b4f59ee7d468b3b76ccc Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Thu, 28 Apr 2022 06:30:30 +0000 Subject: [PATCH 6/6] efi_loader: call efi_init_early() earlier efi_init_early() creates an event hook for block device probing. It has to be called before any block device is probed. Signed-off-by: Heinrich Schuchardt --- common/board_r.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/board_r.c b/common/board_r.c index ff17720cf3..93c9c2e50d 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -693,6 +693,9 @@ static init_fnc_t init_sequence_r[] = { /* initialize higher level parts of CPU like time base and timers */ cpu_init_r, #endif +#ifdef CONFIG_EFI_SETUP_EARLY + efi_init_early, +#endif #ifdef CONFIG_CMD_NAND initr_nand, #endif @@ -792,9 +795,6 @@ static init_fnc_t init_sequence_r[] = { #endif #if defined(CONFIG_PRAM) initr_mem, -#endif -#ifdef CONFIG_EFI_SETUP_EARLY - efi_init_early, #endif run_main_loop, };