efi_loader: relocate pointer to tables
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 4 Aug 2018 21:16:06 +0000 (23:16 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 20 Aug 2018 09:39:19 +0000 (11:39 +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>
Tested-by: Mark Kettenis <kettenis@openbsd.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_runtime.c

index 06958f23fa13155bfad0996d26860341490591bb..45b7809decc12a3af43662cf56e86c64c1dbb85a 100644 (file)
@@ -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 */