summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2016-06-29 14:40:43 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2016-06-29 14:40:43 +0000
commit74554ccb4aae7263896310af4eb41eb1bc3c475d (patch)
tree324e543ad27d2385d0f2807c15da3d413f4ad356 /sys/powerpc
parente45b60ce4b1cfb64617e3158ed0016f1b96358a5 (diff)
downloadFreeBSD-src-74554ccb4aae7263896310af4eb41eb1bc3c475d.zip
FreeBSD-src-74554ccb4aae7263896310af4eb41eb1bc3c475d.tar.gz
Do not rely on firmware having pre-enabled the MMU in a reasonable way for
late boot: enable it explicitly after installing the page tables. If booting from an FDT, also make sure to escape the firmware's MMU context early before overwriting firmware page tables. Approved by: re (gjb)
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/aim/mmu_oea.c2
-rw-r--r--sys/powerpc/powerpc/machdep.c12
2 files changed, 13 insertions, 1 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index ceb81d6..4aef628 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -921,7 +921,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
Maxmem = powerpc_btop(phys_avail[i + 1]);
moea_cpu_bootstrap(mmup,0);
-
+ mtmsr(mfmsr() | PSL_DR | PSL_IR);
pmap_bootstrapped++;
/*
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
index 4aa6e7f..c6960cc 100644
--- a/sys/powerpc/powerpc/machdep.c
+++ b/sys/powerpc/powerpc/machdep.c
@@ -251,6 +251,18 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
if (mdp == (void *)0x65504150)
mdp = NULL;
+#if AIM
+ /*
+ * If running from an FDT, make sure we are in real mode to avoid
+ * tromping on firmware page tables. Everything in the kernel assumes
+ * 1:1 mappings out of firmware, so this won't break anything not
+ * already broken. This doesn't work if there is live OF, since OF
+ * may internally use non-1:1 mappings.
+ */
+ if (ofentry == 0)
+ mtmsr(mfmsr() & ~(PSL_IR | PSL_DR));
+#endif
+
/*
* Parse metadata if present and fetch parameters. Must be done
* before console is inited so cninit gets the right value of
OpenPOWER on IntegriCloud