svn commit: r190704 - head/sys/powerpc/aim

Marcel Moolenaar marcel at FreeBSD.org
Sat Apr 4 15:23:04 PDT 2009


Author: marcel
Date: Sat Apr  4 22:23:03 2009
New Revision: 190704
URL: http://svn.freebsd.org/changeset/base/190704

Log:
  Perform a dummy stwcx. when we switch contexts. The context
  being switched out may hold a reservation. The stwcx. will
  clear the reservation. This is architecturally recommended.
  
  The scenario this addresses is as follows:
  1. Thread 1 performs a lwarx and as such holds a reservation.
  2. Thread 1 gets switched out (before doing the matching
     stwcx.) and thread 2 is switched in.
  3. Thread 2 performs a stwcx. to the same reservation granule.
     This will succeed because the processor has the reservation
     even though thread 2 didn't do the lwarx.
  
  Note that on some processors the address given the stwcx. is
  not checked. On these processors the mere condition of having
  a reservation would cause the stwcx. to succeed, irrespective
  of whether the addresses are the same. The dummy stwcx. is
  especially important for those processors.

Modified:
  head/sys/powerpc/aim/swtch.S

Modified: head/sys/powerpc/aim/swtch.S
==============================================================================
--- head/sys/powerpc/aim/swtch.S	Sat Apr  4 22:05:36 2009	(r190703)
+++ head/sys/powerpc/aim/swtch.S	Sat Apr  4 22:23:03 2009	(r190704)
@@ -155,6 +155,12 @@ cpu_switchin:
 	mtsr	USER_SR,%r5
 	isync
 	lwz	%r1,PCB_SP(%r3)		/* Load the stack pointer */
+	/*
+	 * Perform a dummy stwcx. to clear any reservations we may have
+	 * inherited from the previous thread. It doesn't matter if the
+	 * stwcx succeeds or not. pcb_context[0] can be clobbered.
+	 */
+	stwcx.	%r1, 0, %r3
 	blr
 
 /*


More information about the svn-src-head mailing list