Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Sep 2009 03:55:09 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r196957 - in projects/ppc64/sys/powerpc: aim aim64
Message-ID:  <200909080355.n883t9FA034925@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Tue Sep  8 03:55:09 2009
New Revision: 196957
URL: http://svn.freebsd.org/changeset/base/196957

Log:
  Start fixing up 64-bit OF access on Apple hardware a little. This change
  gives the PMAP layer the correct physical map by deleting a useless (and
  wrong, for PPC64) special case for reading the memory map from firmware,
  and also lays the groundwork for the address space swapping to call OF
  once the MMU is up.
  
  Reading the OFW translations map is still broken because of 32-bit/64-bit
  confusion.

Modified:
  projects/ppc64/sys/powerpc/aim/ofw_machdep.c
  projects/ppc64/sys/powerpc/aim64/mmu_oea64.c

Modified: projects/ppc64/sys/powerpc/aim/ofw_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/ofw_machdep.c	Tue Sep  8 01:11:23 2009	(r196956)
+++ projects/ppc64/sys/powerpc/aim/ofw_machdep.c	Tue Sep  8 03:55:09 2009	(r196957)
@@ -136,6 +136,7 @@ static int
 parse_ofw_memory(phandle_t node, const char *prop, struct mem_region *output)
 {
 	cell_t address_cells, size_cells;
+	cell_t OFmem[4*(OFMEM_REGIONS + 1)];
 	int sz, i, j;
 	int apple_hack_mode;
 	phandle_t phandle;
@@ -171,15 +172,13 @@ parse_ofw_memory(phandle_t node, const c
 	/*
 	 * Get memory.
 	 */
-	if (address_cells > 1 || size_cells > 1) {
-	    cell_t OFmem[4*(OFMEM_REGIONS + 1)];
-	    if ((node == -1) || (sz = OF_getprop(node, prop,
-		OFmem, sizeof(OFmem[0]) * 4 * OFMEM_REGIONS)) <= 0)
-			panic("Physical memory map not found");
-
-	    i = 0;
-	    j = 0;
-	    while (i < sz/sizeof(cell_t)) {
+	if ((node == -1) || (sz = OF_getprop(node, prop,
+	    OFmem, sizeof(OFmem[0]) * 4 * OFMEM_REGIONS)) <= 0)
+		panic("Physical memory map not found");
+
+	i = 0;
+	j = 0;
+	while (i < sz/sizeof(cell_t)) {
 	      #ifndef __powerpc64__
 		/* On 32-bit PPC, ignore regions starting above 4 GB */
 		if (OFmem[i] > 0) {
@@ -216,14 +215,10 @@ parse_ofw_memory(phandle_t node, const c
 			    output[j].mr_start;
 		}
 	      #endif
+
 		j++;
-	    }
-	    sz = j*sizeof(output[0]);
-	} else {
-	    if ((sz = OF_getprop(node, prop,
-			  output, sizeof(output[0]) * OFMEM_REGIONS)) <= 0)
-		panic("Physical memory map not found");
 	}
+	sz = j*sizeof(output[0]);
 
 	#ifdef __powerpc64__
 	if (apple_hack_mode) {
@@ -378,20 +373,30 @@ openfirmware(void *args)
 	int		result;
 	#ifndef __powerpc64__
 	register_t	srsave[16];
-	u_int		i;
 	#endif
+	u_int		i;
 
 	if (pmap_bootstrapped && ofw_real_mode)
 		args = (void *)pmap_kextract((vm_offset_t)args);
 
 	ofw_sprg_prepare();
 
-	#ifndef __powerpc64__
 	if (pmap_bootstrapped && !ofw_real_mode) {
 		/*
 		 * Swap the kernel's address space with Open Firmware's
 		 */
-		if (!ppc64) for (i = 0; i < 16; i++) {
+
+		#ifdef __powerpc64__
+		for (i = 1; i < 16; i++) {
+			if (i == KERNEL_SR || i == KERNEL2_SR || i == USER_SR)
+				continue;
+			
+			__asm __volatile ("slbie %0; slbmte %1, %2" ::
+			    "r"(i << 28), "r"(ofw_pmap.pm_slb[i].slbv),
+			    "r"(ofw_pmap.pm_slb[i].slbe));
+		}
+		#else
+		for (i = 0; i < 16; i++) {
 			srsave[i] = mfsrin(i << ADDR_SR_SHFT);
 			mtsrin(i << ADDR_SR_SHFT, ofw_pmap.pm_sr[i]);
 		}
@@ -404,8 +409,8 @@ openfirmware(void *args)
 					 "mtdbatu 3, %0" : : "r" (0));
 		}
 		isync();
+		#endif
 	}
-	#endif
 
 	__asm __volatile(	"\t"
 		"sync\n\t"
@@ -424,19 +429,28 @@ openfirmware(void *args)
 		: : "r" (oldmsr)
 	);
 
-	#ifndef __powerpc64__
 	if (pmap_bootstrapped && !ofw_real_mode) {
 		/*
 		 * Restore the kernel's addr space. The isync() doesn;t
 		 * work outside the loop unless mtsrin() is open-coded
 		 * in an asm statement :(
 		 */
+		#ifdef __powerpc64__
+		for (i = 1; i < 16; i++) {
+			if (i == KERNEL_SR || i == KERNEL2_SR || i == USER_SR)
+				continue;
+			
+			__asm __volatile ("slbie %0; slbmte %1, %2" ::
+			    "r"(i << 28), "r"(kernel_pmap->pm_slb[i].slbv),
+			    "r"(kernel_pmap->pm_slb[i].slbe));
+		}
+		#else
 		for (i = 0; i < 16; i++) {
 			mtsrin(i << ADDR_SR_SHFT, srsave[i]);
 			isync();
 		}
+		#endif
 	}
-	#endif
 
 	ofw_sprg_restore();
 

Modified: projects/ppc64/sys/powerpc/aim64/mmu_oea64.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/mmu_oea64.c	Tue Sep  8 01:11:23 2009	(r196956)
+++ projects/ppc64/sys/powerpc/aim64/mmu_oea64.c	Tue Sep  8 03:55:09 2009	(r196957)
@@ -971,6 +971,11 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o
 
 	    moea64_pinit(mmup, &ofw_pmap);
 
+	    #ifndef __powerpc64__
+	    ofw_pmap.pm_sr[KERNEL_SR] = kernel_pmap->pm_sr[KERNEL_SR];
+	    ofw_pmap.pm_sr[KERNEL2_SR] = kernel_pmap->pm_sr[KERNEL2_SR];
+	    #endif
+
 	    if ((chosen = OF_finddevice("/chosen")) == -1)
 		panic("moea64_bootstrap: can't find /chosen");
 	    OF_getprop(chosen, "mmu", &mmui, 4);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909080355.n883t9FA034925>