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 <[email protected]>
---
v2:
        Use uintptr_t instead of void* to simplify code.
        Use EFI_PAGE_SIZE instead of EFI_PAGE_MASK.
---
 lib/efi_loader/efi_acpi.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c
index 046986a7518..43a6cbe6cfc 100644
--- a/lib/efi_loader/efi_acpi.c
+++ b/lib/efi_loader/efi_acpi.c
@@ -25,7 +25,8 @@ static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
  */
 efi_status_t efi_acpi_register(void)
 {
-       ulong addr, start, end;
+       void *addr;
+       uintptr_t start, end;
        efi_status_t ret;
 
        /*
@@ -37,39 +38,45 @@ 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);
+               start = ALIGN_DOWN((uintptr_t)map_sysmem(gd->arch.table_start,
+                                                        0),
+                                  EFI_PAGE_SIZE);
+               end = ALIGN((uintptr_t)map_sysmem(gd->arch.table_end, 0),
+                           EFI_PAGE_SIZE);
                ret = efi_add_memory_map(start, end - 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);
+                       start = ALIGN_DOWN(
+                               (uintptr_t)map_sysmem(gd->arch.table_start_high,
+                                                     0),
+                               EFI_PAGE_SIZE);
+                       end = ALIGN((uintptr_t)map_sysmem(
+                                           gd->arch.table_end_high, 0),
+                                   EFI_PAGE_SIZE);
                        ret = efi_add_memory_map(start, end - 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

Reply via email to