Increase kernel VA from 256Mb to 512Mb by shifting the segment used

for user copyinout down to 12, and keeping segments 13/14 for
kernel VA.

It would be nice to have more available, but segments lower than
this are reserved for either memory or 1:1 mapped device i/o,
and seg 15 is OpenFirmware ROM. Also, the effort to keep OpenFirmware
available for callbacks limits the use of VA-mapped segments.
Fortunately UMA_MD_SMALL_ALLOC takes away a lot of VM pressure.

Obtained from:  NetBSD
This commit is contained in:
Peter Grehan 2004-03-02 06:49:21 +00:00
parent 9c3078173a
commit 4daf20b2f1
5 changed files with 17 additions and 3 deletions

View File

@ -698,6 +698,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
*/
pmap_pinit(&ofw_pmap);
ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
if ((chosen = OF_finddevice("/chosen")) == -1)
panic("pmap_bootstrap: can't find /chosen");
OF_getprop(chosen, "mmu", &mmui, 4);
@ -751,6 +752,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
kernel_pmap->pm_sr[i] = EMPTY_SEGMENT;
}
kernel_pmap->pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_active = ~0;
/*
@ -1385,6 +1387,8 @@ pmap_pinit(pmap_t pmap)
int i, mask;
u_int entropy;
KASSERT((int)pmap < VM_MIN_KERNEL_ADDRESS, ("pmap_pinit: virt pmap"));
entropy = 0;
__asm __volatile("mftb %0" : "=r"(entropy));

View File

@ -42,10 +42,12 @@
#define SR_VSID_MASK 0x00ffffff /* Virtual Segment ID mask */
/* Kernel segment register usage */
#define USER_SR 13
#define KERNEL_SR 14
#define USER_SR 12
#define KERNEL_SR 13
#define KERNEL2_SR 14
#define KERNEL_VSIDBITS 0xfffff
#define KERNEL_SEGMENT (0xfffff0 + KERNEL_SR)
#define KERNEL2_SEGMENT (0xfffff0 + KERNEL2_SR)
#define EMPTY_SEGMENT 0xfffff0
#define USER_ADDR ((void *)(USER_SR << ADDR_SR_SHFT))
#define SEGMENT_LENGTH 0x10000000

View File

@ -94,7 +94,7 @@
#define VM_MAXUSER_ADDRESS ((vm_offset_t)0x7ffff000)
#define VM_MAX_ADDRESS VM_MAXUSER_ADDRESS
#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)(KERNEL_SR << ADDR_SR_SHFT))
#define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + SEGMENT_LENGTH - 1)
#define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 2*SEGMENT_LENGTH - 1)
#define KERNBASE 0x100000 /* start of kernel virtual */

View File

@ -698,6 +698,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
*/
pmap_pinit(&ofw_pmap);
ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
if ((chosen = OF_finddevice("/chosen")) == -1)
panic("pmap_bootstrap: can't find /chosen");
OF_getprop(chosen, "mmu", &mmui, 4);
@ -751,6 +752,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
kernel_pmap->pm_sr[i] = EMPTY_SEGMENT;
}
kernel_pmap->pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_active = ~0;
/*
@ -1385,6 +1387,8 @@ pmap_pinit(pmap_t pmap)
int i, mask;
u_int entropy;
KASSERT((int)pmap < VM_MIN_KERNEL_ADDRESS, ("pmap_pinit: virt pmap"));
entropy = 0;
__asm __volatile("mftb %0" : "=r"(entropy));

View File

@ -698,6 +698,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
*/
pmap_pinit(&ofw_pmap);
ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
if ((chosen = OF_finddevice("/chosen")) == -1)
panic("pmap_bootstrap: can't find /chosen");
OF_getprop(chosen, "mmu", &mmui, 4);
@ -751,6 +752,7 @@ pmap_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
kernel_pmap->pm_sr[i] = EMPTY_SEGMENT;
}
kernel_pmap->pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_active = ~0;
/*
@ -1385,6 +1387,8 @@ pmap_pinit(pmap_t pmap)
int i, mask;
u_int entropy;
KASSERT((int)pmap < VM_MIN_KERNEL_ADDRESS, ("pmap_pinit: virt pmap"));
entropy = 0;
__asm __volatile("mftb %0" : "=r"(entropy));