From 4daf20b2f1ac85f9d2c1c35cca7047876b97a2f7 Mon Sep 17 00:00:00 2001 From: Peter Grehan Date: Tue, 2 Mar 2004 06:49:21 +0000 Subject: [PATCH] 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 --- sys/powerpc/aim/mmu_oea.c | 4 ++++ sys/powerpc/include/sr.h | 6 ++++-- sys/powerpc/include/vmparam.h | 2 +- sys/powerpc/powerpc/mmu_oea.c | 4 ++++ sys/powerpc/powerpc/pmap.c | 4 ++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index ddab773ecc9..cdf3bce624c 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -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)); diff --git a/sys/powerpc/include/sr.h b/sys/powerpc/include/sr.h index e4a29ece7fe..4a5525a97b7 100644 --- a/sys/powerpc/include/sr.h +++ b/sys/powerpc/include/sr.h @@ -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 diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index 588d712c9a3..6bcea668bf9 100644 --- a/sys/powerpc/include/vmparam.h +++ b/sys/powerpc/include/vmparam.h @@ -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 */ diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c index ddab773ecc9..cdf3bce624c 100644 --- a/sys/powerpc/powerpc/mmu_oea.c +++ b/sys/powerpc/powerpc/mmu_oea.c @@ -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)); diff --git a/sys/powerpc/powerpc/pmap.c b/sys/powerpc/powerpc/pmap.c index ddab773ecc9..cdf3bce624c 100644 --- a/sys/powerpc/powerpc/pmap.c +++ b/sys/powerpc/powerpc/pmap.c @@ -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));