aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2022-01-04 03:51:12 -0700
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-01-15 10:57:22 +0100
commit25a326b0066b3c449a0a91889b0ce19cb7320237 (patch)
tree215cd3419424c42bcdea7c8ccbeac63103ea4416 /cmd
parentce1dc0cc17e94a0bf1c17bd1465cb0afd5bfb214 (diff)
downloadu-boot-25a326b0066b3c449a0a91889b0ce19cb7320237.zip
u-boot-25a326b0066b3c449a0a91889b0ce19cb7320237.tar.gz
u-boot-25a326b0066b3c449a0a91889b0ce19cb7320237.tar.bz2
efi: Support the efi command in the app
At present the 'efi' command only works in the EFI payload. Update it to work in the app too, so the memory map can be examined. Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/Makefile2
-rw-r--r--cmd/efi.c48
2 files changed, 34 insertions, 16 deletions
diff --git a/cmd/Makefile b/cmd/Makefile
index e31ac15..6623d7e 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -58,7 +58,7 @@ obj-$(CONFIG_CMD_EXTENSION) += extension_board.o
obj-$(CONFIG_CMD_ECHO) += echo.o
obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o
obj-$(CONFIG_CMD_EEPROM) += eeprom.o
-obj-$(CONFIG_EFI_STUB) += efi.o
+obj-$(CONFIG_EFI) += efi.o
obj-$(CONFIG_CMD_EFIDEBUG) += efidebug.o
obj-$(CONFIG_CMD_ELF) += elf.o
obj-$(CONFIG_HUSH_PARSER) += exit.o
diff --git a/cmd/efi.c b/cmd/efi.c
index d2400ac..c0384e0 100644
--- a/cmd/efi.c
+++ b/cmd/efi.c
@@ -13,6 +13,8 @@
#include <sort.h>
#include <asm/global_data.h>
+DECLARE_GLOBAL_DATA_PTR;
+
static const char *const type_name[] = {
"reserved",
"loader_code",
@@ -217,37 +219,53 @@ static void efi_print_mem_table(struct efi_mem_desc *desc, int desc_size,
static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
- struct efi_mem_desc *desc;
- struct efi_entry_memmap *map;
+ struct efi_mem_desc *orig, *desc;
+ uint version, key;
+ int desc_size;
int size, ret;
bool skip_bs;
skip_bs = !argc || *argv[0] != 'a';
- ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
- switch (ret) {
- case -ENOENT:
- printf("No EFI table available\n");
- goto done;
- case -EPROTONOSUPPORT:
- printf("Incorrect EFI table version\n");
- goto done;
+ if (IS_ENABLED(CONFIG_EFI_APP)) {
+ ret = efi_get_mmap(&orig, &size, &key, &desc_size, &version);
+ if (ret) {
+ printf("Cannot read memory map (err=%d)\n", ret);
+ return CMD_RET_FAILURE;
+ }
+ } else {
+ struct efi_entry_memmap *map;
+
+ ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
+ switch (ret) {
+ case -ENOENT:
+ printf("No EFI table available\n");
+ goto done;
+ case -EPROTONOSUPPORT:
+ printf("Incorrect EFI table version\n");
+ goto done;
+ }
+ orig = map->desc;
+ desc_size = map->desc_size;
+ version = map->version;
}
- printf("EFI table at %lx, memory map %p, size %x, version %x, descr. size %#x\n",
- gd->arch.table, map, size, map->version, map->desc_size);
- if (map->version != EFI_MEM_DESC_VERSION) {
+ printf("EFI table at %lx, memory map %p, size %x, key %x, version %x, descr. size %#x\n",
+ gd->arch.table, orig, size, key, version, desc_size);
+ if (version != EFI_MEM_DESC_VERSION) {
printf("Incorrect memory map version\n");
ret = -EPROTONOSUPPORT;
goto done;
}
- desc = efi_build_mem_table(map->desc, size, map->desc_size, skip_bs);
+ desc = efi_build_mem_table(orig, size, desc_size, skip_bs);
if (!desc) {
ret = -ENOMEM;
goto done;
}
- efi_print_mem_table(desc, map->desc_size, skip_bs);
+ efi_print_mem_table(desc, desc_size, skip_bs);
free(desc);
+ if (IS_ENABLED(CONFIG_EFI_APP))
+ free(orig);
done:
if (ret)
printf("Error: %d\n", ret);