[PATCH v4 4/5] efi: Reserve some memory for initial use

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Oct 12 00:01:54 CEST 2024



Am 11. Oktober 2024 23:21:25 MESZ schrieb Simon Glass <sjg at chromium.org>:
>The 'point of cooperation' is where U-Boot starts allowing EFI to use
>memory outside of the U-Boot region. Until that point, it is desirable
>to keep more below U-Boot free for loading images.
>
>Reserve a small region for this purpose.

Your commit message provides no clue why this should be needed.

If we ensure thst LMB is up before EFI initialization, the EFI subsystem will be able to allocate memory from there.

Best regards

Heinrich


>
>Signed-off-by: Simon Glass <sjg at chromium.org>
>---
>
>(no changes since v1)
>
> include/asm-generic/global_data.h |  6 ++++++
> lib/efi_loader/efi_memory.c       | 21 +++++++++++++++++++++
> test/py/tests/test_event_dump.py  |  1 +
> 3 files changed, 28 insertions(+)
>
>diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
>index d6c15e2c406..20705be14dd 100644
>--- a/include/asm-generic/global_data.h
>+++ b/include/asm-generic/global_data.h
>@@ -443,6 +443,12 @@ struct global_data {
> 	 */
> 	struct upl *upl;
> #endif
>+#if CONFIG_IS_ENABLED(EFI_LOADER)
>+	/**
>+	 * @efi_region: Start of EFI's early-memory region
>+	 */
>+	ulong efi_region;
>+#endif
> };
> #ifndef DO_DEPS_ONLY
> static_assert(sizeof(struct global_data) == GD_SIZE);
>diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>index 50cb2f3898b..9cc33397371 100644
>--- a/lib/efi_loader/efi_memory.c
>+++ b/lib/efi_loader/efi_memory.c
>@@ -24,6 +24,12 @@ DECLARE_GLOBAL_DATA_PTR;
> /* Magic number identifying memory allocated from pool */
> #define EFI_ALLOC_POOL_MAGIC 0x1fe67ddf6491caa2
> 
>+/*
>+ * Amount of memory to reserve for EFI before relocation. This must be a
>+ * multiple of EFI_PAGE_SIZE
>+ */
>+#define EFI_EARLY_REGION_SIZE	SZ_256K
>+
> efi_uintn_t efi_memory_map_key;
> 
> struct efi_mem_list {
>@@ -944,3 +950,18 @@ int efi_memory_init(void)
> 
> 	return 0;
> }
>+
>+static int reserve_efi_region(void)
>+{
>+	/*
>+	 * Reserve some memory for EFI. Since pool allocations consume 4KB each
>+	 * and there are three allocations, allow 16KB of memory, enough for
>+	 * four. This can be increased as needed.
>+	 */
>+	gd->efi_region = ALIGN_DOWN(gd->start_addr_sp - EFI_EARLY_REGION_SIZE,
>+				    SZ_4K);
>+	gd->start_addr_sp = gd->efi_region;
>+
>+	return 0;
>+}
>+EVENT_SPY_SIMPLE(EVT_RESERVE, reserve_efi_region);
>diff --git a/test/py/tests/test_event_dump.py b/test/py/tests/test_event_dump.py
>index e282c67335c..e36fc6a1586 100644
>--- a/test/py/tests/test_event_dump.py
>+++ b/test/py/tests/test_event_dump.py
>@@ -20,5 +20,6 @@ EVT_FT_FIXUP          bootmeth_vbe_ft_fixup           .*boot/vbe_request.c:.*
> EVT_FT_FIXUP          bootmeth_vbe_simple_ft_fixup    .*boot/vbe_simple_os.c:.*
> EVT_LAST_STAGE_INIT   install_smbios_table            .*lib/efi_loader/efi_smbios.c:.*
> EVT_MISC_INIT_F       sandbox_early_getopt_check      .*arch/sandbox/cpu/start.c:.*
>+EVT_RESERVE           reserve_efi_region              .*lib/efi_loader/efi_memory.c:.*
> EVT_TEST              h_adder_simple                  .*test/common/event.c:'''
>     assert re.match(expect, out, re.MULTILINE) is not None


More information about the U-Boot mailing list