On my darp10-b the bootloader is loaded around 32GiB mark and so all BI_ADD with a static address end up way over 4GiB and are truncated when passed to the kernel. Instead keep the whole pointer until we move all bootinfos to the heap --- sys/arch/i386/stand/lib/bootinfo.h | 9 +++++++-- sys/arch/i386/stand/lib/exec.c | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/sys/arch/i386/stand/lib/bootinfo.h b/sys/arch/i386/stand/lib/bootinfo.h index 8def5f4d273..3173c06e6a1 100644 --- a/sys/arch/i386/stand/lib/bootinfo.h +++ b/sys/arch/i386/stand/lib/bootinfo.h @@ -28,17 +28,22 @@ #include <machine/bootinfo.h> -struct bootinfo { +struct bootinfo32 { uint32_t nentries; uint32_t entry[1]; }; +struct bootinfo { + uint32_t nentries; + uintptr_t entry[1]; +}; + extern struct bootinfo *bootinfo; #define BTINFO_MAX 64 #define BI_ALLOC(max) (bootinfo = alloc(sizeof(struct bootinfo) \ - + ((max) - 1) * sizeof(uint32_t))) \ + + ((max) - 1) * sizeof(uintptr_t))) \ ->nentries = 0 #define BI_FREE() dealloc(bootinfo, 0) diff --git a/sys/arch/i386/stand/lib/exec.c b/sys/arch/i386/stand/lib/exec.c index adddaab6aac..9b0e1e54425 100644 --- a/sys/arch/i386/stand/lib/exec.c +++ b/sys/arch/i386/stand/lib/exec.c @@ -564,13 +564,19 @@ exec_netbsd(const char *file, physaddr_t loadaddr, int boothowto, int floppy, entry = marks[MARK_ENTRY]; #ifdef EFIBOOT + struct bootinfo32 *bootinfo32 = alloc(sizeof(struct bootinfo32) + + (bootinfo->nentries - 1) + * sizeof(uint32_t)); + bootinfo32->nentries = bootinfo->nentries; + /* Copy bootinfo to safe arena. */ for (i = 0; i < bootinfo->nentries; i++) { struct btinfo_common *bi = (void *)(u_long)bootinfo->entry[i]; char *p = alloc(bi->len); memcpy(p, bi, bi->len); - bootinfo->entry[i] = vtophys(p); + bootinfo32->entry[i] = vtophys(p); } + boot_argv[2] = vtophys(bootinfo32); efi_kernel_start = marks[MARK_START]; efi_kernel_size = image_end - (efi_loadaddr + efi_kernel_start); -- 2.48.1