From: Heinrich Schuchardt <xypron.glpk@gmx.de>
To: Simon Glass <sjg@chromium.org>,
U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>,
Christian Melki <christian.melki@t2data.com>,
Bin Meng <bmeng.cn@gmail.com>, Tom Rini <trini@konsulko.com>,
Alexander Graf <agraf@csgraf.de>,
AKASHI Takahiro <takahiro.akashi@linaro.org>
Subject: Re: [PATCH v5 21/28] efi: Support the efi command in the app
Date: Thu, 9 Dec 2021 12:27:23 -0800 [thread overview]
Message-ID: <31befeb9-2678-8f56-4067-829f1fd6c2d3@gmx.de> (raw)
In-Reply-To: <20211204155657.2913911-15-sjg@chromium.org>
On 12/4/21 07:56, Simon Glass wrote:
> 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.
cmd/efi.c seems to be duplicating function do_efi_show_memmap(). In a
future patch we should try to move to using common code for commands efi
and efidebug.
Best regards
Heinrich
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> (no changes since v1)
>
> cmd/Makefile | 2 +-
> cmd/efi.c | 48 ++++++++++++++++++++++++++++++++---------------
> include/efi.h | 15 +++++++++++++++
> lib/efi/efi_app.c | 33 ++++++++++++++++++++++++++++++++
> 4 files changed, 82 insertions(+), 16 deletions(-)
>
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 891819ae0f6..df50625bde7 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 d2400acbbba..c0384e0db28 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);
> diff --git a/include/efi.h b/include/efi.h
> index 1dc806a1267..8a43430d3df 100644
> --- a/include/efi.h
> +++ b/include/efi.h
> @@ -610,4 +610,19 @@ int efi_store_memory_map(struct efi_priv *priv);
> */
> int efi_call_exit_boot_services(void);
>
> +/**
> + * efi_get_mmap() - Get the memory map from EFI
> + *
> + * This is used in the app. The caller must free *@descp when done
> + *
> + * @descp: Returns allocated pointer to EFI memory map table
> + * @sizep: Returns size of table in bytes
> + * @keyp: Returns memory-map key
> + * @desc_sizep: Returns size of each @desc_base record
> + * @versionp: Returns version number of memory map
> + * @return 0 on success, -ve on error
> + */
> +int efi_get_mmap(struct efi_mem_desc **descp, int *sizep, uint *keyp,
> + int *desc_sizep, uint *versionp);
> +
> #endif /* _LINUX_EFI_H */
> diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c
> index 36e3f1de427..55fa1ac57d5 100644
> --- a/lib/efi/efi_app.c
> +++ b/lib/efi/efi_app.c
> @@ -32,6 +32,39 @@ int efi_info_get(enum efi_entry_t type, void **datap, int *sizep)
> return -ENOSYS;
> }
>
> +int efi_get_mmap(struct efi_mem_desc **descp, int *sizep, uint *keyp,
> + int *desc_sizep, uint *versionp)
> +{
> + struct efi_priv *priv = efi_get_priv();
> + struct efi_boot_services *boot = priv->sys_table->boottime;
> + efi_uintn_t size, desc_size, key;
> + struct efi_mem_desc *desc;
> + efi_status_t ret;
> + u32 version;
> +
> + /* Get the memory map so we can switch off EFI */
> + size = 0;
> + ret = boot->get_memory_map(&size, NULL, &key, &desc_size, &version);
> + if (ret != EFI_BUFFER_TOO_SMALL)
> + return log_msg_ret("get", -ENOMEM);
> +
> + desc = malloc(size);
> + if (!desc)
> + return log_msg_ret("mem", -ENOMEM);
> +
> + ret = boot->get_memory_map(&size, desc, &key, &desc_size, &version);
> + if (ret)
> + return log_msg_ret("get", -EINVAL);
> +
> + *descp = desc;
> + *sizep = size;
> + *desc_sizep = desc_size;
> + *versionp = version;
> + *keyp = key;
> +
> + return 0;
> +}
> +
> /**
> * efi_print_str() - Print a UFT-16 string to the U-Boot console
> *
>
next prev parent reply other threads:[~2021-12-09 20:27 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-04 15:56 [PATCH v5 00/28] efi: Improvements to U-Boot running on top of UEFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 01/28] efi: Rename UCLASS_EFI and IF_TYPE_EFI Simon Glass
2021-12-09 18:38 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 02/28] efi: Add EFI uclass for media Simon Glass
2021-12-09 18:54 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 03/28] efi: Add a media/block driver for EFI block devices Simon Glass
2021-12-09 19:04 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 04/28] efi: Locate all block devices in the app Simon Glass
2021-12-04 18:43 ` Heinrich Schuchardt
2021-12-09 19:23 ` Heinrich Schuchardt
2021-12-17 16:37 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 05/28] efi: serial: Support arrow keys Simon Glass
2021-12-09 19:39 ` Heinrich Schuchardt
2021-12-17 16:37 ` Simon Glass
2021-12-17 17:09 ` Heinrich Schuchardt
2021-12-17 17:42 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 06/28] bloblist: Support allocating the bloblist Simon Glass
2021-12-04 15:56 ` [PATCH v5 07/28] x86: Allow booting a kernel from the EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 08/28] x86: Don't process the kernel command line unless enabled Simon Glass
2021-12-04 15:56 ` [PATCH v5 09/28] x86: efi: Add room for the binman definition in the dtb Simon Glass
2021-12-04 15:56 ` [PATCH v5 10/28] efi: Drop device_path from struct efi_priv Simon Glass
2021-12-04 15:56 ` [PATCH v5 11/28] efi: Add comments to " Simon Glass
2021-12-04 15:56 ` [PATCH v5 12/28] efi: Fix ll_boot_init() operation with the app Simon Glass
2021-12-04 15:56 ` [PATCH v5 13/28] efi: Add a few comments to the stub Simon Glass
2021-12-04 19:10 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 14/28] efi: Share struct efi_priv between the app and stub code Simon Glass
2021-12-04 15:56 ` [PATCH v5 15/28] efi: Move exit_boot_services into a function Simon Glass
2021-12-04 19:13 ` Heinrich Schuchardt
2021-12-17 16:37 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 16/28] efi: Check for failure when initing the app Simon Glass
2021-12-09 20:17 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 17/28] efi: Mention that efi_info_get() is only used in the stub Simon Glass
2021-12-09 20:20 ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 18/28] efi: Show when allocated pages are used Simon Glass
2021-12-09 19:55 ` Heinrich Schuchardt
2021-12-17 16:37 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 19/28] efi: Allow easy selection of serial-only operation Simon Glass
2021-12-04 15:56 ` [PATCH v5 20/28] x86: efi: Update efi_get_next_mem_desc() to avoid needing a map Simon Glass
2021-12-04 15:56 ` [PATCH v5 21/28] efi: Support the efi command in the app Simon Glass
2021-12-09 20:27 ` Heinrich Schuchardt [this message]
2021-12-17 16:37 ` Simon Glass
2021-12-20 2:38 ` AKASHI Takahiro
2021-12-29 13:36 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 22/28] x86: efi: Show the system-table revision Simon Glass
2021-12-09 20:29 ` Heinrich Schuchardt
2021-12-17 16:37 ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 23/28] x86: efi: Don't set up global_data again with EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 24/28] x86: efi: Tweak the code used for the 64-bit EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 25/28] x86: efi: Round out the link script for 64-bit EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 26/28] x86: efi: Don't use the 64-bit link script for the EFI app Simon Glass
2021-12-05 14:03 ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 27/28] x86: efi: Set the correct link flags for the 64-bit " Simon Glass
2021-12-05 14:03 ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 28/28] efi: Build the 64-bit app properly Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=31befeb9-2678-8f56-4067-829f1fd6c2d3@gmx.de \
--to=xypron.glpk@gmx.de \
--cc=agraf@csgraf.de \
--cc=bmeng.cn@gmail.com \
--cc=christian.melki@t2data.com \
--cc=ilias.apalodimas@linaro.org \
--cc=sjg@chromium.org \
--cc=takahiro.akashi@linaro.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).