From 7ba7381f14e589e738459b764610c067451f6578 Mon Sep 17 00:00:00 2001 From: kettenis Date: Thu, 20 Jun 2024 22:03:23 +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/armv7/stand/efiboot/efiboot.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sys/arch/armv7/stand/efiboot/efiboot.c b/sys/arch/armv7/stand/efiboot/efiboot.c index 0e5ac7dcaa5..ba34d5c511f 100644 --- a/sys/arch/armv7/stand/efiboot/efiboot.c +++ b/sys/arch/armv7/stand/efiboot/efiboot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: efiboot.c,v 1.41 2024/06/17 09:12:45 kettenis Exp $ */ +/* $OpenBSD: efiboot.c,v 1.42 2024/06/20 22:03:23 kettenis Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko @@ -1006,8 +1006,6 @@ efi_fdt(void) return fdt_sys; } -#define EXTRA_DT_SPACE (32 * 1024) - int fdt_load_override(char *file) { @@ -1035,7 +1033,8 @@ 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; +retry: if (efi_memprobe_find(EFI_SIZE_TO_PAGES(dt_size), PAGE_SIZE, EfiLoaderData, &addr) != EFI_SUCCESS) { printf("cannot allocate memory for %s\n", path); @@ -1051,6 +1050,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