summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authorbenno <benno@FreeBSD.org>2002-06-29 09:16:30 +0000
committerbenno <benno@FreeBSD.org>2002-06-29 09:16:30 +0000
commitd7065a7a3b00b61fce76618bb1d2ad00c7b69e08 (patch)
tree3e5c2f6224459985b3e7ca7e4e9c5688e91a6cc6 /sys/powerpc
parent151c32fd6dbf480b69a082de33ddd6a3620f0ace (diff)
downloadFreeBSD-src-d7065a7a3b00b61fce76618bb1d2ad00c7b69e08.zip
FreeBSD-src-d7065a7a3b00b61fce76618bb1d2ad00c7b69e08.tar.gz
Convert this from mostly inline assembler to mostly C.
Submitted by: Peter Grehan <peterg@ptree32.com.au>
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/aim/ofw_machdep.c82
-rw-r--r--sys/powerpc/powerpc/ofw_machdep.c82
2 files changed, 50 insertions, 114 deletions
diff --git a/sys/powerpc/aim/ofw_machdep.c b/sys/powerpc/aim/ofw_machdep.c
index c818902..6fcf196 100644
--- a/sys/powerpc/aim/ofw_machdep.c
+++ b/sys/powerpc/aim/ofw_machdep.c
@@ -53,6 +53,7 @@ static const char rcsid[] =
#include <vm/vm_page.h>
#include <machine/powerpc.h>
+#include <machine/ofw_machdep.h>
#define OFMEM_REGIONS 32
static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3];
@@ -106,42 +107,7 @@ openfirmware(void *args)
long oldmsr;
int result;
u_int srsave[16];
-
- if (pmap_bootstrapped) {
- __asm __volatile("mfsr %0,0" : "=r"(srsave[0]));
- __asm __volatile("mfsr %0,1" : "=r"(srsave[1]));
- __asm __volatile("mfsr %0,2" : "=r"(srsave[2]));
- __asm __volatile("mfsr %0,3" : "=r"(srsave[3]));
- __asm __volatile("mfsr %0,4" : "=r"(srsave[4]));
- __asm __volatile("mfsr %0,5" : "=r"(srsave[5]));
- __asm __volatile("mfsr %0,6" : "=r"(srsave[6]));
- __asm __volatile("mfsr %0,7" : "=r"(srsave[7]));
- __asm __volatile("mfsr %0,8" : "=r"(srsave[8]));
- __asm __volatile("mfsr %0,9" : "=r"(srsave[9]));
- __asm __volatile("mfsr %0,10" : "=r"(srsave[10]));
- __asm __volatile("mfsr %0,11" : "=r"(srsave[11]));
- __asm __volatile("mfsr %0,12" : "=r"(srsave[12]));
- __asm __volatile("mfsr %0,13" : "=r"(srsave[13]));
- __asm __volatile("mfsr %0,14" : "=r"(srsave[14]));
- __asm __volatile("mfsr %0,15" : "=r"(srsave[15]));
-
- __asm __volatile("mtsr 0,%0" :: "r"(ofw_pmap.pm_sr[0]));
- __asm __volatile("mtsr 1,%0" :: "r"(ofw_pmap.pm_sr[1]));
- __asm __volatile("mtsr 2,%0" :: "r"(ofw_pmap.pm_sr[2]));
- __asm __volatile("mtsr 3,%0" :: "r"(ofw_pmap.pm_sr[3]));
- __asm __volatile("mtsr 4,%0" :: "r"(ofw_pmap.pm_sr[4]));
- __asm __volatile("mtsr 5,%0" :: "r"(ofw_pmap.pm_sr[5]));
- __asm __volatile("mtsr 6,%0" :: "r"(ofw_pmap.pm_sr[6]));
- __asm __volatile("mtsr 7,%0" :: "r"(ofw_pmap.pm_sr[7]));
- __asm __volatile("mtsr 8,%0" :: "r"(ofw_pmap.pm_sr[8]));
- __asm __volatile("mtsr 9,%0" :: "r"(ofw_pmap.pm_sr[9]));
- __asm __volatile("mtsr 10,%0" :: "r"(ofw_pmap.pm_sr[10]));
- __asm __volatile("mtsr 11,%0" :: "r"(ofw_pmap.pm_sr[11]));
- __asm __volatile("mtsr 12,%0" :: "r"(ofw_pmap.pm_sr[12]));
- __asm __volatile("mtsr 13,%0" :: "r"(ofw_pmap.pm_sr[13]));
- __asm __volatile("mtsr 14,%0" :: "r"(ofw_pmap.pm_sr[14]));
- __asm __volatile("mtsr 15,%0" :: "r"(ofw_pmap.pm_sr[15]));
- }
+ u_int i;
__asm __volatile( "\t"
"sync\n\t"
@@ -152,35 +118,37 @@ openfirmware(void *args)
: "r" (ofmsr)
);
+ if (pmap_bootstrapped) {
+ /*
+ * Swap the kernel's address space with OpenFirmware's
+ */
+ for (i = 0; i < 16; i++) {
+ srsave[i] = mfsrin(i << ADDR_SR_SHFT);
+ mtsrin(i << ADDR_SR_SHFT, ofw_pmap.pm_sr[i]);
+ }
+ isync();
+ }
+
result = ofwcall(args);
+ if (pmap_bootstrapped) {
+ /*
+ * Restore the kernel's addr space. The isync() doesn;t
+ * work outside the loop unless mtsrin() is open-coded
+ * in an asm statement :(
+ */
+ for (i = 0; i < 16; i++) {
+ mtsrin(i << ADDR_SR_SHFT, srsave[i]);
+ isync();
+ }
+ }
+
__asm( "\t"
"mtmsr %0\n\t"
"isync\n"
: : "r" (oldmsr)
);
- if (pmap_bootstrapped) {
- __asm __volatile("mtsr 0,%0" :: "r"(srsave[0]));
- __asm __volatile("mtsr 1,%0" :: "r"(srsave[1]));
- __asm __volatile("mtsr 2,%0" :: "r"(srsave[2]));
- __asm __volatile("mtsr 3,%0" :: "r"(srsave[3]));
- __asm __volatile("mtsr 4,%0" :: "r"(srsave[4]));
- __asm __volatile("mtsr 5,%0" :: "r"(srsave[5]));
- __asm __volatile("mtsr 6,%0" :: "r"(srsave[6]));
- __asm __volatile("mtsr 7,%0" :: "r"(srsave[7]));
- __asm __volatile("mtsr 8,%0" :: "r"(srsave[8]));
- __asm __volatile("mtsr 9,%0" :: "r"(srsave[9]));
- __asm __volatile("mtsr 10,%0" :: "r"(srsave[10]));
- __asm __volatile("mtsr 11,%0" :: "r"(srsave[11]));
- __asm __volatile("mtsr 12,%0" :: "r"(srsave[12]));
- __asm __volatile("mtsr 13,%0" :: "r"(srsave[13]));
- __asm __volatile("mtsr 14,%0" :: "r"(srsave[14]));
- __asm __volatile("mtsr 15,%0" :: "r"(srsave[15]));
- __asm __volatile("sync");
- }
-
-
return (result);
}
diff --git a/sys/powerpc/powerpc/ofw_machdep.c b/sys/powerpc/powerpc/ofw_machdep.c
index c818902..6fcf196 100644
--- a/sys/powerpc/powerpc/ofw_machdep.c
+++ b/sys/powerpc/powerpc/ofw_machdep.c
@@ -53,6 +53,7 @@ static const char rcsid[] =
#include <vm/vm_page.h>
#include <machine/powerpc.h>
+#include <machine/ofw_machdep.h>
#define OFMEM_REGIONS 32
static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3];
@@ -106,42 +107,7 @@ openfirmware(void *args)
long oldmsr;
int result;
u_int srsave[16];
-
- if (pmap_bootstrapped) {
- __asm __volatile("mfsr %0,0" : "=r"(srsave[0]));
- __asm __volatile("mfsr %0,1" : "=r"(srsave[1]));
- __asm __volatile("mfsr %0,2" : "=r"(srsave[2]));
- __asm __volatile("mfsr %0,3" : "=r"(srsave[3]));
- __asm __volatile("mfsr %0,4" : "=r"(srsave[4]));
- __asm __volatile("mfsr %0,5" : "=r"(srsave[5]));
- __asm __volatile("mfsr %0,6" : "=r"(srsave[6]));
- __asm __volatile("mfsr %0,7" : "=r"(srsave[7]));
- __asm __volatile("mfsr %0,8" : "=r"(srsave[8]));
- __asm __volatile("mfsr %0,9" : "=r"(srsave[9]));
- __asm __volatile("mfsr %0,10" : "=r"(srsave[10]));
- __asm __volatile("mfsr %0,11" : "=r"(srsave[11]));
- __asm __volatile("mfsr %0,12" : "=r"(srsave[12]));
- __asm __volatile("mfsr %0,13" : "=r"(srsave[13]));
- __asm __volatile("mfsr %0,14" : "=r"(srsave[14]));
- __asm __volatile("mfsr %0,15" : "=r"(srsave[15]));
-
- __asm __volatile("mtsr 0,%0" :: "r"(ofw_pmap.pm_sr[0]));
- __asm __volatile("mtsr 1,%0" :: "r"(ofw_pmap.pm_sr[1]));
- __asm __volatile("mtsr 2,%0" :: "r"(ofw_pmap.pm_sr[2]));
- __asm __volatile("mtsr 3,%0" :: "r"(ofw_pmap.pm_sr[3]));
- __asm __volatile("mtsr 4,%0" :: "r"(ofw_pmap.pm_sr[4]));
- __asm __volatile("mtsr 5,%0" :: "r"(ofw_pmap.pm_sr[5]));
- __asm __volatile("mtsr 6,%0" :: "r"(ofw_pmap.pm_sr[6]));
- __asm __volatile("mtsr 7,%0" :: "r"(ofw_pmap.pm_sr[7]));
- __asm __volatile("mtsr 8,%0" :: "r"(ofw_pmap.pm_sr[8]));
- __asm __volatile("mtsr 9,%0" :: "r"(ofw_pmap.pm_sr[9]));
- __asm __volatile("mtsr 10,%0" :: "r"(ofw_pmap.pm_sr[10]));
- __asm __volatile("mtsr 11,%0" :: "r"(ofw_pmap.pm_sr[11]));
- __asm __volatile("mtsr 12,%0" :: "r"(ofw_pmap.pm_sr[12]));
- __asm __volatile("mtsr 13,%0" :: "r"(ofw_pmap.pm_sr[13]));
- __asm __volatile("mtsr 14,%0" :: "r"(ofw_pmap.pm_sr[14]));
- __asm __volatile("mtsr 15,%0" :: "r"(ofw_pmap.pm_sr[15]));
- }
+ u_int i;
__asm __volatile( "\t"
"sync\n\t"
@@ -152,35 +118,37 @@ openfirmware(void *args)
: "r" (ofmsr)
);
+ if (pmap_bootstrapped) {
+ /*
+ * Swap the kernel's address space with OpenFirmware's
+ */
+ for (i = 0; i < 16; i++) {
+ srsave[i] = mfsrin(i << ADDR_SR_SHFT);
+ mtsrin(i << ADDR_SR_SHFT, ofw_pmap.pm_sr[i]);
+ }
+ isync();
+ }
+
result = ofwcall(args);
+ if (pmap_bootstrapped) {
+ /*
+ * Restore the kernel's addr space. The isync() doesn;t
+ * work outside the loop unless mtsrin() is open-coded
+ * in an asm statement :(
+ */
+ for (i = 0; i < 16; i++) {
+ mtsrin(i << ADDR_SR_SHFT, srsave[i]);
+ isync();
+ }
+ }
+
__asm( "\t"
"mtmsr %0\n\t"
"isync\n"
: : "r" (oldmsr)
);
- if (pmap_bootstrapped) {
- __asm __volatile("mtsr 0,%0" :: "r"(srsave[0]));
- __asm __volatile("mtsr 1,%0" :: "r"(srsave[1]));
- __asm __volatile("mtsr 2,%0" :: "r"(srsave[2]));
- __asm __volatile("mtsr 3,%0" :: "r"(srsave[3]));
- __asm __volatile("mtsr 4,%0" :: "r"(srsave[4]));
- __asm __volatile("mtsr 5,%0" :: "r"(srsave[5]));
- __asm __volatile("mtsr 6,%0" :: "r"(srsave[6]));
- __asm __volatile("mtsr 7,%0" :: "r"(srsave[7]));
- __asm __volatile("mtsr 8,%0" :: "r"(srsave[8]));
- __asm __volatile("mtsr 9,%0" :: "r"(srsave[9]));
- __asm __volatile("mtsr 10,%0" :: "r"(srsave[10]));
- __asm __volatile("mtsr 11,%0" :: "r"(srsave[11]));
- __asm __volatile("mtsr 12,%0" :: "r"(srsave[12]));
- __asm __volatile("mtsr 13,%0" :: "r"(srsave[13]));
- __asm __volatile("mtsr 14,%0" :: "r"(srsave[14]));
- __asm __volatile("mtsr 15,%0" :: "r"(srsave[15]));
- __asm __volatile("sync");
- }
-
-
return (result);
}
OpenPOWER on IntegriCloud