svn commit: r203554 - stable/8/sys/sparc64/sparc64

Marius Strobl marius at FreeBSD.org
Sat Feb 6 17:33:40 UTC 2010


Author: marius
Date: Sat Feb  6 17:33:39 2010
New Revision: 203554
URL: http://svn.freebsd.org/changeset/base/203554

Log:
  MFC: r203185
  
  Implement handling of the third argument of cpu_switch().
  
  PR:		143215

Modified:
  stable/8/sys/sparc64/sparc64/genassym.c
  stable/8/sys/sparc64/sparc64/swtch.S
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/sparc64/sparc64/genassym.c
==============================================================================
--- stable/8/sys/sparc64/sparc64/genassym.c	Sat Feb  6 17:02:33 2010	(r203553)
+++ stable/8/sys/sparc64/sparc64/genassym.c	Sat Feb  6 17:33:39 2010	(r203554)
@@ -239,6 +239,7 @@ ASSYM(P_VMSPACE, offsetof(struct proc, p
 ASSYM(TD_FLAGS, offsetof(struct thread, td_flags));
 ASSYM(TD_FRAME, offsetof(struct thread, td_frame));
 ASSYM(TD_KSTACK, offsetof(struct thread, td_kstack));
+ASSYM(TD_LOCK, offsetof(struct thread, td_lock));
 ASSYM(TD_PCB, offsetof(struct thread, td_pcb));
 ASSYM(TD_PROC, offsetof(struct thread, td_proc));
 ASSYM(TD_MD, offsetof(struct thread, td_md));

Modified: stable/8/sys/sparc64/sparc64/swtch.S
==============================================================================
--- stable/8/sys/sparc64/sparc64/swtch.S	Sat Feb  6 17:02:33 2010	(r203553)
+++ stable/8/sys/sparc64/sparc64/swtch.S	Sat Feb  6 17:33:39 2010	(r203554)
@@ -46,15 +46,14 @@ ENTRY(cpu_throw)
 	save	%sp, -CCFSZ, %sp
 	flushw
 	ba	%xcc, .Lsw1
-	 mov	%i1, %i0
+	 mov	%g0, %i2
 END(cpu_throw)
 
 /*
- * void cpu_switch(struct thread *old, struct thread *new)
+ * void cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx)
  */
 ENTRY(cpu_switch)
 	save	%sp, -CCFSZ, %sp
-	mov	%i1, %i0
 
 	/*
 	 * If the current thread was using floating point in the kernel, save
@@ -63,7 +62,7 @@ ENTRY(cpu_switch)
 	 */
 	rd	%fprs, %l2
 	andcc	%l2, FPRS_FEF, %g0
-	bz,a,pt %xcc, 1f
+	bz,a,pt	%xcc, 1f
 	 nop
 	call	savefpctx
 	 add	PCB_REG, PCB_KFP, %o0
@@ -104,24 +103,24 @@ ENTRY(cpu_switch)
 .Lsw1:
 #if KTR_COMPILE & KTR_PROC
 	CATR(KTR_PROC, "cpu_switch: new td=%p pc=%#lx fp=%#lx"
-	    , %g1, %g2, %g3, 7, 8, 9)
-	stx	%i0, [%g1 + KTR_PARM1]
-	ldx	[%i0 + TD_PCB], %g2
+	    , %g1, %g2, %g3, 8, 9, 10)
+	stx	%i1, [%g1 + KTR_PARM1]
+	ldx	[%i1 + TD_PCB], %g2
 	ldx	[%g2 + PCB_PC], %g3
 	stx	%g3, [%g1 + KTR_PARM2]
 	ldx	[%g2 + PCB_SP], %g3
 	stx	%g3, [%g1 + KTR_PARM3]
-9:
+10:
 #endif
-	ldx	[%i0 + TD_PCB], %i1
+	ldx	[%i1 + TD_PCB], %l0
 
-	stx	%i0, [PCPU(CURTHREAD)]
-	stx	%i1, [PCPU(CURPCB)]
+	stx	%i1, [PCPU(CURTHREAD)]
+	stx	%l0, [PCPU(CURPCB)]
 
 	wrpr	%g0, PSTATE_NORMAL, %pstate
-	mov	%i1, PCB_REG
+	mov	%l0, PCB_REG
 	wrpr	%g0, PSTATE_ALT, %pstate
-	mov	%i1, PCB_REG
+	mov	%l0, PCB_REG
 	wrpr	%g0, PSTATE_KERNEL, %pstate
 
 	ldx	[PCB_REG + PCB_SP], %fp
@@ -132,24 +131,24 @@ ENTRY(cpu_switch)
 	 * Point to the pmaps of the new process, and of the last non-kernel
 	 * process to run.
 	 */
-	ldx	[%i0 + TD_PROC], %i2
+	ldx	[%i1 + TD_PROC], %l1
 	ldx	[PCPU(PMAP)], %l2
-	ldx	[%i2 + P_VMSPACE], %i5
-	add	%i5, VM_PMAP, %i2
+	ldx	[%l1 + P_VMSPACE], %i5
+	add	%i5, VM_PMAP, %l1
 
 #if KTR_COMPILE & KTR_PROC
 	CATR(KTR_PROC, "cpu_switch: new pmap=%p old pmap=%p"
-	    , %g1, %g2, %g3, 7, 8, 9)
-	stx	%i2, [%g1 + KTR_PARM1]
+	    , %g1, %g2, %g3, 8, 9, 10)
+	stx	%l1, [%g1 + KTR_PARM1]
 	stx	%l2, [%g1 + KTR_PARM2]
