Instead of allocating an arbitrary amount of extra space, let the EFI
authorkettenis <kettenis@openbsd.org>
Thu, 20 Jun 2024 22:03:02 +0000 (22:03 +0000)
committerkettenis <kettenis@openbsd.org>
Thu, 20 Jun 2024 22:03:02 +0000 (22:03 +0000)
devicetree fixup protocol less us how much space it needs.

Pointed out by Heinrich Schuchardt
ok tobhe@, mlarkin@

sys/arch/riscv64/stand/efiboot/efiboot.c

index 1f52ac3..c00dd44 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efiboot.c,v 1.9 2024/06/17 09:37:07 kettenis Exp $    */
+/*     $OpenBSD: efiboot.c,v 1.10 2024/06/20 22:03:02 kettenis Exp $   */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -983,8 +983,6 @@ efi_fdt(void)
        return fdt_sys;
 }
 
-#define EXTRA_DT_SPACE (32 * 1024)
-
 int
 fdt_load_override(char *file)
 {
@@ -1012,7 +1010,7 @@ fdt_load_override(char *file)
                printf("cannot open %s\n", path);
                return 0;
        }
-       dt_size = sb.st_size + EXTRA_DT_SPACE;
+       dt_size = sb.st_size;
        if (efi_memprobe_find(EFI_SIZE_TO_PAGES(dt_size),
            PAGE_SIZE, &addr) != EFI_SUCCESS) {
                printf("cannot allocate memory for %s\n", path);
@@ -1028,6 +1026,12 @@ fdt_load_override(char *file)
                sz = dt_size;
                status = dt_fixup->Fixup(dt_fixup, (void *)addr, &sz,
                    EFI_DT_APPLY_FIXUPS | EFI_DT_RESERVE_MEMORY);
+               if (status == EFI_BUFFER_TOO_SMALL) {
+                       BS->FreePages(addr, EFI_SIZE_TO_PAGES(dt_size));
+                       lseek(fd, 0, SEEK_SET);
+                       dt_size = sz;
+                       goto retry;
+               }
                if (status != EFI_SUCCESS)
                        panic("DT fixup failed: 0x%lx", status);
        }