summaryrefslogtreecommitdiffstats
path: root/sys/boot/pc98/loader/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/pc98/loader/main.c')
-rw-r--r--sys/boot/pc98/loader/main.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sys/boot/pc98/loader/main.c b/sys/boot/pc98/loader/main.c
index da14d0b..391c5e9 100644
--- a/sys/boot/pc98/loader/main.c
+++ b/sys/boot/pc98/loader/main.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <machine/bootinfo.h>
#include <machine/psl.h>
+#include <sys/param.h>
#include <sys/reboot.h>
#include "bootstrap.h"
@@ -77,6 +78,21 @@ extern char end[];
static void *heap_top;
static void *heap_bottom;
+static uint64_t
+pc98_loadaddr(u_int type, void *data, uint64_t addr)
+{
+ struct stat st;
+
+ if (type == LOAD_ELF)
+ return (roundup(addr, PAGE_SIZE));
+
+ /* We cannot use 15M-16M area on pc98. */
+ if (type == LOAD_RAW && addr < 0x1000000 && stat(data, &st) == 0 &&
+ (st.st_size == -1 || addr + st.st_size > 0xf00000))
+ addr = 0x1000000;
+ return (addr);
+}
+
int
main(void)
{
@@ -160,6 +176,7 @@ main(void)
archsw.arch_readin = i386_readin;
archsw.arch_isainb = isa_inb;
archsw.arch_isaoutb = isa_outb;
+ archsw.arch_loadaddr = pc98_loadaddr;
/*
* March through the device switch probing for things.
OpenPOWER on IntegriCloud