[RFC PATCH 30/31] temp: cmd: efi_mem: add a command to test efi alloc/free
Sughosh Ganu
sughosh.ganu at linaro.org
Mon Jun 10 08:44:14 CEST 2024
On Sat, 8 Jun 2024 at 09:07, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
>
>
> Am 7. Juni 2024 20:52:39 MESZ schrieb Sughosh Ganu <sughosh.ganu at linaro.org>:
> >Not for committing.
>
> Best put "DON'T MERGE" into the title to avoid mishaps in future versions.
Will do.
>
> In the final series we should have unit test covering all relevant aspects of the memory system.
Yes, that's the plan.
-sughosh
>
> Best regards
>
> Heinrich
>
> >
> >Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> >---
> > cmd/Makefile | 1 +
> > cmd/efi_memory.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 156 insertions(+)
> > create mode 100644 cmd/efi_memory.c
> >
> >diff --git a/cmd/Makefile b/cmd/Makefile
> >index 87133cc27a..35fcc4af5a 100644
> >--- a/cmd/Makefile
> >+++ b/cmd/Makefile
> >@@ -10,6 +10,7 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o
> > obj-y += help.o
> > obj-y += panic.o
> > obj-y += version.o
> >+obj-y += efi_memory.o
> >
> > # command
> > obj-$(CONFIG_CMD_ARMFFA) += armffa.o
> >diff --git a/cmd/efi_memory.c b/cmd/efi_memory.c
> >new file mode 100644
> >index 0000000000..52ddcb7146
> >--- /dev/null
> >+++ b/cmd/efi_memory.c
> >@@ -0,0 +1,155 @@
> >+// SPDX-License-Identifier: GPL-2.0+
> >+/*
> >+ * Allocate and Free EFI memory
> >+ *
> >+ * Copyright (c) 2024 Linaro Limited
> >+ */
> >+
> >+#include <command.h>
> >+#include <efi_loader.h>
> >+#include <lmb.h>
> >+#include <vsprintf.h>
> >+
> >+#include <linux/types.h>
> >+
> >+static int do_efi_mem_free(struct cmd_tbl *cmdtp, int flag, int argc,
> >+ char * const argv[])
> >+{
> >+ uint64_t addr = 0, size = 0;
> >+ efi_uintn_t pages;
> >+ efi_status_t status;
> >+
> >+ if (argc != 3)
> >+ return CMD_RET_USAGE;
> >+
> >+ argc--; argv++;
> >+
> >+ size = simple_strtoul(argv[0], NULL, 16);
> >+ if (!size) {
> >+ printf("Enter valid size for free in Hex\n");
> >+ return CMD_RET_USAGE;
> >+ }
> >+
> >+
> >+ addr = simple_strtoul(argv[1], NULL, 16);
> >+ if (!addr) {
> >+ printf("Enter a valid address in Hex\n");
> >+ return CMD_RET_USAGE;
> >+ }
> >+
> >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
> >+
> >+ status = efi_free_pages(addr, pages);
> >+ if (status != EFI_SUCCESS) {
> >+ printf("Unable to free memory, error (%#lx)\n", status);
> >+ return CMD_RET_FAILURE;
> >+ }
> >+
> >+ return CMD_RET_SUCCESS;
> >+}
> >+
> >+static int do_efi_mem_alloc(struct cmd_tbl *cmdtp, int flag, int argc,
> >+ char * const argv[])
> >+{
> >+ enum efi_allocate_type type;
> >+ uint64_t addr = 0, size = 0;
> >+ efi_uintn_t pages;
> >+ efi_status_t status;
> >+ bool max = false;
> >+
> >+ if (argc < 2)
> >+ return CMD_RET_USAGE;
> >+
> >+ argc--; argv++;
> >+
> >+ if (!strcmp("max", argv[0])) {
> >+ if (argc != 3)
> >+ return CMD_RET_USAGE;
> >+
> >+ max = true;
> >+ argv++;
> >+ argc--;
> >+ }
> >+
> >+ size = simple_strtoul(argv[0], NULL, 16);
> >+ if (!size) {
> >+ printf("Enter valid size for allocation in Hex\n");
> >+ return CMD_RET_USAGE;
> >+ }
> >+
> >+ if (max || argc == 2) {
> >+ addr = simple_strtoul(argv[1], NULL, 16);
> >+ if (!addr) {
> >+ printf("Enter a valid address in Hex\n");
> >+ return CMD_RET_USAGE;
> >+ }
> >+ }
> >+
> >+ if (max)
> >+ type = EFI_ALLOCATE_MAX_ADDRESS;
> >+ else if (addr)
> >+ type = EFI_ALLOCATE_ADDRESS;
> >+ else
> >+ type = EFI_ALLOCATE_ANY_PAGES;
> >+
> >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
> >+ status = efi_allocate_pages(type, EFI_BOOT_SERVICES_DATA, pages,
> >+ &addr);
> >+ if (status != EFI_SUCCESS) {
> >+ printf("efi_allocate_pages failed %lx\n", status);
> >+ return CMD_RET_FAILURE;
> >+ } else {
> >+ printf("Address returned %#llx\n", addr);
> >+ }
> >+
> >+ return CMD_RET_SUCCESS;
> >+}
> >+
> >+static struct cmd_tbl cmd_efi_mem_sub[] = {
> >+ U_BOOT_CMD_MKENT(alloc, 3, 0, do_efi_mem_alloc,
> >+ "", ""),
> >+ U_BOOT_CMD_MKENT(free, 2, 0, do_efi_mem_free,
> >+ "", ""),
> >+};
> >+
> >+static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc,
> >+ char *const argv[])
> >+{
> >+ struct cmd_tbl *cp;
> >+ efi_status_t r;
> >+
> >+ if (argc < 3)
> >+ return CMD_RET_USAGE;
> >+
> >+ argc--; argv++;
> >+
> >+ /* Initialize UEFI subsystem */
> >+ r = efi_init_obj_list();
> >+ if (r != EFI_SUCCESS) {
> >+ printf("Error: Cannot initialize UEFI sub-system, r = %lu\n",
> >+ r & ~EFI_ERROR_MASK);
> >+ return CMD_RET_FAILURE;
> >+ }
> >+
> >+ cp = find_cmd_tbl(argv[0], cmd_efi_mem_sub,
> >+ ARRAY_SIZE(cmd_efi_mem_sub));
> >+ if (!cp)
> >+ return CMD_RET_USAGE;
> >+
> >+ return cp->cmd(cmdtp, flag, argc, argv);
> >+}
> >+
> >+U_BOOT_LONGHELP(efi_mem,
> >+ "Functions to allocate and free memory\n"
> >+ "\n"
> >+ "efi_mem alloc <size> [addr]\n"
> >+ "efi_mem alloc max <size> <max-addr>\n"
> >+ "efi_mem free <size> <addr>\n"
> >+ "\n"
> >+);
> >+
> >+U_BOOT_CMD(
> >+ efi_mem, CONFIG_SYS_MAXARGS, 0, do_efi_mem,
> >+ "Allocate and free EFI memory",
> >+ efi_mem_help_text
> >+);
More information about the U-Boot
mailing list