PERFORCE change 96140 for review

Kip Macy kmacy at FreeBSD.org
Wed Apr 26 05:51:51 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=96140

Change 96140 by kmacy at kmacy_storage:sun4v_rwbuf on 2006/04/26 05:51:11

	atomically clear old PM_ACTIVE bit
	membar #Sync when setting secondary context

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#18 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#18 (text+ko) ====

@@ -39,6 +39,7 @@
 	.register	%g3, #ignore
 
 #define	PCB_REG	%g6
+
 /*
  * void cpu_throw(struct thread *old, struct thread *new)
  */
@@ -55,10 +56,6 @@
 ENTRY(cpu_switch)
 	save	%sp, -CCFSZ, %sp
 	ldx	[PCPU(CURPCB)], PCB_REG
-
-	MAGIC_TRAP_ON
-	MAGIC_TRAP_OFF
-	
 	mov	%i1, %i0
 
 	/*
@@ -101,6 +98,7 @@
 	stx	%fp, [PCB_REG + PCB_SP]
 	stx	%i7, [PCB_REG + PCB_PC]
 
+
 	/*
 	 * Load the new thread's frame pointer and program counter, and set
 	 * the current thread and pcb.
@@ -117,6 +115,7 @@
 	stx	%g3, [%g1 + KTR_PARM3]
 9:
 #endif
+	
 	ldx	[%i0 + TD_PCB], %i1
 
 	stx	%i0, [PCPU(CURTHREAD)]
@@ -152,7 +151,6 @@
 	cmp	%l2, %i2			! current pmap == new pmap?
 	be,a,pn %xcc, 5f
 	  nop
-
 	ldx	[%i2 + PM_CONTEXT], %l5		! new context
 	ldx	[%l2 + PM_CONTEXT], %l3		! old context
 	cmp	%g0, %l5
@@ -161,18 +159,24 @@
 
 	brz	%l3, 10f			! old context == kernel?
 	  nop
+	
 	/*
 	 * Mark the old pmap as no longer active on this CPU
 	 */
-	lduw	[%l2 + PM_ACTIVE], %l3
-	andn	%l3, %l4, %l3
-	stw	%l3, [%l2 + PM_ACTIVE]
-
+	add	%l2, PM_ACTIVE, %l2
+	lduw	[%l2], %l3
+8:	andn	%l3, %l4, %l6
+	cas	[%l2], %l3, %l6
+	cmp	%l3, %l6
+	bne,pn	%icc, 8b
+	  mov	%l3, %l6
+	
 	/*
 	 * Mark the new pmap as active on this CPU
 	 * XXX need to CAS
 	 */
-10:	lduw	[%i2 + PM_ACTIVE], %l3
+10:
+	lduw	[%i2 + PM_ACTIVE], %l3
 	or	%l3, %l4, %l3
 	stw	%l3, [%i2 + PM_ACTIVE]
 
@@ -214,7 +218,7 @@
 	 */
 	
 	SET_MMU_CONTEXT(%l6, %l5)
-	
+	membar #Sync
 	/*
 	 * Done.  Return and load the new process's window from the stack.
 	 */


More information about the p4-projects mailing list