Index: amd64/amd64/mem.c =================================================================== RCS file: /home/ncvs/src/sys/amd64/amd64/mem.c,v retrieving revision 1.122 diff -p -u -r1.122 mem.c --- amd64/amd64/mem.c 12 Mar 2008 21:43:50 -0000 1.122 +++ amd64/amd64/mem.c 7 Jun 2008 17:06:38 -0000 @@ -119,7 +119,7 @@ kmemphys: addr = trunc_page(v); eaddr = round_page(v + c); - if (addr < (vm_offset_t)KERNBASE) + if (addr < (vm_offset_t)VM_MIN_KERNEL_ADDRESS) return (EFAULT); for (; addr < eaddr; addr += PAGE_SIZE) if (pmap_extract(kernel_pmap, addr) == 0) Index: amd64/amd64/pmap.c =================================================================== RCS file: /home/ncvs/src/sys/amd64/amd64/pmap.c,v retrieving revision 1.619 diff -p -u -r1.619 pmap.c --- amd64/amd64/pmap.c 1 Jun 2008 07:36:59 -0000 1.619 +++ amd64/amd64/pmap.c 7 Jun 2008 18:22:48 -0000 @@ -441,8 +441,8 @@ create_pagetables(vm_paddr_t *firstaddr) /* Read-only from zero to physfree */ /* XXX not fully used, underneath 2M pages */ for (i = 0; (i << PAGE_SHIFT) < *firstaddr; i++) { - ((pt_entry_t *)KPTphys)[i] = i << PAGE_SHIFT; - ((pt_entry_t *)KPTphys)[i] |= PG_RW | PG_V | PG_G; + ((pt_entry_t *)KPTphys)[2048*512 + i] = i << PAGE_SHIFT; + ((pt_entry_t *)KPTphys)[2048*512 + i] |= PG_RW | PG_V | PG_G; } /* Now map the page tables at their location within PTmap */ @@ -454,15 +454,15 @@ create_pagetables(vm_paddr_t *firstaddr) /* Map from zero to end of allocations under 2M pages */ /* This replaces some of the KPTphys entries above */ for (i = 0; (i << PDRSHIFT) < *firstaddr; i++) { - ((pd_entry_t *)KPDphys)[i] = i << PDRSHIFT; - ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G; + ((pd_entry_t *)KPDphys)[2048 + i] = i << PDRSHIFT; + ((pd_entry_t *)KPDphys)[2048 + i] |= PG_RW | PG_V | PG_PS | PG_G; } /* And connect up the PD to the PDP */ for (i = 0; i < NKPDPE; i++) { - ((pdp_entry_t *)KPDPphys)[i + KPDPI] = KPDphys + + ((pdp_entry_t *)KPDPphys)[i + KPDPI - 4] = KPDphys + (i << PAGE_SHIFT); - ((pdp_entry_t *)KPDPphys)[i + KPDPI] |= PG_RW | PG_V | PG_U; + ((pdp_entry_t *)KPDPphys)[i + KPDPI - 4] |= PG_RW | PG_V | PG_U; } /* Now set up the direct map space using either 2MB or 1GB pages */ @@ -1673,7 +1673,7 @@ pmap_release(pmap_t pmap) static int kvm_size(SYSCTL_HANDLER_ARGS) { - unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE; + unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS; return sysctl_handle_long(oidp, &ksize, 0, req); } @@ -1703,7 +1703,7 @@ pmap_growkernel(vm_offset_t addr) mtx_assert(&kernel_map->system_mtx, MA_OWNED); if (kernel_vm_end == 0) { - kernel_vm_end = KERNBASE; + kernel_vm_end = VM_MIN_KERNEL_ADDRESS; nkpt = 0; while ((*pmap_pde(kernel_pmap, kernel_vm_end) & PG_V) != 0) { kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); Index: amd64/amd64/trap.c =================================================================== RCS file: /home/ncvs/src/sys/amd64/amd64/trap.c,v retrieving revision 1.326 diff -p -u -r1.326 trap.c --- amd64/amd64/trap.c 24 May 2008 06:32:26 -0000 1.326 +++ amd64/amd64/trap.c 7 Jun 2008 17:02:57 -0000 @@ -605,7 +605,7 @@ trap_pfault(frame, usermode) vm_offset_t eva = frame->tf_addr; va = trunc_page(eva); - if (va >= KERNBASE) { + if (va >= VM_MIN_KERNEL_ADDRESS) { /* * Don't allow user-mode faults in kernel address space. */ Index: amd64/include/pmap.h =================================================================== RCS file: /home/ncvs/src/sys/amd64/include/pmap.h,v retrieving revision 1.140 diff -p -u -r1.140 pmap.h --- amd64/include/pmap.h 4 Mar 2008 18:50:15 -0000 1.140 +++ amd64/include/pmap.h 7 Jun 2008 18:21:07 -0000 @@ -112,11 +112,11 @@ /* Initial number of kernel page tables. */ #ifndef NKPT /* 240 page tables needed to map 16G (120B "struct vm_page", 2M page tables). */ -#define NKPT 240 +#define NKPT (2048+240) #endif #define NKPML4E 1 /* number of kernel PML4 slots */ -#define NKPDPE 1 /* number of kernel PDP slots */ +#define NKPDPE 5 /* number of kernel PDP slots */ #define NKPDE (NKPDPE*NPDEPG) /* number of kernel PD slots */ #define NUPML4E (NPML4EPG/2) /* number of userland PML4 pages */ Index: amd64/include/vmparam.h =================================================================== RCS file: /home/ncvs/src/sys/amd64/include/vmparam.h,v retrieving revision 1.50 diff -p -u -r1.50 vmparam.h --- amd64/include/vmparam.h 27 Dec 2007 16:45:38 -0000 1.50 +++ amd64/include/vmparam.h 7 Jun 2008 19:57:38 -0000 @@ -153,7 +153,7 @@ */ #define VM_MAX_KERNEL_ADDRESS KVADDR(KPML4I, NPDPEPG-1, NKPDE-1, NPTEPG-1) -#define VM_MIN_KERNEL_ADDRESS KVADDR(KPML4I, KPDPI, 0, 0) +#define VM_MIN_KERNEL_ADDRESS KVADDR(KPML4I, KPDPI-4, 0, 0) #define DMAP_MIN_ADDRESS KVADDR(DMPML4I, 0, 0, 0) #define DMAP_MAX_ADDRESS KVADDR(DMPML4I+1, 0, 0, 0) @@ -175,7 +175,7 @@ /* virtual sizes (bytes) for various kernel submaps */ #ifndef VM_KMEM_SIZE -#define VM_KMEM_SIZE (12 * 1024 * 1024) +#define VM_KMEM_SIZE (2046 * 1024 * 1024) #endif /* @@ -192,7 +192,7 @@ * Ceiling on amount of kmem_map kva space. */ #ifndef VM_KMEM_SIZE_MAX -#define VM_KMEM_SIZE_MAX (400 * 1024 * 1024) +#define VM_KMEM_SIZE_MAX (2046 * 1024 * 1024) #endif /* initial pagein size of beginning of executable file */ Index: kern/link_elf_obj.c =================================================================== RCS file: /home/ncvs/src/sys/kern/link_elf_obj.c,v retrieving revision 1.99 diff -p -u -r1.99 link_elf_obj.c --- kern/link_elf_obj.c 23 May 2008 00:49:39 -0000 1.99 +++ kern/link_elf_obj.c 7 Jun 2008 05:15:40 -0000 @@ -664,6 +664,7 @@ link_elf_load_file(linker_class_t cls, c goto out; } ef->address = (caddr_t) vm_map_min(kernel_map); + mapbase = KERNBASE; error = vm_map_find(kernel_map, ef->object, 0, &mapbase, round_page(mapsize), TRUE, VM_PROT_ALL, VM_PROT_ALL, FALSE); if (error) { Index: vm/vm_kern.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_kern.c,v retrieving revision 1.134 diff -p -u -r1.134 vm_kern.c --- vm/vm_kern.c 10 May 2008 21:46:20 -0000 1.134 +++ vm/vm_kern.c 7 Jun 2008 05:06:14 -0000 @@ -497,7 +497,7 @@ kmem_init(start, end) /* N.B.: cannot use kgdb to debug, starting with this assignment ... */ kernel_map = m; (void) vm_map_insert(m, NULL, (vm_ooffset_t) 0, - VM_MIN_KERNEL_ADDRESS, start, VM_PROT_ALL, VM_PROT_ALL, + KERNBASE, start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); /* ... and ending with the completion of the above `insert' */ vm_map_unlock(m);