On Sun, Mar 02, 2025 at 03:18:08PM +0300, Vladimir Serbinenko wrote:
> 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
> 

This needs to consider the boot -> kernel ABI carefully; currently it
looks like this breaks non-EFI boot with argv[2].

Reply via email to