Author: nwhitehorn
Date: Tue Mar 23 01:11:10 2010
New Revision: 205497
URL: http://svn.freebsd.org/changeset/base/205497

Log:
  Open Firmware on powerpc is generally non-reetrant, so serialize all
  OF calls with a mutex.

Modified:
  head/sys/powerpc/aim/ofw_machdep.c

Modified: head/sys/powerpc/aim/ofw_machdep.c
==============================================================================
--- head/sys/powerpc/aim/ofw_machdep.c  Tue Mar 23 01:09:45 2010        
(r205496)
+++ head/sys/powerpc/aim/ofw_machdep.c  Tue Mar 23 01:11:10 2010        
(r205497)
@@ -63,6 +63,8 @@ __FBSDID("$FreeBSD$");
 static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3];
 static struct mem_region OFfree[OFMEM_REGIONS + 3];
 
+static struct mtx ofw_mutex;
+
 struct mem_region64 {
         vm_offset_t     mr_start_hi;
         vm_offset_t     mr_start_lo;
@@ -281,6 +283,8 @@ OF_bootstrap()
 {
        boolean_t status = FALSE;
 
+       mtx_init(&ofw_mutex, "open firmware", NULL, MTX_DEF);
+
        if (ofwcall != NULL) {
                if (ofw_real_mode)
                        status = OF_install(OFW_STD_REAL, 0);
@@ -314,6 +318,8 @@ openfirmware(void *args)
        if (pmap_bootstrapped && ofw_real_mode)
                args = (void *)pmap_kextract((vm_offset_t)args);
 
+       mtx_lock(&ofw_mutex);
+
        __asm __volatile(       "\t"
                "sync\n\t"
                "mfmsr  %0\n\t"
@@ -366,6 +372,8 @@ openfirmware(void *args)
                : : "r" (oldmsr)
        );
 
+       mtx_unlock(&ofw_mutex);
+
        return (result);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to