From d7065a7a3b00b61fce76618bb1d2ad00c7b69e08 Mon Sep 17 00:00:00 2001 From: benno Date: Sat, 29 Jun 2002 09:16:30 +0000 Subject: Convert this from mostly inline assembler to mostly C. Submitted by: Peter Grehan --- sys/powerpc/aim/ofw_machdep.c | 82 ++++++++++++--------------------------- sys/powerpc/powerpc/ofw_machdep.c | 82 ++++++++++++--------------------------- 2 files changed, 50 insertions(+), 114 deletions(-) (limited to 'sys/powerpc') 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 #include +#include #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 #include +#include #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); } -- cgit v1.1