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]> --- 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