-9:
+10:
 #endif
 
 	/*
 	 * If they are the same we are done.
 	 */
-	cmp	%l2, %i2
-	be,a,pn %xcc, 5f
+	cmp	%l2, %l1
+	be,a,pn	%xcc, 7f
 	 nop
 
 	/*
@@ -158,21 +157,20 @@ ENTRY(cpu_switch)
 	 */
 	SET(vmspace0, %i4, %i3)
 	cmp	%i5, %i3
-	be,a,pn %xcc, 5f
+	be,a,pn	%xcc, 7f
 	 nop
 
 	/*
 	 * If there was no non-kernel pmap, don't try to deactivate it.
 	 */
-	brz,a,pn %l2, 3f
-	 nop
+	brz,pn	%l2, 3f
+	 lduw	[PCPU(CPUMASK)], %l4
 
 	/*
 	 * Mark the pmap of the last non-kernel vmspace to run as no longer
 	 * active on this CPU.
 	 */
 	lduw	[%l2 + PM_ACTIVE], %l3
-	lduw	[PCPU(CPUMASK)], %l4
 	andn	%l3, %l4, %l3
 	stw	%l3, [%l2 + PM_ACTIVE]
 
@@ -185,25 +183,28 @@ ENTRY(cpu_switch)
 	mov	-1, %l5
 	stw	%l5, [%l3 + %l4]
 
+3:	cmp	%i2, %g0
+	be,pn	%xcc, 4f
+	 lduw	[PCPU(TLB_CTX_MAX)], %i4
+	stx	%i2, [%i0 + TD_LOCK]
+
 	/*
 	 * Find a new TLB context.  If we've run out we have to flush all
 	 * user mappings from the TLB and reset the context numbers.
 	 */
-3:	lduw	[PCPU(TLB_CTX)], %i3
-	lduw	[PCPU(TLB_CTX_MAX)], %i4
+4:	lduw	[PCPU(TLB_CTX)], %i3
 	cmp	%i3, %i4
-	bne,a,pt %xcc, 4f
+	bne,a,pt %xcc, 5f
 	 nop
 	SET(tlb_flush_user, %i5, %i4)
 	ldx	[%i4], %i5
 	call	%i5
-	 nop
-	lduw	[PCPU(TLB_CTX_MIN)], %i3
+	 lduw	[PCPU(TLB_CTX_MIN)], %i3
 
 	/*
 	 * Advance next free context.
 	 */
-4:	add	%i3, 1, %i4
+5:	add	%i3, 1, %i4
 	stw	%i4, [PCPU(TLB_CTX)]
 
 	/*
@@ -211,36 +212,36 @@ ENTRY(cpu_switch)
 	 */
 	lduw	[PCPU(CPUID)], %i4
 	sllx	%i4, INT_SHIFT, %i4
-	add	%i2, PM_CONTEXT, %i5
+	add	%l1, PM_CONTEXT, %i5
 	stw	%i3, [%i4 + %i5]
 
 	/*
 	 * Mark the pmap as active on this CPU.
 	 */
-	lduw	[%i2 + PM_ACTIVE], %i4
+	lduw	[%l1 + PM_ACTIVE], %i4
 	lduw	[PCPU(CPUMASK)], %i5
 	or	%i4, %i5, %i4
-	stw	%i4, [%i2 + PM_ACTIVE]
+	stw	%i4, [%l1 + PM_ACTIVE]
 
 	/*
 	 * Make note of the change in pmap.
 	 */
-	stx	%i2, [PCPU(PMAP)]
+	stx	%l1, [PCPU(PMAP)]
 
 	/*
 	 * Fiddle the hardware bits.  Set the TSB registers and install the
 	 * new context number in the CPU.
 	 */
-	ldx	[%i2 + PM_TSB], %i4
+	ldx	[%l1 + PM_TSB], %i4
 	mov	AA_DMMU_TSB, %i5
 	stxa	%i4, [%i5] ASI_DMMU
 	mov	AA_IMMU_TSB, %i5
 	stxa	%i4, [%i5] ASI_IMMU
 	setx	TLB_PCXR_PGSZ_MASK, %i5, %i4
 	mov	AA_DMMU_PCXR, %i5
-	ldxa	[%i5] ASI_DMMU, %i2
-	and	%i2, %i4, %i2
-	or	%i3, %i2, %i3
+	ldxa	[%i5] ASI_DMMU, %l1
+	and	%l1, %i4, %l1
+	or	%i3, %l1, %i3
 	sethi	%hi(KERNBASE), %i4
 	stxa	%i3, [%i5] ASI_DMMU
 	flush	%i4
@@ -248,7 +249,15 @@ ENTRY(cpu_switch)
 	/*
 	 * Done, return and load the new process's window from the stack.
 	 */
-5:	ret
+
+6:	ret
+	 restore
+
+7:	cmp	%i2, %g0
+	be,a,pn	%xcc, 6b
+	 nop
+	stx	%i2, [%i0 + TD_LOCK]
+	ret
 	 restore
 END(cpu_switch)
 


More information about the svn-src-all mailing list