aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKip Macy <kmacy@FreeBSD.org>2006-11-22 00:18:22 +0000
committerKip Macy <kmacy@FreeBSD.org>2006-11-22 00:18:22 +0000
commit3cf970e7bcfcf1569bd9b2e8710cc581ff7309e2 (patch)
tree25436389a25d265318579109eb8d723d84974ad6
parent7c3d7aad2e945b595649a6dd38eda1c4d6b1b9bd (diff)
downloadsrc-3cf970e7bcfcf1569bd9b2e8710cc581ff7309e2.tar.gz
src-3cf970e7bcfcf1569bd9b2e8710cc581ff7309e2.zip
Add mechanism to track TSB misses in tsb miss handler
Remove unused debug code
Notes
Notes: svn path=/head/; revision=164485
-rw-r--r--sys/sparc64/sparc64/genassym.c2
-rw-r--r--sys/sun4v/include/pmap.h2
-rw-r--r--sys/sun4v/sun4v/exception.S90
3 files changed, 53 insertions, 41 deletions
diff --git a/sys/sparc64/sparc64/genassym.c b/sys/sparc64/sparc64/genassym.c
index 84c3f3a0ef42..092312a7d13f 100644
--- a/sys/sparc64/sparc64/genassym.c
+++ b/sys/sparc64/sparc64/genassym.c
@@ -233,6 +233,8 @@ ASSYM(PC_TSBWBUF, offsetof(struct pcpu, pc_tsbwbuf));
ASSYM(PCB_KSTACK, offsetof(struct pcb, pcb_kstack));
ASSYM(INTR_REPORT_SIZE, INTR_REPORT_SIZE);
+ASSYM(PM_TSB_MISS_COUNT, offsetof(struct pmap, pm_tsb_miss_count));
+ASSYM(PM_TSB_CAP_MISS_COUNT, offsetof(struct pmap, pm_tsb_cap_miss_count));
#else
ASSYM(PC_MID, offsetof(struct pcpu, pc_mid));
ASSYM(PC_TLB_CTX, offsetof(struct pcpu, pc_tlb_ctx));
diff --git a/sys/sun4v/include/pmap.h b/sys/sun4v/include/pmap.h
index 599ceddb305b..b08629ad1d85 100644
--- a/sys/sun4v/include/pmap.h
+++ b/sys/sun4v/include/pmap.h
@@ -73,6 +73,8 @@ struct pmap {
pmap_cpumask_t pm_active; /* mask of cpus currently using pmap */
pmap_cpumask_t pm_tlbactive; /* mask of cpus that have used this pmap */
struct pmap_statistics pm_stats;
+ uint32_t pm_tsb_miss_count;
+ uint32_t pm_tsb_cap_miss_count;
};
#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx)
diff --git a/sys/sun4v/sun4v/exception.S b/sys/sun4v/sun4v/exception.S
index e8dfeabdb899..41968b83cac7 100644
--- a/sys/sun4v/sun4v/exception.S
+++ b/sys/sun4v/sun4v/exception.S
@@ -63,10 +63,14 @@ __FBSDID("$FreeBSD$")
#define PCB_REG %g6
#define PUTCHAR(x) \
+0: ; \
mov x, %o0 ; \
mov CONS_WRITE, %o5 ; \
- ta FAST_TRAP
-/*
+ ta FAST_TRAP ; \
+ brnz %o0, 0b ; \
+ nop
+
+/*
* Atomically set the reference bit in a tte.
*/
#define TTE_SET_BIT(r1, r2, r3, bit) \
@@ -1410,7 +1414,7 @@ ENTRY(tl0_trap)
nop
ENTRY(tl0_utrap)
GET_PCPU_SCRATCH
-
+
cmp %g2, UT_MAX
bge,a,pn %xcc, skip_utrap
nop
@@ -1543,7 +1547,7 @@ END(tl0_intr)
#define ENTER #Sync
#define EXIT #Sync
#endif
-
+
#define THE_LOCK_ENTER(addr, lock_bit, oldval, newval, label1) \
mov 1, lock_bit ; \
add addr, 8, addr ; \
@@ -1789,7 +1793,7 @@ tsb_miss_found:
cmp %g3, TT_DATA_MISS ! TSB data miss
be,pt %xcc, 9f
or %l7, VTD_REF, %l7 ! set referenced unconditionally
- cmp %g3, TT_INSTRUCTION_MISS ! TSB instruction miss
+ cmp %g3, TT_INSTRUCTION_MISS ! TSB instruction miss
be,pt %xcc, 9f
nop
cmp %g3, TT_DATA_PROTECTION ! protection fault
@@ -1805,44 +1809,48 @@ tsb_miss_found:
and %g4, %l1, %g3 ! size of TSB in pages
andn %g4, %l1, %l3 ! TSB real address
-
- sllx %g3, (PAGE_SHIFT - TTE_SHIFT), %g3 ! nttes
+
+#ifdef notyet
+ mov 1, %l2
+ add %g3, (PAGE_SHIFT - TTE_SHIFT), %g3 ! add shift value for number of ttes / page
+ sllx %l2, %g3, %g3 ! nttes
+#else
+ sllx %g3, (PAGE_SHIFT - TTE_SHIFT), %g3
+#endif
subx %g3, 1, %g3 ! TSB_MASK
and %g3, %l4, %g3 ! masked index
sllx %g3, TTE_SHIFT, %g3 ! masked byte offset
add %g3, %l3, %g3 ! TTE RA
-#if 0
-#ifdef PMAP_DEBUG
- ldxa [%g3]%asi, %l2
- ldxa [%g3 + 8]%asi, %l3
- cmp %l3, %l7
- bne,pt %xcc, 12f
- cmp %l2, %l6
- bne,pt %xcc, 12f
+ rdpr %tl, %l2 ! don't track misses for kernel context
+ brz,pn %g6, 13f
+ dec %l2
+ brnz,pn %l2, 13f ! don't track misses at tl > 1
nop
-#ifndef SMP
-! MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing
- ! is storing same data
-#else
- mov %o0, %l2
- mov %o5, %g4
- PUTCHAR(0x5a)
- lda [PCPU_REG + PC_CPUID]%asi, %o0
- add %o0, 0x30, %o0
- PUTCHAR(%o0)
- PUTCHAR(0x5a)
- mov %l2, %o0
- mov %g4, %o5
-! MAGIC_TRAP_ON; MAGIC_TRAP_OFF
-#endif
-12:
-#endif
-#endif
- stxa %g0, [%g3 + 8]%asi ! invalidate data
-#ifndef WORKING
- membar #Sync
-#endif
+ ldx [PCPU(PMAP)], %l1
+ ld [%l1 + PM_TSB_MISS_COUNT], %l3
+ add 1, %l3, %l3
+ st %l3, [%l1 + PM_TSB_MISS_COUNT]
+
+ ! if the data value is zero then this is not a capacity miss
+ ldda [%g3]ASI_LDTD_N, %l2
+ brz,pt %l3, 13f
+ nop
+ ! compare the tag bits - if they're the same we're merely
+ ! changing the mapping
+ brz,pt %l3, 13f
+ nop
+ cmp %l6, %l2
+ beq,pt %xcc, 13f
+ nop
+
+ ld [%l1 + PM_TSB_CAP_MISS_COUNT], %l3
+ add 1, %l3, %l3
+ st %l3, [%l1 + PM_TSB_CAP_MISS_COUNT]
+
+13: stxa %g0, [%g3 + 8]%asi ! invalidate data
+ membar #StoreStore
+
stxa %l6, [%g3]%asi ! store tag
stxa %l7, [%g3 + 8]%asi ! store data
stxa %l7, [%g2 + 8]%asi ! update TTE with ref bit
@@ -1897,10 +1905,10 @@ END(prot_fault_trap)
* Programming error
*/
ENTRY(unsupported_fault_trap)
+ add 0x20, %g3, %g1
PUTCHAR(0x5b)
- PUTCHAR(0x5b)
- PUTCHAR(0x5b)
-! MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
+ PUTCHAR(%g1)
+ PUTCHAR(0x5d)
END(unsupported_fault_trap)
@@ -1938,7 +1946,7 @@ ENTRY(tl1_trap)
wr %g0, ASI_REAL, %asi
TTRACE_ADD_SAFE(%g6, 0, 0, 0, 0, 0)
#endif
- ! assume no tl1 handler
+ ! assume no tl1 handler
rdpr %tpc, %g7
set rtt_fill_start, %g6