[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