mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <ahmad@a3f.at>, Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH v1 05/54] efi: loader: add memory accounting
Date: Thu, 18 Dec 2025 11:37:25 +0100	[thread overview]
Message-ID: <20251218111242.1527495-6-a.fatoum@pengutronix.de> (raw)
In-Reply-To: <20251218111242.1527495-1-a.fatoum@pengutronix.de>

From: Ahmad Fatoum <ahmad@a3f.at>

For use by the EFI runtime, we implement here a naive allocator that
allocates all memory at the highest possible free address.

In future, we may consider switching to Linux' red-black tree based interval
trees, but this is good enough for now.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/Kconfig           |   3 +
 arch/arm/Kconfig       |   1 +
 efi/Kconfig            |  19 ++
 efi/Makefile           |   1 +
 efi/loader/Kconfig     |   3 +
 efi/loader/Makefile    |   3 +
 efi/loader/memory.c    | 416 +++++++++++++++++++++++++++++++++++++++++
 include/efi/loader.h   |  33 ++++
 include/efi/types.h    |  14 ++
 include/linux/ioport.h |   2 +
 include/memory.h       |   2 +
 11 files changed, 497 insertions(+)
 create mode 100644 efi/loader/Kconfig
 create mode 100644 efi/loader/Makefile
 create mode 100644 efi/loader/memory.c
 create mode 100644 include/efi/loader.h

diff --git a/arch/Kconfig b/arch/Kconfig
index 5af114a6e9e5..ca9aa25a9c4b 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -107,6 +107,9 @@ config HAVE_EFI_PAYLOAD
 config HAVE_EFI_STUB
 	bool
 
+config HAVE_EFI_LOADER
+	bool
+
 config PHYS_ADDR_T_64BIT
 	bool
 
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index d2d81a4f90d6..4b7f5b83c67e 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -17,6 +17,7 @@ config ARM
 	select HAVE_ARCH_BOOTM_OFTREE
 	select HW_HAS_PCI
 	select ARCH_HAS_DMA_WRITE_COMBINE
+	select HAVE_EFI_LOADER if MMU # for payload unaligned accesses
 	default y
 
 config ARCH_LINUX_NAME
diff --git a/efi/Kconfig b/efi/Kconfig
index 23ac601af647..766d6b0e3094 100644
--- a/efi/Kconfig
+++ b/efi/Kconfig
@@ -25,6 +25,25 @@ if EFI_PAYLOAD
 source "efi/payload/Kconfig"
 endif
 
+config EFI_LOADER
+	bool "barebox as EFI loader (provider)"
+	depends on HAVE_EFI_LOADER
+	select EFI
+	select EFI_GUID
+	select EFI_DEVICEPATH
+	select MEMORY_ATTRIBUTES
+	help
+	  Select this option if you want to run UEFI applications (like GNU
+	  GRUB or an EFI-stubbed kernel) on top of barebox.
+
+	  If this option is enabled, barebox will expose the UEFI API to
+	  loaded applications, enabling them to reuse barebox device drivers
+	  and file systems.
+
+if EFI_LOADER
+source "efi/loader/Kconfig"
+endif
+
 config EFI
 	bool
 
diff --git a/efi/Makefile b/efi/Makefile
index 4c35917475c0..e0f6ac549009 100644
--- a/efi/Makefile
+++ b/efi/Makefile
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
 obj-$(CONFIG_EFI_PAYLOAD)	+= payload/
+obj-$(CONFIG_EFI_LOADER)	+= loader/
 obj-$(CONFIG_EFI_GUID)		+= guid.o
 obj-$(CONFIG_EFI_DEVICEPATH)	+= devicepath.o
 obj-y				+= errno.o handle.o efivar.o efivar-filename.o
