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

