From 573044a9263cf5a666fca80a0d5efded8cf153d2 Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Sun, 11 May 2003 22:42:29 +0000 Subject: [PATCH] For amd64 kernels, repeat the 1GB mapping over the entire address space instead of just at 0GB and 1GB marks. This gives more flexibility for the choice of KERNBASE. Approved by: re (amd64 stuff) --- sys/boot/i386/libi386/elf64_freebsd.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sys/boot/i386/libi386/elf64_freebsd.c b/sys/boot/i386/libi386/elf64_freebsd.c index d1033f29c7d..ec9f929741f 100644 --- a/sys/boot/i386/libi386/elf64_freebsd.c +++ b/sys/boot/i386/libi386/elf64_freebsd.c @@ -86,20 +86,20 @@ elf64_exec(struct preloaded_file *fp) bzero(PT3, PAGE_SIZE); bzero(PT2, PAGE_SIZE); - /* single PML4 entry */ - PT4[0] = (p4_entry_t)VTOP((uintptr_t)&PT3[0]); - PT4[0] |= PG_V | PG_RW | PG_U; - - /* Direct map 1GB at address zero */ - PT3[0] = (p3_entry_t)VTOP((uintptr_t)&PT2[0]); - PT3[0] |= PG_V | PG_RW | PG_U; - - /* Direct map 1GB at KERNBASE (hardcoded for now) */ - PT3[1] = (p3_entry_t)VTOP((uintptr_t)&PT2[0]); - PT3[1] |= PG_V | PG_RW | PG_U; - - /* 512 PG_PS (2MB) page mappings for 1GB of direct mapping */ + /* + * This is kinda brutal, but every single 1GB VM memory segment points to + * the same first 1GB of physical memory. But it is more than adequate. + */ for (i = 0; i < 512; i++) { + /* Each slot of the level 4 pages points to the same level 3 page */ + PT4[i] = (p4_entry_t)VTOP((uintptr_t)&PT3[0]); + PT4[i] |= PG_V | PG_RW | PG_U; + + /* Each slot of the level 3 pages points to the same level 2 page */ + PT3[i] = (p3_entry_t)VTOP((uintptr_t)&PT2[0]); + PT3[i] |= PG_V | PG_RW | PG_U; + + /* The level 2 page slots are mapped with 2MB pages for 1GB. */ PT2[i] = i * (2 * 1024 * 1024); PT2[i] |= PG_V | PG_RW | PG_PS | PG_U; }