diff --git a/efi/loader/Kconfig b/efi/loader/Kconfig
new file mode 100644
index 000000000000..e7080d8d5093
--- /dev/null
+++ b/efi/loader/Kconfig
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0-only
+# SPDX-Comment: Origin-URL: https://github.com/u-boot/u-boot/blob/a0fe8cedcbe8c76403a77e57eac228b8f778a3ae/lib/efi_loader/Kconfig
+
diff --git a/efi/loader/Makefile b/efi/loader/Makefile
new file mode 100644
index 000000000000..dea1e06c18cf
--- /dev/null
+++ b/efi/loader/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-y += memory.o
diff --git a/efi/loader/memory.c b/efi/loader/memory.c
new file mode 100644
index 000000000000..075b559367fe
--- /dev/null
+++ b/efi/loader/memory.c
@@ -0,0 +1,416 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#define pr_fmt(fmt) "efi-loader: memory: " fmt
+
+#include <linux/minmax.h>
+#include <linux/printk.h>
+#include <linux/sprintf.h>
+#include <efi/loader.h>
+#include <efi/error.h>
+#include <init.h>
+#include <memory.h>
+#include <linux/list_sort.h>
+#include <linux/sizes.h>
+#include <dma.h>
+
+efi_uintn_t efi_memory_map_key;
+
+static efi_status_t find_pages_max(struct list_head *banks, size_t npages, size_t *page)
+{
+	struct memory_bank *bank;
+
+	list_for_each_entry_reverse(bank, banks, list) {
+		if ((bank->res->start >> EFI_PAGE_SHIFT) > *page)
+			continue;
+
+		for_each_memory_bank_region_reverse(bank, region) {
+			resource_size_t gap_firstpage, gap_lastpage;
+			resource_size_t candidate_last;
+
+			if (!region_is_gap(region))
+				continue;
+
+			gap_firstpage = EFI_PAGE_ALIGN(region->start) >> EFI_PAGE_SHIFT;
+			gap_lastpage = (EFI_PAGE_ALIGN(region->end + 1) >> EFI_PAGE_SHIFT);
+
+			if (!gap_lastpage || gap_lastpage < gap_firstpage)
+				continue;
+
+			/* make last page inclusive */
+			gap_lastpage--;
+
+			candidate_last = min_t(resource_size_t, gap_lastpage, *page);
+			if (candidate_last < gap_firstpage)
+				continue;
+
+			if (candidate_last - gap_firstpage + 1 < npages)
+				continue;
+
+			*page = candidate_last + 1 - npages;
+			return EFI_SUCCESS;
+		}
+	}
+
+	return EFI_OUT_OF_RESOURCES;
+}
+
+
+static const char *efi_memory_type_tostr(enum efi_memory_type type)
+{
+	switch (type) {
+	case EFI_RESERVED_TYPE:
+		return "res";
+	case EFI_LOADER_CODE:
+		return "ldcode";
+	case EFI_LOADER_DATA:
+		return "lddata";
+	case EFI_BOOT_SERVICES_CODE:
+		return "bscode";
+	case EFI_BOOT_SERVICES_DATA:
+		return "bsdata";
+	case EFI_RUNTIME_SERVICES_CODE:
+		return "rtcode";
+	case EFI_RUNTIME_SERVICES_DATA:
+		return "rtdata";
+	case EFI_CONVENTIONAL_MEMORY:
+		return "memory";
+	case EFI_UNUSABLE_MEMORY:
+		return "unsable";
+	case EFI_ACPI_RECLAIM_MEMORY:
+		return "acpireclaim";
+	case EFI_ACPI_MEMORY_NVS:
+		return "acpinvs";
+	case EFI_MEMORY_MAPPED_IO:
+		return "mmio";
+	case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
+		return "mmioport";
+	case EFI_PAL_CODE:
+		return "pal";
+	case EFI_PERSISTENT_MEMORY_TYPE:
+		return "persistent";
+	case EFI_UNACCEPTED_MEMORY_TYPE:
+		return "unaccepted";
+	default:
+		return "unknown";
+	}
+}
+
+static u64 efi_memory_type_default_attrs(enum efi_memory_type type)
+{
+	switch (type) {
+	case EFI_RESERVED_TYPE:
+	case EFI_MEMORY_MAPPED_IO:
+	case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
+	case EFI_UNACCEPTED_MEMORY_TYPE:
+		return 0;
+	case EFI_BOOT_SERVICES_CODE:
+	case EFI_LOADER_CODE:
+	case EFI_RUNTIME_SERVICES_CODE:
+	case EFI_ACPI_RECLAIM_MEMORY:
+	case EFI_ACPI_MEMORY_NVS:
+		return MEMATTRS_RWX;
+	case EFI_LOADER_DATA:
+	case EFI_BOOT_SERVICES_DATA:
+	case EFI_RUNTIME_SERVICES_DATA:
+		return MEMATTRS_RW;
+	case EFI_CONVENTIONAL_MEMORY:
+		return MEMATTRS_RWX;
+	case EFI_PAL_CODE:
+		return MEMATTRS_FAULT;
+	case EFI_PERSISTENT_MEMORY_TYPE:
+		return MEMATTRS_RW | MEMATTR_SP;
+	case EFI_UNUSABLE_MEMORY:
+	case EFI_MAX_MEMORY_TYPE:
+		pr_warn("Unallocatable type %u\n", type); // FIXME
+		return MEMATTRS_FAULT;
+	}
+
+	return MEMATTRS_RWX;
+}
+
+/**
+ * efi_allocate_pages - allocate memory pages
+ *
+ * @type:		type of allocation to be performed
+ * @memory_type:	usage type of the allocated memory
+ * @pages:		number of pages to be allocated
+ * @memory:		allocated memory
+ * @name:		name for informational purposes
+ * Return:		status code
+ */
+efi_status_t efi_allocate_pages(enum efi_allocate_type type,
+				enum efi_memory_type memory_type,
+				efi_uintn_t npages, uint64_t *memory,
+				const char *name)
+{
+	char namebuf[64];
+	const char *typestr;
+	struct resource *res;
+	uint64_t attrs, new_addr = *memory;
+	size_t new_page;
+	efi_status_t r;
+
+	++efi_memory_map_key;
+
+	if (npages == 0)
+		return EFI_INVALID_PARAMETER;
+
+	switch (type) {
+	case EFI_ALLOCATE_ANY_PAGES:
+		new_addr = U64_MAX;
+		typestr = "any";
+		fallthrough;
+	case EFI_ALLOCATE_MAX_ADDRESS:
+		new_page = new_addr >> EFI_PAGE_SHIFT;
+		r = find_pages_max(&memory_banks, npages, &new_page);
+		if (r != EFI_SUCCESS)
+			return r;
+		new_addr = new_page << EFI_PAGE_SHIFT;
+		typestr = "max";
+		break;
+	case EFI_ALLOCATE_ADDRESS:
+		typestr = "exact";
+		break;
+	default:
+		/* UEFI doesn't specify other allocation types */
+		return EFI_INVALID_PARAMETER;
+	}
+
+	scnprintf(namebuf, sizeof(namebuf), "efi%zu-%s%c%s", efi_memory_map_key,
+		  efi_memory_type_tostr(memory_type),
+		  name ? '-' : '\0', name ?: "");
+
+	attrs = efi_memory_type_default_attrs(memory_type);
+	if (!attrs)
+		return EFI_INVALID_PARAMETER;
+
+	res = request_sdram_region(namebuf, new_addr, npages << EFI_PAGE_SHIFT,
+				   efi_memory_type_to_resource_type(memory_type),
+				   attrs);
+	if (!res) {
+		pr_err("failed to request %s at page 0x%zx+%zu (%s)\n",
+		       namebuf, new_page, npages, typestr);
+		dump_stack();
+		return EFI_OUT_OF_RESOURCES;
+	}
+
+	if (memory_type == EFI_RUNTIME_SERVICES_CODE ||
+	    memory_type == EFI_RUNTIME_SERVICES_DATA)
+		res->runtime = true;
+
+	res->flags |= IORESOURCE_EFI_ALLOC;
+
+	*memory = new_addr;
+	return EFI_SUCCESS;
+}
+
+static int free_efi_only(struct resource *res, void *data)
+{
+	int *nfreed = data;
+
+	if (!(res->flags & IORESOURCE_EFI_ALLOC)) {
+		pr_warn("refusing to free non-EFI allocated resource %s at 0x%llx\n",
+			res->name, res->start);
+		*nfreed = -1;
+		return false;
+	}
+
+	if (nfreed >= 0)
+		++*nfreed;
+	return true;
+}
+
+// SPDX-SnippetBegin
+// SPDX-License-Identifier: GPL-2.0+
+// SPDX-SnippetCopyrightText: 2016 Alexander Graf
+// SPDX-SnippetComment: Origin-URL: https://github.com/u-boot/u-boot/blob/aa703a816a62deb876a1e77ccff030a7cc60f344/lib/efi_loader/efi_memory.c
+
+/**
+ * efi_alloc_aligned_pages() - allocate aligned memory pages
+ *
+ * @len:		len in bytes
+ * @memory_type:	usage type of the allocated memory
+ * @align:		alignment in bytes
+ * @name:		name for informational purposes
+ * Return:		aligned memory or NULL
+ */
+void *efi_alloc_aligned_pages(u64 len, int memory_type, size_t align,
+			      const char *name)
+{
+	u64 req_pages = efi_size_in_pages(len);
+	u64 true_pages = req_pages + efi_size_in_pages(align) - 1;
+	u64 free_pages;
+	u64 aligned_mem;
+	efi_status_t r;
+	u64 mem;
+
+	/* align must be zero or a power of two */
+	if (align & (align - 1))
+		return NULL;
+
+	/* Check for overflow */
+	if (true_pages < req_pages)
+		return NULL;
+
+	if (align < EFI_PAGE_SIZE) {
+		r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type,
+				       req_pages, &mem, name);
+		return (r == EFI_SUCCESS) ? (void *)(uintptr_t)mem : NULL;
+	}
+
+	r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type,
+			       true_pages, &mem, name);
+	if (r != EFI_SUCCESS)
+		return NULL;
+
+	aligned_mem = ALIGN(mem, align);
+	/* Free pages before alignment */
+	free_pages = efi_size_in_pages(aligned_mem - mem);
+	if (free_pages)
+		efi_free_pages(mem, free_pages);
+
+	/* Free trailing pages */
+	free_pages = true_pages - (req_pages + free_pages);
+	if (free_pages) {
+		mem = aligned_mem + req_pages * EFI_PAGE_SIZE;
+		efi_free_pages(mem, free_pages);
+	}
+
+	return (void *)(uintptr_t)aligned_mem;
+}
+
+// SPDX-SnippetEnd
+
+/**
+ * efi_free_pages() - free memory pages
+ *
+ * @memory:	start of the memory area to be freed
+ * @pages:	number of pages to be freed
+ * Return:	status code
+ */
+efi_status_t efi_free_pages(uint64_t memory, size_t pages)
+{
+	size_t size = pages << EFI_PAGE_SHIFT;
+	struct memory_bank *bank;
+	int nfreed = 0;
+
+	for_each_memory_bank(bank)
+		release_region_range(bank->res, memory, size, free_efi_only, &nfreed);
+
+	if (!nfreed)
+		pr_warn("can't free %llx: not found\n", memory);
+	if (nfreed <= 0)
+		return EFI_INVALID_PARAMETER;
+
+	return EFI_SUCCESS;
+}
+
+static int efi_memory_desc_from_res(const struct resource *region,
+				     struct efi_memory_desc *desc)
+{
+	efi_physical_addr_t phys_start = EFI_PAGE_ALIGN(region->start);
+	efi_uintn_t npages = efi_size_in_pages(EFI_PAGE_ALIGN(region->end + 1) - phys_start);
+
+	if (!npages)
+		return 0;
+
+	desc->phys_start = phys_start;
+	desc->virt_start = efi_phys_to_virt(phys_start);
+	desc->npages = npages;
+
+	if (region->flags & IORESOURCE_TYPE_VALID) {
+		desc->type = resource_get_efi_memory_type(region);
+		desc->attrs = resource_get_efi_memory_attrs(region);
+	} else {
+		pr_warn("encountered SDRAM region 0x%pa-0x%pa without valid type\n",
+			&region->start, &region->end);
+		desc->type = EFI_RESERVED_TYPE;
+		desc->attrs = EFI_MEMORY_WB;
+	}
+
+	return 1;
+}
+
+/**
+ * efi_get_memory_map() - get map describing memory usage.
+ *
+ * @memory_map_size:	on entry the size, in bytes, of the memory map buffer,
+ *			on exit the size of the copied memory map
+ * @memory_map:		buffer to which the memory map is written
+ * @map_key:		key for the memory map
+ * @descriptor_size:	size of an individual memory descriptor
+ * @descriptor_version:	version number of the memory descriptor structure
+ * Return:		status code
+ */
+efi_status_t efi_get_memory_map(size_t *memory_map_size,
+			       struct efi_memory_desc *memory_map,
+			       efi_uintn_t *map_key,
+			       size_t *descriptor_size,
+			       uint32_t *descriptor_version)
+{
+	size_t map_size = 0;
+	int i = 0, map_entries = 0;
+	size_t provided_map_size;
+	struct memory_bank *bank;
+
+	if (!memory_map_size)
+		return EFI_INVALID_PARAMETER;
+
+	provided_map_size = *memory_map_size;
+
+	for_each_memory_bank(bank) {
+		for_each_memory_bank_region(bank, region) {
+			if (list_empty(&region->children)) {
+				map_entries++;
+				continue;
+			}
+
+			for_each_resource_region(region, bbregion)
+				map_entries++;
+		}
+	}
+
+	map_size = map_entries * sizeof(struct efi_memory_desc);
+
+	/* Note: some regions may end up being 0-sized after alignment to page
+	 * boundaries and those will be skipped later.
+	 *
+	 * It's fine wrt *memory_map_size though as worst case, this means we
+	 * ask the caller to allocate a little more memory than actually needed.
+	 *
+	 * TODO: Should we rather enforce resource allocations from memory banks
+	 * to be page aligned from the outset?
+	 */
+	*memory_map_size = map_size;
+
+	if (descriptor_size)
+		*descriptor_size = sizeof(struct efi_memory_desc);
+
+	if (descriptor_version)
+		*descriptor_version = EFI_MEMORY_DESCRIPTOR_VERSION;
+
+	if (provided_map_size < map_size)
+		return EFI_BUFFER_TOO_SMALL;
+
+	if (!memory_map)
+		return EFI_INVALID_PARAMETER;
+
+	for_each_memory_bank(bank) {
+		for_each_memory_bank_region(bank, region) {
+			if (list_empty(&region->children)) {
+				i += efi_memory_desc_from_res(region, &memory_map[i]);
+				continue;
+			}
+
+			for_each_resource_region(region, bbregion)
+				i += efi_memory_desc_from_res(bbregion, &memory_map[i]);
+		}
+	}
+
+	*memory_map_size = i * sizeof(struct efi_memory_desc);
+
+	if (map_key)
+		*map_key = efi_memory_map_key;
+
+	return EFI_SUCCESS;
+}
diff --git a/include/efi/loader.h b/include/efi/loader.h
new file mode 100644
index 000000000000..a5359f07f125
--- /dev/null
+++ b/include/efi/loader.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/* SPDX-SnippetCopyrightText: 2016 Alexander Graf */
+
+#ifndef _EFI_LOADER_H
+#define _EFI_LOADER_H 1
+
+#include <efi/types.h>
+#include <efi/services.h>
+#include <efi/memory.h>
+
+#define EFI_SPECIFICATION_VERSION (2 << 16 | 80)
+
+/* Key identifying current memory map */
+extern efi_uintn_t efi_memory_map_key;
+
+/* Allocate pages on the specified alignment */
+void *efi_alloc_aligned_pages(u64 len, int memory_type, size_t align,
+			      const char *name);
+/* More specific EFI memory allocator, called by EFI payloads */
+efi_status_t efi_allocate_pages(enum efi_allocate_type type,
+				enum efi_memory_type memory_type,
+				efi_uintn_t pages, uint64_t *memory,
+				const char *name);
+/* EFI memory free function. */
+efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages);
+/* Returns the EFI memory map */
+efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
+				struct efi_memory_desc *memory_map,
+				efi_uintn_t *map_key,
+				efi_uintn_t *descriptor_size,
+				uint32_t *descriptor_version);
+
+#endif /* _EFI_LOADER_H */
diff --git a/include/efi/types.h b/include/efi/types.h
index f157f7ffe106..e9acc4c497d1 100644
--- a/include/efi/types.h
+++ b/include/efi/types.h
@@ -10,6 +10,7 @@
 #include <linux/limits.h>
 #include <linux/stddef.h>
 #include <linux/compiler.h>
