[RFC PATCH 30/31] temp: cmd: efi_mem: add a command to test efi alloc/free

Sughosh Ganu sughosh.ganu at linaro.org
Fri Jun 7 20:52:39 CEST 2024


Not for committing.

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
+);
-- 
2.34.1



More information about the U-Boot mailing list