
From: Heinrich Schuchardt xypron.glpk@gmx.de Date: Sat, 4 Aug 2018 23:16:06 +0200
When applying a virtual memory map we have to update the pointer to the list of configuration tables.
Fixes: 4182a129ef73 ("efi_loader: allocate configuration table array") Reported-by: Mark Kettenis mark.kettenis@xs4all.nl Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
Hello Mark,
could you, please, test if this solves the problem.
Works on my Orange Pi PC2.
So FWIW,
Tested-by: Mark Kettenis kettenis@openbsd.org
Thanks,
Mark
Best regards
Heinrich
lib/efi_loader/efi_runtime.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 06958f23fa..45b7809dec 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -360,6 +360,7 @@ static efi_status_t EFIAPI efi_set_virtual_address_map( efi_physical_addr_t map_start = map->physical_start; efi_physical_addr_t map_len = map->num_pages << EFI_PAGE_SHIFT; efi_physical_addr_t map_end = map_start + map_len;
u64 off = map->virtual_start - map_start;
/* Adjust all mmio pointers in this region */ list_for_each(lhandle, &efi_runtime_mmio) {
@@ -370,11 +371,17 @@ static efi_status_t EFIAPI efi_set_virtual_address_map( link); if ((map_start <= lmmio->paddr) && (map_end >= lmmio->paddr)) {
}u64 off = map->virtual_start - map_start; uintptr_t new_addr = lmmio->paddr + off; *lmmio->ptr = (void *)new_addr; }
if ((map_start <= (uintptr_t)systab.tables) &&
(map_end >= (uintptr_t)systab.tables)) {
char *ptr = (char *)systab.tables;
ptr += off;
systab.tables = (struct efi_configuration_table *)ptr;
}
}
/* Move the actual runtime code over */
-- 2.18.0