+#include <linux/align.h>
 #include <linux/uuid.h>
 
 typedef unsigned long efi_status_t;
@@ -120,6 +121,19 @@ enum efi_allocate_type {
 #define EFI_PAGE_SHIFT			12
 #define EFI_PAGE_SIZE			(1ULL << EFI_PAGE_SHIFT)
 #define EFI_PAGE_MASK			(EFI_PAGE_SIZE - 1)
+#define EFI_PAGE_ALIGN(val)		ALIGN((val), EFI_PAGE_SIZE)
+#define EFI_PAGE_ALIGN_DOWN(val)	ALIGN_DOWN((val), EFI_PAGE_SIZE)
+
+/**
+ * efi_size_in_pages() - convert size in bytes to size in pages
+ *
+ * This macro returns the number of EFI memory pages required to hold 'size'
+ * bytes.
+ *
+ * @size:	size in bytes
+ * Return:	size in pages
+ */
+#define efi_size_in_pages(size) (((size) + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT)
 
 #endif
 
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index d57defd20ee1..20c72e1b6cbb 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -58,6 +58,8 @@ struct resource {
 
 #define IORESOURCE_TYPE_VALID	0x00800000	/* type & attrs are valid */
 
+#define IORESOURCE_EFI_ALLOC	0x02000000	/* Resource allocated by barebox EFI loader */
+
 #define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */
 #define IORESOURCE_DISABLED	0x10000000
 #define IORESOURCE_UNSET	0x20000000
diff --git a/include/memory.h b/include/memory.h
index 6a6f0e2eb7d3..6189a0f65c50 100644
--- a/include/memory.h
+++ b/include/memory.h
@@ -26,6 +26,8 @@ int barebox_add_memory_bank(const char *name, resource_size_t start,
 				    resource_size_t size);
 
 #define for_each_memory_bank(mem)	list_for_each_entry(mem, &memory_banks, list)
+#define for_each_memory_bank_reverse(mem)	\
+	list_for_each_entry_reverse(mem, &memory_banks, list)
 #define for_each_reserved_region(mem, rsv) \
 	list_for_each_entry(rsv, &(mem)->res->children, sibling) \
 		if (!is_reserved_resource(rsv)) {} else
-- 
2.47.3




  parent reply	other threads:[~2025-12-18 11:13 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-18 10:37 [PATCH v1 00/54] efi: implement EFI loader support in barebox Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 01/54] efi: payload: initrd: fix type mismatch on 32-bit Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 02/54] efi: loader: switch over event/memory key type to efi_uintn_t Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 03/54] lib: vsprintf: print human-readable EFI GUIDs with %pUs Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 04/54] fs: fat: don't duplicate dentries when resolving differently cased paths Ahmad Fatoum
