svn commit: r205085 - in projects/ppc64/sys/powerpc: aim include ofw powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Fri Mar 12 15:57:56 UTC 2010


Author: nwhitehorn
Date: Fri Mar 12 15:57:56 2010
New Revision: 205085
URL: http://svn.freebsd.org/changeset/base/205085

Log:
  Don't pretend we are limited to a 32-bit address space any more, and move
  KVA from its previous cramped 512 MB slot to an expansive 1024 TB domain
  in high memory. Next on the list is actually worrying about SLB
  replacement so we can use more than 16 GB of it.

Modified:
  projects/ppc64/sys/powerpc/aim/machdep.c
  projects/ppc64/sys/powerpc/aim/mmu_oea64.c
  projects/ppc64/sys/powerpc/aim/trap.c
  projects/ppc64/sys/powerpc/aim/trap_subr64.S
  projects/ppc64/sys/powerpc/include/vmparam.h
  projects/ppc64/sys/powerpc/ofw/ofw_real.c
  projects/ppc64/sys/powerpc/powerpc/exec_machdep.c

Modified: projects/ppc64/sys/powerpc/aim/machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/machdep.c	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/aim/machdep.c	Fri Mar 12 15:57:56 2010	(r205085)
@@ -493,7 +493,7 @@ powerpc_init(vm_offset_t startkernel, vm
 	bcopy(&dsitrap,  (void *)(EXC_DSI + trap_offset),  (size_t)&dsisize);
 	bcopy(generictrap, (void *)EXC_ISI,  (size_t)&trapsize);
 	#ifdef __powerpc64__
-	bcopy(&dsitrap,	   (void *)EXC_DSE,  (size_t)&dsisize);
+	bcopy(generictrap, (void *)EXC_DSE,  (size_t)&trapsize);
 	bcopy(generictrap, (void *)EXC_ISE,  (size_t)&trapsize);
 	#endif
 	bcopy(generictrap, (void *)EXC_EXI,  (size_t)&trapsize);
@@ -851,9 +851,18 @@ va_to_vsid(pmap_t pm, vm_offset_t va)
 	if (slbv == 0) {
 		slbv = moea64_get_unique_vsid() << SLBV_VSID_SHIFT;
 		for (i = 0; i < sizeof(pm->pm_slb)/sizeof(pm->pm_slb[0]); i++) {
+			if (pm == kernel_pmap && i == USER_SR)
+				continue;
+
 			if (!(pm->pm_slb[i].slbe & SLBE_VALID)) {
 				pm->pm_slb[i].slbv = slbv;
 				pm->pm_slb[i].slbe = slbe | i;
+
+				if (pm == kernel_pmap && pmap_bootstrapped) {
+					__asm __volatile ("slbmte %0, %1" :: 
+					    "r"(kernel_pmap->pm_slb[i].slbv),
+					    "r"(kernel_pmap->pm_slb[i].slbe)); 
+				}
 				break;
 			}
 		}

Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/mmu_oea64.c	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/aim/mmu_oea64.c	Fri Mar 12 15:57:56 2010	(r205085)
@@ -946,13 +946,14 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o
 	 * Initialize the kernel pmap (which is statically allocated).
 	 */
 	#ifdef __powerpc64__
-	for (i = 0; i < 16; i++) {
-		kernel_pmap->pm_slb[i].slbv = ((KERNEL_VSIDBITS << 17) | i) <<
-		    SLBV_VSID_SHIFT;
-		kernel_pmap->pm_slb[i].slbe = ((uint64_t)i << SLBE_ESID_SHIFT) |
-		    SLBE_VALID | i;
-	}
-	kernel_pmap->pm_slb[USER_SR].slbe = 0;
+	for (i = 0; i < 64; i++) {
+		kernel_pmap->pm_slb[i].slbv = 0;
+		kernel_pmap->pm_slb[i].slbe = 0;
+	}
+	/* prefault some bits */
+	(void)va_to_vsid(kernel_pmap, VM_MAX_KERNEL_ADDRESS);
+	(void)va_to_vsid(kernel_pmap, VM_MIN_KERNEL_ADDRESS);
+	(void)va_to_vsid(kernel_pmap, kernelstart);
 	#else
 	for (i = 0; i < 16; i++) 
 		kernel_pmap->pm_sr[i] = EMPTY_SEGMENT + i;
@@ -1054,11 +1055,13 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o
 	 * step on.
 	 */
 
+	#ifndef __powerpc64__	/* KVA is in high memory on PPC64 */
 	PMAP_LOCK(kernel_pmap);
 	while (virtual_end < VM_MAX_KERNEL_ADDRESS &&
 	    moea64_pvo_find_va(kernel_pmap, virtual_end+1, NULL) == NULL)
 		virtual_end += PAGE_SIZE;
 	PMAP_UNLOCK(kernel_pmap);
+	#endif
 
 	/*
 	 * Allocate some things for page zeroing. We put this directly

Modified: projects/ppc64/sys/powerpc/aim/trap.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/trap.c	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/aim/trap.c	Fri Mar 12 15:57:56 2010	(r205085)
@@ -256,6 +256,16 @@ trap(struct trapframe *frame)
 			if (trap_pfault(frame, 0) == 0)
  				return;
 			break;
+#ifdef __powerpc64__
+		case EXC_ISE:
+		case EXC_DSE:
+			PMAP_LOCK(kernel_pmap);
+			(void)va_to_vsid(kernel_pmap,
+			    (type == EXC_ISE) ? frame->srr0 :
+			    frame->cpu.aim.dar);
+			PMAP_UNLOCK(kernel_pmap);
+			return;
+#endif
 		case EXC_MCHK:
 			if (handle_onfault(frame))
  				return;

Modified: projects/ppc64/sys/powerpc/aim/trap_subr64.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim/trap_subr64.S	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/aim/trap_subr64.S	Fri Mar 12 15:57:56 2010	(r205085)
@@ -446,6 +446,8 @@ generictrap:
 	std	%r29,(PC_TEMPSAVE+CPUSAVE_R29)(%r1)
 	std	%r30,(PC_TEMPSAVE+CPUSAVE_R30)(%r1)
 	std	%r31,(PC_TEMPSAVE+CPUSAVE_R31)(%r1)
+	mfdar	%r30
+	std	%r30,(PC_TEMPSAVE+CPUSAVE_AIM_DAR)(%r1)
 	mfsprg1	%r1			/* restore SP, in case of branch */
 	mfsprg2	%r28			/* save LR */
 	mfcr	%r29			/* save CR */

Modified: projects/ppc64/sys/powerpc/include/vmparam.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/vmparam.h	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/include/vmparam.h	Fri Mar 12 15:57:56 2010	(r205085)
@@ -80,14 +80,14 @@
  */
 #if !defined(LOCORE)
 #define	VM_MIN_ADDRESS		((vm_offset_t)0)
-
+#ifdef __powerpc64__
+#define	VM_MAXUSER_ADDRESS	((vm_offset_t)0x4fffff000)
+#else
 #define	VM_MAXUSER_ADDRESS	((vm_offset_t)0x7ffff000)
-
+#endif
 #else
 #define	VM_MIN_ADDRESS		0
-
 #define	VM_MAXUSER_ADDRESS	0x7ffff000
-
 #endif /* LOCORE */
 
 #define	VM_MAX_ADDRESS		VM_MAXUSER_ADDRESS
@@ -98,9 +98,15 @@
 
 #define	KERNBASE		0x00100000UL	/* start of kernel virtual */
 
+#ifdef __powerpc64__
+#define	VM_MIN_KERNEL_ADDRESS		0xc000000000000000UL
+#define	VM_MAX_KERNEL_ADDRESS		0xcfffffffffffffffUL
+#define	VM_MAX_SAFE_KERNEL_ADDRESS	VM_MAX_KERNEL_ADDRESS
+#else
 #define	VM_MIN_KERNEL_ADDRESS	((vm_offset_t)KERNEL_SR << ADDR_SR_SHFT)
 #define	VM_MAX_SAFE_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 2*SEGMENT_LENGTH -1)
 #define	VM_MAX_KERNEL_ADDRESS	(VM_MIN_KERNEL_ADDRESS + 3*SEGMENT_LENGTH - 1)
+#endif
 
 /*
  * Use the direct-mapped BAT registers for UMA small allocs. This

Modified: projects/ppc64/sys/powerpc/ofw/ofw_real.c
==============================================================================
--- projects/ppc64/sys/powerpc/ofw/ofw_real.c	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/ofw/ofw_real.c	Fri Mar 12 15:57:56 2010	(r205085)
@@ -68,10 +68,11 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_page.h>
 #include <vm/pmap.h>
 
-#include <machine/stdarg.h>
 #include <machine/bus.h>
-#include <machine/pmap.h>
+#include <machine/md_var.h>
 #include <machine/ofw_machdep.h>
+#include <machine/pmap.h>
+#include <machine/stdarg.h>
 
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofwvar.h>
@@ -212,16 +213,16 @@ ofw_real_bounce_alloc(void *junk)
 	of_bounce_virt = contigmalloc(PAGE_SIZE, M_OFWREAL, 0,
 			     0, BUS_SPACE_MAXADDR_32BIT, PAGE_SIZE, PAGE_SIZE);
 
+	of_bounce_phys = vtophys(of_bounce_virt);
+	of_bounce_size = PAGE_SIZE;
+
 	/*
-	 * XXX: Use of_bounce_virt in 32-bit mode. This assumes that kernel
-	 * VA space is always < 0xffffffff.
+	 * For virtual-mode OF, direct map this physical address so that
+	 * we have a 32-bit virtual address to give OF.
 	 */
-	if (ofw_real_mode)
-		of_bounce_phys = vtophys(of_bounce_virt);
-	else
-		of_bounce_phys = (vm_offset_t)of_bounce_virt;
 
-	of_bounce_size = PAGE_SIZE;
+	if (!ofw_real_mode && !hw_direct_map) 
+		pmap_kenter(of_bounce_phys, of_bounce_phys);
 
 	mtx_unlock(&of_bounce_mtx);
 }

Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Fri Mar 12 15:21:13 2010	(r205084)
+++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Fri Mar 12 15:57:56 2010	(r205085)
@@ -919,7 +919,7 @@ cpu_thread_alloc(struct thread *td)
 	struct pcb *pcb;
 
 	pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
-	    sizeof(struct pcb)) & ~0x2fU);
+	    sizeof(struct pcb)) & ~0x2fUL);
 	td->td_pcb = pcb;
 	td->td_frame = (struct trapframe *)pcb - 1;
 }


More information about the svn-src-projects mailing list