Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Mar 2010 01:11:10 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r205497 - head/sys/powerpc/aim
Message-ID:  <201003230111.o2N1BAQB096612@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003230111.o2N1BAQB096612>