summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-12-04 10:01:48 -0500
committerTom Rini <trini@konsulko.com>2022-12-04 10:01:48 -0500
commitd2c5607edde2544e059fa871927877213f6bd532 (patch)
treee57d7db3425ccc950a1b0d5f3d4332eb7be84d54 /cmd
parenta32f6341ccf2ea69f64fe87b9d07fd87325a2056 (diff)
parent30124c2bb96decd737963c043b26407791859faf (diff)
Merge tag 'efi-2023-01-rc3' of https://source.denx.de/u-boot/custodians/u-boot-efi
Pull request for efi-2023-01-rc3 Documentation: * describe DM firmware needed for j721e_evm * describe management of UEFI security data base with eficonfig UEFI: * code clean-up for eficonfig command * fix handling of DHCP aknowledge * correct EFI memory type used for U-Boot code * unit test for FatToStr() truncation * add an EFI binary to print boot hart ID Other: * improve parameter checks in console functions * fix variable initialization in blk_get_device_part_str
Diffstat (limited to 'cmd')
-rw-r--r--cmd/eficonfig.c146
-rw-r--r--cmd/efidebug.c25
2 files changed, 121 insertions, 50 deletions
diff --git a/cmd/eficonfig.c b/cmd/eficonfig.c
index 97d35597a22..394ae67ccea 100644
--- a/cmd/eficonfig.c
+++ b/cmd/eficonfig.c
@@ -452,8 +452,7 @@ struct efi_device_path *eficonfig_create_device_path(struct efi_device_path *dp_
struct efi_device_path *dp;
struct efi_device_path_file_path *fp;
- fp_size = sizeof(struct efi_device_path) +
- ((u16_strlen(current_path) + 1) * sizeof(u16));
+ fp_size = sizeof(struct efi_device_path) + u16_strsize(current_path);
buf = calloc(1, fp_size + sizeof(END));
if (!buf)
return NULL;
@@ -488,7 +487,7 @@ static efi_status_t eficonfig_file_selected(void *data)
if (!info)
return EFI_INVALID_PARAMETER;
- if (!strcmp(info->file_name, "..")) {
+ if (!strcmp(info->file_name, "..\\")) {
struct eficonfig_filepath_info *iter;
struct list_head *pos, *n;
int is_last;
@@ -1684,7 +1683,8 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
u32 i;
u16 *bootorder;
efi_status_t ret;
- efi_uintn_t num, size;
+ u16 *var_name16 = NULL, *p;
+ efi_uintn_t num, size, buf_size;
struct efimenu *efi_menu;
struct list_head *pos, *n;
struct eficonfig_entry *entry;
@@ -1708,14 +1708,43 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
}
/* list the remaining load option not included in the BootOrder */
- for (i = 0; i <= 0xFFFF; i++) {
- /* If the index is included in the BootOrder, skip it */
- if (search_bootorder(bootorder, num, i, NULL))
- continue;
+ buf_size = 128;
+ var_name16 = malloc(buf_size);
+ if (!var_name16)
+ return EFI_OUT_OF_RESOURCES;
- ret = eficonfig_add_boot_selection_entry(efi_menu, i, selected);
- if (ret != EFI_SUCCESS)
- goto out;
+ var_name16[0] = 0;
+ for (;;) {
+ int index;
+ efi_guid_t guid;
+
+ size = buf_size;
+ ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ if (ret == EFI_NOT_FOUND)
+ break;
+ if (ret == EFI_BUFFER_TOO_SMALL) {
+ buf_size = size;
+ p = realloc(var_name16, buf_size);
+ if (!p) {
+ free(var_name16);
+ return EFI_OUT_OF_RESOURCES;
+ }
+ var_name16 = p;
+ ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ }
+ if (ret != EFI_SUCCESS) {
+ free(var_name16);
+ return ret;
+ }
+ if (efi_varname_is_load_option(var_name16, &index)) {
+ /* If the index is included in the BootOrder, skip it */
+ if (search_bootorder(bootorder, num, index, NULL))
+ continue;
+
+ ret = eficonfig_add_boot_selection_entry(efi_menu, index, selected);
+ if (ret != EFI_SUCCESS)
+ goto out;
+ }
if (efi_menu->count >= EFICONFIG_ENTRY_NUM_MAX - 1)
break;
@@ -1733,6 +1762,8 @@ out:
}
eficonfig_destroy(efi_menu);
+ free(var_name16);
+
return ret;
}
@@ -1995,6 +2026,8 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
u32 i;
char *title;
efi_status_t ret;
+ u16 *var_name16 = NULL, *p;
+ efi_uintn_t size, buf_size;
/* list the load option in the order of BootOrder variable */
for (i = 0; i < num; i++) {
@@ -2007,17 +2040,45 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
}
/* list the remaining load option not included in the BootOrder */
- for (i = 0; i < 0xFFFF; i++) {
+ buf_size = 128;
+ var_name16 = malloc(buf_size);
+ if (!var_name16)
+ return EFI_OUT_OF_RESOURCES;
+
+ var_name16[0] = 0;
+ for (;;) {
+ int index;
+ efi_guid_t guid;
+
if (efi_menu->count >= EFICONFIG_ENTRY_NUM_MAX - 2)
break;
- /* If the index is included in the BootOrder, skip it */
- if (search_bootorder(bootorder, num, i, NULL))
- continue;
-
- ret = eficonfig_add_change_boot_order_entry(efi_menu, i, false);
+ size = buf_size;
+ ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ if (ret == EFI_NOT_FOUND)
+ break;
+ if (ret == EFI_BUFFER_TOO_SMALL) {
+ buf_size = size;
+ p = realloc(var_name16, buf_size);
+ if (!p) {
+ ret = EFI_OUT_OF_RESOURCES;
+ goto out;
+ }
+ var_name16 = p;
+ ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ }
if (ret != EFI_SUCCESS)
goto out;
+
+ if (efi_varname_is_load_option(var_name16, &index)) {
+ /* If the index is included in the BootOrder, skip it */
+ if (search_bootorder(bootorder, num, index, NULL))
+ continue;
+
+ ret = eficonfig_add_change_boot_order_entry(efi_menu, index, false);
+ if (ret != EFI_SUCCESS)
+ goto out;
+ }
}
/* add "Save" and "Quit" entries */
@@ -2036,9 +2097,9 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
goto out;
efi_menu->active = 0;
-
- return EFI_SUCCESS;
out:
+ free(var_name16);
+
return ret;
}
@@ -2271,17 +2332,48 @@ out:
efi_status_t eficonfig_delete_invalid_boot_option(struct eficonfig_media_boot_option *opt,
efi_status_t count)
{
- u32 i, j;
+ u32 i;
efi_uintn_t size;
void *load_option;
struct efi_load_option lo;
+ u16 *var_name16 = NULL, *p;
u16 varname[] = u"Boot####";
efi_status_t ret = EFI_SUCCESS;
+ efi_uintn_t varname_size, buf_size;
- for (i = 0; i <= 0xFFFF; i++) {
+ buf_size = 128;
+ var_name16 = malloc(buf_size);
+ if (!var_name16)
+ return EFI_OUT_OF_RESOURCES;
+
+ var_name16[0] = 0;
+ for (;;) {
+ int index;
+ efi_guid_t guid;
efi_uintn_t tmp;
- efi_create_indexed_name(varname, sizeof(varname), "Boot", i);
+ varname_size = buf_size;
+ ret = efi_get_next_variable_name_int(&varname_size, var_name16, &guid);
+ if (ret == EFI_NOT_FOUND)
+ break;
+ if (ret == EFI_BUFFER_TOO_SMALL) {
+ buf_size = varname_size;
+ p = realloc(var_name16, buf_size);
+ if (!p) {
+ free(var_name16);
+ return EFI_OUT_OF_RESOURCES;
+ }
+ var_name16 = p;
+ ret = efi_get_next_variable_name_int(&varname_size, var_name16, &guid);
+ }
+ if (ret != EFI_SUCCESS) {
+ free(var_name16);
+ return ret;
+ }
+ if (!efi_varname_is_load_option(var_name16, &index))
+ continue;
+
+ efi_create_indexed_name(varname, sizeof(varname), "Boot", index);
load_option = efi_get_var(varname, &efi_global_variable_guid, &size);
if (!load_option)
continue;
@@ -2293,15 +2385,15 @@ efi_status_t eficonfig_delete_invalid_boot_option(struct eficonfig_media_boot_op
if (size >= sizeof(efi_guid_bootmenu_auto_generated)) {
if (guidcmp(lo.optional_data, &efi_guid_bootmenu_auto_generated) == 0) {
- for (j = 0; j < count; j++) {
- if (opt[j].size == tmp &&
- memcmp(opt[j].lo, load_option, tmp) == 0) {
- opt[j].exist = true;
+ for (i = 0; i < count; i++) {
+ if (opt[i].size == tmp &&
+ memcmp(opt[i].lo, load_option, tmp) == 0) {
+ opt[i].exist = true;
break;
}
}
- if (j == count) {
+ if (i == count) {
ret = delete_boot_option(i);
if (ret != EFI_SUCCESS) {
free(load_option);
diff --git a/cmd/efidebug.c b/cmd/efidebug.c
index ef239bb34b4..569003ae2ef 100644
--- a/cmd/efidebug.c
+++ b/cmd/efidebug.c
@@ -600,7 +600,7 @@ static int do_efi_show_memmap(struct cmd_tbl *cmdtp, int flag,
ret = efi_get_memory_map(&map_size, memmap, NULL, NULL, NULL);
if (ret == EFI_BUFFER_TOO_SMALL) {
map_size += sizeof(struct efi_mem_desc); /* for my own */
- ret = efi_allocate_pool(EFI_LOADER_DATA, map_size,
+ ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, map_size,
(void *)&memmap);
if (ret != EFI_SUCCESS)
return CMD_RET_FAILURE;
@@ -1010,17 +1010,6 @@ static void show_efi_boot_opt(u16 *varname16)
}
}
-static int u16_tohex(u16 c)
-{
- if (c >= '0' && c <= '9')
- return c - '0';
- if (c >= 'A' && c <= 'F')
- return c - 'A' + 10;
-
- /* not hexadecimal */
- return -1;
-}
-
/**
* show_efi_boot_dump() - dump all UEFI load options
*
@@ -1041,7 +1030,6 @@ static int do_efi_boot_dump(struct cmd_tbl *cmdtp, int flag,
u16 *var_name16, *p;
efi_uintn_t buf_size, size;
efi_guid_t guid;
- int id, i, digit;
efi_status_t ret;
if (argc > 1)
@@ -1074,16 +1062,7 @@ static int do_efi_boot_dump(struct cmd_tbl *cmdtp, int flag,
return CMD_RET_FAILURE;
}
- if (memcmp(var_name16, u"Boot", 8))
- continue;
-
- for (id = 0, i = 0; i < 4; i++) {
- digit = u16_tohex(var_name16[4 + i]);
- if (digit < 0)
- break;
- id = (id << 4) + digit;
- }
- if (i == 4 && !var_name16[8])
+ if (efi_varname_is_load_option(var_name16, NULL))
show_efi_boot_opt(var_name16);
}