Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Mar 2006 07:32:44 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 93438 for review
Message-ID:  <200603170732.k2H7Wi3H049387@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=93438

Change 93438 by kmacy@kmacy_storage:sun4v_work on 2006/03/17 07:32:12

	switch TSB miss handler over to using real addresses for TL > 1	

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#33 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 (text+ko) ====

@@ -135,14 +135,32 @@
 	mov  SCRATCH_REG_PCPU, PCPU_REG;    \
         ldxa [%g0 + PCPU_REG]ASI_SCRATCHPAD, PCPU_REG;
 
-#define GET_HASH_SCRATCH_USER(reg)         \
+#define GET_HASH_SCRATCH_USER(reg)	   \
         mov SCRATCH_REG_HASH_USER, reg;    \
 	ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;
 
-#define GET_HASH_SCRATCH_KERNEL(reg)       \
+#define GET_HASH_SCRATCH_KERNEL(reg)   \
         mov SCRATCH_REG_HASH_KERNEL, reg;  \
 	ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; 
 
+#define GET_HASH_PHYS_SCRATCH_USER(tmp, reg)	\
+	sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp; \
+        mov SCRATCH_REG_HASH_USER, reg;         \
+	sllx tmp, 32, tmp;                      \
+	ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;    \
+	andn reg, tmp, reg;
+
+#define GET_HASH_PHYS_SCRATCH_KERNEL(tmp, reg)    \
+	sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp;   \
+        mov SCRATCH_REG_HASH_KERNEL, reg;         \
+	sllx tmp, 32, tmp;                        \
+	ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;      \
+	andn reg, tmp, reg;
+
+
+
+
+
 #define GET_TSB_SCRATCH_USER(reg)         \
         mov SCRATCH_REG_TSB_USER, reg;    \
 	ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;

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

@@ -1088,7 +1088,7 @@
 	wrpr	%g0, %g1, %cleanwin
 	rdpr	%cwp, %g1
 	wrpr	%g1, %g7, %tstate
-	MAGIC_TRAP_ON	
+!	MAGIC_TRAP_ON	
 	retry
 END(user_rtt)
 END(utl0)		
@@ -1317,50 +1317,63 @@
 ENTRY(tsb_miss_handler)
 	ldxa	[%g1 + %g7]ASI_REAL, %g6	! load in the context
 
+	rdpr	%tl, %g7			! need to use real addresses
+	cmp	%g7, 1				! for tl > 1
+	bne,pn	%xcc, 2f
+	  nop
 	cmp	%g6, %g0			! kernel?
 	be,pn	%xcc, 1f
-	  srlx	%g5, TTARGET_VA_SHIFT, %g1
+	  nop
 	GET_HASH_SCRATCH_USER(%g2)
-!	MAGIC_TRAP_ON
-	ba,pt	%xcc, 2f
-	  sllx	%g6, TTARGET_CTX_SHIFT, %g6
+	wr	%g0, ASI_LDTD_N, %asi
+	ba,pt	%xcc, 4f
+	  nop
 1:	
 	GET_HASH_SCRATCH_KERNEL(%g2)
+	wr	%g0, ASI_LDTD_N, %asi
+	ba,pt	%xcc, 4f
+	  nop
+2:
+!	MAGIC_TRAP_ON
+	cmp	%g6, %g0			! kernel?
+	be,pn	%xcc, 3f
+	  nop
+	GET_HASH_PHYS_SCRATCH_USER(%g7, %g2)
+	wr	%g0, ASI_LDTD_REAL, %asi
+	ba,pt	%xcc, 4f
+	  nop
+3:	
+	GET_HASH_PHYS_SCRATCH_KERNEL(%g7, %g2)
+	wr	%g0, ASI_LDTD_REAL, %asi
+4:
+	
+	srlx	%g5, TTARGET_VA_SHIFT, %g1
 	sllx	%g6, TTARGET_CTX_SHIFT, %g6
-2:	
-        or	%g6, %g1, %g6			! %g6 == search tag
+	or	%g6, %g1, %g6			! %g6 == search tag
+
 
 	! %g4 == fault type %g5 == fault addr %g6 == tag
 	! XXX only handle normal miss for now (look at fault type in the future)
 #ifdef PMAP_DEBUG
 	cmp	%g5, %g0			! NULL ptr deref 
-	bne,pt	%xcc, 3f
+	bne,pt	%xcc, 12f
 	  nop
 tsb_miss_null_deref:	
 	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT				! give up
-3:
+12:
 	cmp	%g3, T_INSTRUCTION_MISS
 	bne,pn	%xcc, 17f
 	  nop
 !	MAGIC_TRAP_ON				! enable debugging for instruction misses
 17:
-	sethi	%uhi(VM_MIN_DIRECT_ADDRESS), %g7
-	sllx	%g7, 32, %g7
-	cmp	%g5, %g7
-	blu	%xcc, 7f
-	  nop
-	MAGIC_TRAP_ON
-	MAGIC_EXIT
-7:	
-
-		
 #endif
+	
 tsb_miss_compute_hash_addr:
 	sethi	%hi(PAGE_SIZE), %g7
 	sub	%g7, 1, %g7			! %g7==PAGE_MASK
 