2025-12-18 10:37 ` Ahmad Fatoum [this message]
2025-12-18 10:37 ` [PATCH v1 06/54] efi: loader: add pool allocator Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 07/54] efi: types: add EFI_RUNTIME_SECTION Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 08/54] resource: assign memory banks a default type and attr Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 09/54] ARM: lds: add EFI runtime service section Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 10/54] ARM: move needed assembly routines into EFI runtime section Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 11/54] crypto: crc32: implement position independent CRC32 Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 12/54] efi: loader: add support for tracing calls back into UEFI Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 13/54] efi: loader: add table utility functions Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 14/54] lib: add charset helpers Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 15/54] efi: loader: add object handling API Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 16/54] efi: loader: add devicepath support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 17/54] efi: loader: add debug support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 18/54] efi: loader: add boot services support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 19/54] efi: loader: add support for runtime services before ExitBootServices Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 20/54] efi: loader: setup root node Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 21/54] efi: loader: add watchdog support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 22/54] efi: loader: move PE implementation out of common code Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 23/54] efi: loader: protocol: add file protocol support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 24/54] efi: loader: protocol: add Block IO support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 25/54] efi: loader: protocol: implement efi_file_from_path Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 26/54] efi: loader: boot: implement LoadImage BootService Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 27/54] efi: loader: add EFI load option handling Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 28/54] efi: loader: protocol: add graphical output protocol support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 29/54] efi: loader: protocol: add console support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 30/54] efi: loader: protocol: add HII support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 31/54] efi: loader: protocol: add unicode collation support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 32/54] efi: loader: protocol: add random number generator protocol Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 33/54] efi: loader: protocol: add device_path_utilities Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 34/54] efi: loader: support formatting only first device path node to text Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 35/54] efi: loader: protocol: add efi_device_path_to_text support Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 36/54] restart: allow drivers to register runtime restart handler Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 37/54] poweroff: allow drivers to register runtime poweroff handler Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 38/54] ARM: psci: client: register runtime service " Ahmad Fatoum
2025-12-18 10:37 ` [PATCH v1 39/54] ARM: psci: client: register runtime service restart handler Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 40/54] hardening: disable some features when EFI runtime support is enabled Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 41/54] filetype: add new filetype for efi-stubbed ARM zImages Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 42/54] bootm: add global.bootm.efi toggle Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 43/54] efi: loader: add ESP boot entry provider Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 44/54] efi: loader: add rudimentary EFI boot manager Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 45/54] efi: loader: implement bootm handler Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 46/54] efi: runtime: add EFI variable support Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 47/54] efi: loader: populate OsIndicationsSupported/PlatformLang variables Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 48/54] ARM: don't disable MMU when EFI booting Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 49/54] efi: runtime: add runtime service support after ExitBootServices Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 50/54] efi: runtime: add relocation check Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 51/54] efi: loader: CONFIG_EFI_RT_VOLATILE_STORE Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 52/54] efi: loader: support ExitBootServices Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 53/54] efi: loader: pass along SMBIOS table Ahmad Fatoum
2025-12-18 10:38 ` [PATCH v1 54/54] ARM: configs: add multi_v7/8_efiloader_defconfig Ahmad Fatoum

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=20251218111242.1527495-6-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=ahmad@a3f.at \
    --cc=barebox@lists.infradead.org \
    /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