efi_loader: fix memory allocation on sandbox
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 5 Jan 2019 22:41:36 +0000 (23:41 +0100)
committerAlexander Graf <agraf@suse.de>
Wed, 13 Feb 2019 08:40:05 +0000 (09:40 +0100)
Commit 7b78d6438a2b ("efi_loader: Reserve unaccessible memory") introduced
a comparison between RAM top and RAM start that was not known at the time
when the patch of commit 49759743bf09 ("efi_loader: eliminate sandbox
addresses") was written.

The sandbox uses an address space that is only relevant in the sandbox
context. We have to map ram_top from the sandbox address space to the
physical address space before using it in the EFI subsystem.

Fixes: 49759743bf09 ("efi_loader: eliminate sandbox addresses")
Fixes: 7b78d6438a2b ("efi_loader: Reserve unaccessible memory")
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_memory.c

index 4bb517473e447393f0518b4ec1d86e9007ffc060..ebd2b36c03d7042700ea3a21ffa9155ef06f4fc8 100644 (file)
@@ -554,6 +554,12 @@ __weak void efi_add_known_memory(void)
        u64 ram_top = board_get_usable_ram_top(0) & ~EFI_PAGE_MASK;
        int i;
 
+       /*
+        * ram_top is just outside mapped memory. So use an offset of one for
+        * mapping the sandbox address.
+        */
+       ram_top = (uintptr_t)map_sysmem(ram_top - 1, 0) + 1;
+
        /* Fix for 32bit targets with ram_top at 4G */
        if (!ram_top)
                ram_top = 0x100000000ULL;