[PATCH 1/3] efi_loader: use pointers in efi_acpi_register()
Heinrich Schuchardt
heinrich.schuchardt at canonical.com
Thu May 21 20:50:23 CEST 2026
Both efi_add_memory_map() and efi_install_configuration_table() expect
pointers and not virtual sandbox addresses.
We need to convert the virtual sandbox addresses in efi_acpi_register() to
pointers in memory before using them.
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
---
lib/efi_loader/efi_acpi.c | 42 ++++++++++++++++++++++++---------------
1 file changed, 26 insertions(+), 16 deletions(-)
diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c
index 046986a7518..70cb896ac25 100644
--- a/lib/efi_loader/efi_acpi.c
+++ b/lib/efi_loader/efi_acpi.c
@@ -25,7 +25,7 @@ static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
*/
efi_status_t efi_acpi_register(void)
{
- ulong addr, start, end;
+ void *addr, *start, *end;
efi_status_t ret;
/*
@@ -37,39 +37,49 @@ efi_status_t efi_acpi_register(void)
*/
if (IS_ENABLED(CONFIG_BLOBLIST_TABLES)) {
int size;
- void *tab = bloblist_get_blob(BLOBLISTT_ACPI_TABLES, &size);
- if (!tab)
+ addr = bloblist_get_blob(BLOBLISTT_ACPI_TABLES, &size);
+
+ if (!addr)
return EFI_NOT_FOUND;
- addr = map_to_sysmem(tab);
- ret = efi_add_memory_map(addr, size,
+ ret = efi_add_memory_map((uintptr_t)addr, size,
EFI_ACPI_RECLAIM_MEMORY);
if (ret != EFI_SUCCESS)
return ret;
} else {
/* Mark space used for tables */
- start = ALIGN_DOWN(gd->arch.table_start, EFI_PAGE_MASK);
- end = ALIGN(gd->arch.table_end, EFI_PAGE_MASK);
- ret = efi_add_memory_map(start, end - start,
+ start = (void *)ALIGN_DOWN(
+ (uintptr_t)map_sysmem(gd->arch.table_start, 0),
+ (uintptr_t)EFI_PAGE_MASK);
+ end = (void *)ALIGN((uintptr_t)map_sysmem(gd->arch.table_end,
+ 0),
+ (uintptr_t)EFI_PAGE_MASK);
+ ret = efi_add_memory_map((uintptr_t)start,
+ (uintptr_t)end - (uintptr_t)start,
EFI_ACPI_RECLAIM_MEMORY);
if (ret != EFI_SUCCESS)
return ret;
if (gd->arch.table_start_high) {
- start = ALIGN_DOWN(gd->arch.table_start_high,
- EFI_PAGE_MASK);
- end = ALIGN(gd->arch.table_end_high, EFI_PAGE_MASK);
- ret = efi_add_memory_map(start, end - start,
+ start = (void *)ALIGN_DOWN(
+ (uintptr_t)map_sysmem(gd->arch.table_start_high,
+ 0),
+ (uintptr_t)EFI_PAGE_MASK);
+ end = (void *)ALIGN((uintptr_t)map_sysmem(
+ gd->arch.table_end_high, 0),
+ EFI_PAGE_MASK);
+ ret = efi_add_memory_map((uintptr_t)start,
+ (uintptr_t)end -
+ (uintptr_t)start,
EFI_ACPI_RECLAIM_MEMORY);
if (ret != EFI_SUCCESS)
return ret;
}
- addr = gd_acpi_start();
+ addr = map_sysmem(gd_acpi_start(), 0);
}
- log_debug("EFI using ACPI tables at %lx\n", addr);
+ log_debug("EFI using ACPI tables at %p\n", addr);
/* And expose them to our EFI payload */
- return efi_install_configuration_table(&acpi_guid,
- (void *)(ulong)addr);
+ return efi_install_configuration_table(&acpi_guid, addr);
}
--
2.53.0
More information about the U-Boot
mailing list