From da6d4298b77d77eec8000b98f85e940db5f74bbb Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Sun, 29 Oct 2006 14:50:58 +0000 Subject: [PATCH] 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) --- sys/boot/common/load_elf.c | 2 +- sys/boot/i386/boot2/boot2.c | 6 +++--- sys/boot/i386/gptboot/gptboot.c | 6 +++--- sys/boot/i386/libi386/elf32_freebsd.c | 2 +- sys/boot/pc98/boot2/boot.c | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/boot/common/load_elf.c b/sys/boot/common/load_elf.c index cd983a982db..be8f8815b24 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 df3fe81d17c..b07c9eda5ba 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 df3fe81d17c..b07c9eda5ba 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 5f66622add9..c1363bc3871 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 feccc7ec035..96dfb721d1a 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