Allocate fresh memory to put our device tree into, to make sure we have least
authorpatrick <patrick@openbsd.org>
Tue, 26 Oct 2021 14:10:02 +0000 (14:10 +0000)
committerpatrick <patrick@openbsd.org>
Tue, 26 Oct 2021 14:10:02 +0000 (14:10 +0000)
one page of free space for us to extend into.  Fixes booting on VMware Fusion.

ok kettenis@

sys/arch/arm64/stand/efiboot/efiboot.c
sys/arch/armv7/stand/efiboot/efiboot.c

index a0de957..fb3f646 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efiboot.c,v 1.35 2021/10/26 10:45:55 patrick Exp $    */
+/*     $OpenBSD: efiboot.c,v 1.36 2021/10/26 14:10:02 patrick Exp $    */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -532,6 +532,7 @@ efi_makebootargs(char *bootargs, int howto)
        u_char zero[8] = { 0 };
        uint64_t uefi_system_table = htobe64((uintptr_t)ST);
        uint32_t boothowto = htobe32(howto);
+       EFI_PHYSICAL_ADDRESS addr;
        void *node;
        size_t len;
        int i;
@@ -547,6 +548,16 @@ efi_makebootargs(char *bootargs, int howto)
        if (fdt == NULL || acpi)
                fdt = efi_acpi();
 
+       if (!fdt_get_size(fdt))
+               return NULL;
+
+       len = roundup(fdt_get_size(fdt) + PAGE_SIZE, PAGE_SIZE);
+       if (BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
+           EFI_SIZE_TO_PAGES(len), &addr) == EFI_SUCCESS) {
+               memcpy((void *)addr, fdt, fdt_get_size(fdt));
+               fdt = (void *)addr;
+       }
+
        if (!fdt_init(fdt))
                return NULL;
 
index 9886d5b..70e6bbb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efiboot.c,v 1.36 2021/10/26 10:45:55 patrick Exp $    */
+/*     $OpenBSD: efiboot.c,v 1.37 2021/10/26 14:10:02 patrick Exp $    */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -487,6 +487,7 @@ efi_makebootargs(char *bootargs, int howto)
        u_char zero[8] = { 0 };
        uint64_t uefi_system_table = htobe64((uintptr_t)ST);
        uint32_t boothowto = htobe32(howto);
+       EFI_PHYSICAL_ADDRESS addr;
        void *node;
        size_t len;
        int i;
@@ -499,6 +500,16 @@ efi_makebootargs(char *bootargs, int howto)
                }
        }
 
+       if (!fdt_get_size(fdt))
+               return NULL;
+
+       len = roundup(fdt_get_size(fdt) + PAGE_SIZE, PAGE_SIZE);
+       if (BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
+           EFI_SIZE_TO_PAGES(len), &addr) == EFI_SUCCESS) {
+               memcpy((void *)addr, fdt, fdt_get_size(fdt));
+               fdt = (void *)addr;
+       }
+
        if (!fdt_init(fdt))
                return NULL;