svn commit: r196957 - in projects/ppc64/sys/powerpc: aim aim64
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Tue Sep 8 03:55:09 UTC 2009
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);
More information about the svn-src-projects
mailing list