summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2006-10-29 14:50:58 +0000
committerru <ru@FreeBSD.org>2006-10-29 14:50:58 +0000
commitf0e19d90c0fc3bf47cab297e03cd0fc782076767 (patch)
tree8b907f11b53d6e4725c11716fdf425629834fc0a /sys/boot
parent248a5cec67d92bfe2d6ecfe22e5e82d80fbbbdc6 (diff)
downloadFreeBSD-src-f0e19d90c0fc3bf47cab297e03cd0fc782076767.zip
FreeBSD-src-f0e19d90c0fc3bf47cab297e03cd0fc782076767.tar.gz
Because the BTX mini-kernel now uses flat memory mode and clients
are no longer limited to a virtual address space of 16 megabytes, only mask high two bits of a virtual address. This allows to load larger kernels (up to 1 gigabyte). Not masking addresses at all was a bad idea on machines with less than >3G of memory -- kernels are linked at 0xc0xxxxxx, and that would attempt to load a kernel at above 3G. By masking only two highest bits we stay within the safe limits while still allowing to boot larger kernels. (This is a safer reimplmentation of sys/boot/i386/boot2/boot.2.c rev. 1.71.) Prodded by: jhb Tested by: nyan (pc98)
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/common/load_elf.c2
-rw-r--r--sys/boot/i386/boot2/boot2.c6
-rw-r--r--sys/boot/i386/gptboot/gptboot.c6
-rw-r--r--sys/boot/i386/libi386/elf32_freebsd.c2
-rw-r--r--sys/boot/pc98/boot2/boot.c4
5 files changed, 10 insertions, 10 deletions
diff --git a/sys/boot/common/load_elf.c b/sys/boot/common/load_elf.c
index cd983a9..be8f881 100644
--- a/sys/boot/common/load_elf.c
+++ b/sys/boot/common/load_elf.c
@@ -263,7 +263,7 @@ __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
#if __ELF_WORD_SIZE == 64
off = - (off & 0xffffffffff000000ull);/* x86_64 relocates after locore */
#else
- off = - (off & 0xff000000u); /* i386 relocates after locore */
+ off = - (off & 0xc0000000u); /* i386 relocates after locore */
#endif
#else
off = 0; /* other archs use direct mapped kernels */
diff --git a/sys/boot/i386/boot2/boot2.c b/sys/boot/i386/boot2/boot2.c
index df3fe81..b07c9ed 100644
--- a/sys/boot/i386/boot2/boot2.c
+++ b/sys/boot/i386/boot2/boot2.c
@@ -334,7 +334,7 @@ load(void)
return;
}
if (fmt == 0) {
- addr = hdr.ex.a_entry & 0xffffff;
+ addr = hdr.ex.a_entry & 0x3fffffff;
p = PTOV(addr);
fs_off = PAGE_SIZE;
if (xfsread(ino, p, hdr.ex.a_text))
@@ -368,7 +368,7 @@ load(void)
j++;
}
for (i = 0; i < 2; i++) {
- p = PTOV(ep[i].p_paddr & 0xffffff);
+ p = PTOV(ep[i].p_paddr & 0x3fffffff);
fs_off = ep[i].p_offset;
if (xfsread(ino, p, ep[i].p_filesz))
return;
@@ -389,7 +389,7 @@ load(void)
p += es[i].sh_size;
}
}
- addr = hdr.eh.e_entry & 0xffffff;
+ addr = hdr.eh.e_entry & 0x3fffffff;
}
bootinfo.bi_esymtab = VTOP(p);
bootinfo.bi_kernelname = VTOP(kname);
diff --git a/sys/boot/i386/gptboot/gptboot.c b/sys/boot/i386/gptboot/gptboot.c
index df3fe81..b07c9ed 100644
--- a/sys/boot/i386/gptboot/gptboot.c
+++ b/sys/boot/i386/gptboot/gptboot.c
@@ -334,7 +334,7 @@ load(void)
return;
}
if (fmt == 0) {
- addr = hdr.ex.a_entry & 0xffffff;
+ addr = hdr.ex.a_entry & 0x3fffffff;
p = PTOV(addr);
fs_off = PAGE_SIZE;
if (xfsread(ino, p, hdr.ex.a_text))
@@ -368,7 +368,7 @@ load(void)
j++;
}
for (i = 0; i < 2; i++) {
- p = PTOV(ep[i].p_paddr & 0xffffff);
+ p = PTOV(ep[i].p_paddr & 0x3fffffff);
fs_off = ep[i].p_offset;
if (xfsread(ino, p, ep[i].p_filesz))
return;
@@ -389,7 +389,7 @@ load(void)
p += es[i].sh_size;
}
}
- addr = hdr.eh.e_entry & 0xffffff;
+ addr = hdr.eh.e_entry & 0x3fffffff;
}
bootinfo.bi_esymtab = VTOP(p);
bootinfo.bi_kernelname = VTOP(kname);
diff --git a/sys/boot/i386/libi386/elf32_freebsd.c b/sys/boot/i386/libi386/elf32_freebsd.c
index 5f66622..c1363bc 100644
--- a/sys/boot/i386/libi386/elf32_freebsd.c
+++ b/sys/boot/i386/libi386/elf32_freebsd.c
@@ -65,7 +65,7 @@ elf32_exec(struct preloaded_file *fp)
err = bi_load32(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend);
if (err != 0)
return(err);
- entry = ehdr->e_entry & 0xffffff;
+ entry = ehdr->e_entry & 0x3fffffff;
#ifdef DEBUG
printf("Start @ 0x%lx ...\n", entry);
diff --git a/sys/boot/pc98/boot2/boot.c b/sys/boot/pc98/boot2/boot.c
index feccc7e..96dfb72 100644
--- a/sys/boot/pc98/boot2/boot.c
+++ b/sys/boot/pc98/boot2/boot.c
@@ -199,9 +199,9 @@ loadprog(void)
/*
* We assume that the entry address is the same as the lowest text
* address and that the kernel startup code handles relocation by
- * this address rounded down to a multiple of 16M.
+ * this address rounded down to a multiple of 1G.
*/
- startaddr = head.a_entry & 0x00FFFFFF;
+ startaddr = head.a_entry & 0x3FFFFFFF;
addr = startaddr;
printf("Booting %d:%s(%d,%c)%s @ 0x%x\n"
, dosdev & 0x0f
OpenPOWER on IntegriCloud