[PATCH 2/3] bootloader: Handle 64-bit bootinfo

Vladimir Serbinenko <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.