From db92797203566bd6a7553c25bc8268483abd74da Mon Sep 17 00:00:00 2001 From: kettenis Date: Thu, 20 Jun 2024 22:03:02 +0000 Subject: [PATCH] Instead of allocating an arbitrary amount of extra space, let the EFI 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 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sys/arch/riscv64/stand/efiboot/efiboot.c b/sys/arch/riscv64/stand/efiboot/efiboot.c index 1f52ac37859..c00dd44350f 100644 --- a/sys/arch/riscv64/stand/efiboot/efiboot.c +++ b/sys/arch/riscv64/stand/efiboot/efiboot.c @@ -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 @@ -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); } -- 2.20.1