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

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Oct 31 22:55:51 UTC 2010


Author: nwhitehorn
Date: Sun Oct 31 22:55:51 2010
New Revision: 214607
URL: http://svn.freebsd.org/changeset/base/214607

Log:
  Next-to-leading-order perturbation of synchronization operations for
  switching the user segment register. All races should now be closed and
  a minimum of pipelines flushes be required to close them.

Modified:
  head/sys/powerpc/aim/copyinout.c
  head/sys/powerpc/aim/swtch32.S
  head/sys/powerpc/aim/swtch64.S

Modified: head/sys/powerpc/aim/copyinout.c
==============================================================================
--- head/sys/powerpc/aim/copyinout.c	Sun Oct 31 22:46:39 2010	(r214606)
+++ head/sys/powerpc/aim/copyinout.c	Sun Oct 31 22:55:51 2010	(r214607)
@@ -117,9 +117,9 @@ set_user_sr(pmap_t pm, const void *addr)
 	if (curthread->td_pcb->pcb_cpu.aim.usr_vsid == vsid)
 		return;
 
-	__asm __volatile ("sync; mtsr %0,%1; sync; isync" :: "n"(USER_SR),
-	    "r"(vsid));
+	__asm __volatile("isync");
 	curthread->td_pcb->pcb_cpu.aim.usr_vsid = vsid;
+	__asm __volatile("mtsr %0,%1; isync" :: "n"(USER_SR), "r"(vsid));
 }
 #endif
 

Modified: head/sys/powerpc/aim/swtch32.S
==============================================================================
--- head/sys/powerpc/aim/swtch32.S	Sun Oct 31 22:46:39 2010	(r214606)
+++ head/sys/powerpc/aim/swtch32.S	Sun Oct 31 22:55:51 2010	(r214607)
@@ -89,7 +89,6 @@ ENTRY(cpu_switch)
 	mflr	%r16			/* Save the link register */
 	stw	%r16,PCB_LR(%r6)
 	mfsr	%r16,USER_SR		/* Save USER_SR for copyin/out */
-	isync
 	stw	%r16,PCB_AIM_USR_VSID(%r6)
 	stw	%r1,PCB_SP(%r6)		/* Save the stack pointer */
 	stw	%r2,PCB_TOC(%r6)	/* Save the TOC pointer */
@@ -162,6 +161,7 @@ blocked_loop:
 	lwz	%r5,PCB_LR(%r3)		/* Load the link register */
 	mtlr	%r5
 	lwz	%r5,PCB_AIM_USR_VSID(%r3) /* Load the USER_SR segment reg */
+	isync
 	mtsr	USER_SR,%r5
 	isync
 	lwz	%r1,PCB_SP(%r3)		/* Load the stack pointer */

Modified: head/sys/powerpc/aim/swtch64.S
==============================================================================
--- head/sys/powerpc/aim/swtch64.S	Sun Oct 31 22:46:39 2010	(r214606)
+++ head/sys/powerpc/aim/swtch64.S	Sun Oct 31 22:55:51 2010	(r214607)
@@ -113,7 +113,6 @@ ENTRY(cpu_switch)
 	li	%r15,0			/* Save user segment for copyin/out */
 	li	%r16,USER_SLB_SLOT
 	slbmfev %r15, %r16
-	isync
 	std	%r15,PCB_AIM_USR_VSID(%r6)
 
 	mr	%r14,%r3		/* Copy the old thread ptr... */
@@ -222,6 +221,7 @@ blocked_loop:
 	ori	%r5,%r5,USER_ADDR at highera
 	sldi	%r5,%r5,32
 	oris	%r5,%r5,USER_ADDR at ha
+	isync
 	slbie	%r5
 	lis	%r6,USER_SLB_SLBE at highesta
 	ori	%r6,%r6,USER_SLB_SLBE at highera
@@ -230,8 +230,8 @@ blocked_loop:
 	ori	%r6,%r6,USER_SLB_SLBE at l
 	ld	%r5,PCB_AIM_USR_VSID(%r3)
 	slbmte	%r5,%r6
-
 	isync
+
 	/*
 	 * Perform a dummy stdcx. to clear any reservations we may have
 	 * inherited from the previous thread. It doesn't matter if the


More information about the svn-src-head mailing list