-	and	%g2, %g7, %g4		! size stored in lower 13 bits
-	andn	%g2, %g7, %g2		! actual VA of hash
+	and	%g2, %g7, %g4			! size stored in lower 13 bits
+	andn	%g2, %g7, %g2			! actual VA of hash
 
 	! XXX only handle 8k page miss
 	! calculate hash index
@@ -1372,53 +1385,53 @@
 	! fetch hash entries - exit when we find what were looking for 
 
 	! %g2==entry base
-	add	%g2, %g4, %g2		! base + offset == entry base
+	add	%g2, %g4, %g2			! base + offset == entry base
 	
-	mov %g5, %g7			! save fault addr
+	mov %g5, %g7				! save fault addr
 	! entry 0
 	! %g1 == abs index %g2 == THE pointer %g3 == flags
 	! %g4 <- tag %g5 <- data
 	! %g6 == search tag %g7 == fault addr
 tsb_miss_lookup_0:  
-	ldda	[%g2]ASI_LDTD_N, %g4
+	ldda	[%g2]%asi, %g4
 	cmp	%g4, %g0			! entry tag == 0 ?
-	be,pn	%xcc, 4f
+	be,pn	%xcc, 5f
 	  nop
 	cmp	%g4, %g6			! entry tag == VA tag?
-	be,pn	%xcc, 5f
+	be,pn	%xcc, 6f
 	  nop
 	! entry 1
-tsb_miss_lookup_1:	
-	add	%g2, 16, %g2		! next THF
-	ldda	[%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_1:
+	add	%g2, 16, %g2
+	ldda	[%g2]%asi, %g4
 	cmp	%g4, %g0			! entry tag == 0 ?
-	be,pn	%xcc, 4f
+	be,pn	%xcc, 5f
 	  nop
 	cmp	%g4, %g6			! entry tag == search tag?
-	be,pn	%xcc, 5f
+	be,pn	%xcc, 6f
 	  nop
 	! entry 2
-tsb_miss_lookup_2:	
-	add %	g2, 16, %g2		! next THF
-	ldda	[%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_2:
+	add	%g2, 16, %g2
+	ldda	[%g2]%asi, %g4
 	cmp	%g4, %g0			! entry tag == 0 ?
-	be,pn	%xcc, 4f
+	be,pn	%xcc, 5f
 	  nop
 	cmp	%g4, %g6			! entry tag == search tag?
-	be,pn	%xcc, 5f
+	be,pn	%xcc, 6f
 	  nop
 	! entry 3
-tsb_miss_lookup_3:	
-	add	%g2, 16, %g2		! next THF
-	ldda	[%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_3:
+	add	%g2, 16, %g2
+	ldda	[%g2]%asi, %g4
 	cmp	%g4, %g0			! entry tag == 0 ?
-	be,pn	%xcc, 4f
+	be,pn	%xcc, 5f
 	  nop
 	cmp	%g4, %g6			! entry tag == search tag?
-	be,pn	%xcc, 5f				
+	be,pn	%xcc, 6f				
 	  nop
 tsb_miss_not_found:	
-4:	! not found
+5:	! not found
 	! we need to jump to tl0_trap to drop us back down to tl0
 	! and take us to trap(...) to service the fault
 #ifdef PMAP_DEBUG
@@ -1443,7 +1456,7 @@
 	  or	%g1, %lo(trap), %g1
 	
 tsb_miss_found:	
-5:	!found
+6:	!found
 	! %g1 == abs index %g2 == THE pointer %g3 == flags
 	! %g4 == tag %g5 == data %g7 == PAGE_MASK
 	! %g3 <- TSB RA %g6 <- TSB size, TTE RA %g7 == PAGE_MASK
@@ -1455,10 +1468,10 @@
 	sub	%g7, 1, %g7				! %g7==PAGE_MASK
 
 	cmp	%g3, T_DATA_MISS		! TSB data miss
-	be,pt	%xcc, 6f
+	be,pt	%xcc, 7f
 	  or	%g5, VTD_REF, %g5		! set referenced unconditionally
 	cmp	%g3, T_INSTRUCTION_MISS		! TSB instruction miss
-	be,pt	%xcc, 6f
+	be,pt	%xcc, 7f
 	  nop
 	cmp	%g3, T_DATA_PROTECTION		! protection fault
 	bne,pn	%xcc, unsupported_fault_trap	! we don't handle any other fault types currently
@@ -1467,9 +1480,14 @@
 	bz,pn	%xcc, prot_fault_trap		! write to read only page
 	  nop
 	or	%g5, VTD_W, %g5			! add modifed bit 
-6:		
-	stx	%g5, [%g2 + 8]			! update TTE
+7:	
+	rdpr	%tl, %g3
+	dec	%g3
+	movrnz	%g3, ASI_REAL, %g3
+	movrz	%g3, ASI_N, %g3
+	wr	%g0, %g3, %asi
 
+	stxa	%g5, [%g2 + 8]%asi		! update TTE
 	andcc	%g6, %g7, %g0			! kernel context?
 	bz,pn	%xcc, 8f
 	  nop
@@ -1492,6 +1510,8 @@
 	ldda	[%g2]ASI_LDTD_REAL, %g2
 	cmp	%g3, %g5
 	bne,pt	%xcc, 10f
+	cmp	%g2, %g4
+	bne,pt	%xcc, 10f
 	  nop
 	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT	! die if all we're doing 
 						! is storing same data



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