Module Name:    src
Committed By:   matt
Date:           Mon Feb 27 17:04:40 UTC 2012

Modified Files:
        src/sys/arch/mips/include [matt-nb5-mips64]: cpu.h
        src/sys/arch/mips/mips [matt-nb5-mips64]: cpu_subr.c genassym.cf
            mipsX_subr.S syscall.c trap.c

Log Message:
Count all traps types.


To generate a diff of this commit:
cvs rdiff -u -r1.90.16.43 -r1.90.16.44 src/sys/arch/mips/include/cpu.h
cvs rdiff -u -r1.1.2.24 -r1.1.2.25 src/sys/arch/mips/mips/cpu_subr.c
cvs rdiff -u -r1.44.12.31 -r1.44.12.32 src/sys/arch/mips/mips/genassym.cf
cvs rdiff -u -r1.26.36.1.2.55 -r1.26.36.1.2.56 \
    src/sys/arch/mips/mips/mipsX_subr.S
cvs rdiff -u -r1.37.12.15 -r1.37.12.16 src/sys/arch/mips/mips/syscall.c
cvs rdiff -u -r1.217.12.42 -r1.217.12.43 src/sys/arch/mips/mips/trap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/include/cpu.h
diff -u src/sys/arch/mips/include/cpu.h:1.90.16.43 src/sys/arch/mips/include/cpu.h:1.90.16.44
--- src/sys/arch/mips/include/cpu.h:1.90.16.43	Mon Feb 13 18:20:25 2012
+++ src/sys/arch/mips/include/cpu.h	Mon Feb 27 17:04:39 2012
@@ -107,9 +107,12 @@ struct cpu_info {
 	volatile u_int ci_softints;
 	struct evcnt ci_ev_fpu_loads;	/* fpu load counter */
 	struct evcnt ci_ev_fpu_saves;	/* fpu save counter */
-	struct evcnt ci_ev_kern_tlbmisses;
-	struct evcnt ci_ev_user_tlbmisses;
+	struct evcnt ci_ev_traps[2][32];
+	struct evcnt ci_ev_kern_tlb_misses;
+	struct evcnt ci_ev_user_tlb_misses;
 	struct evcnt ci_ev_tlblocked;
+	char ci_ev_kern_trap_group[12];
+	char ci_ev_user_trap_group[12];
 
 	/*
 	 * Per-cpu pmap information

Index: src/sys/arch/mips/mips/cpu_subr.c
diff -u src/sys/arch/mips/mips/cpu_subr.c:1.1.2.24 src/sys/arch/mips/mips/cpu_subr.c:1.1.2.25
--- src/sys/arch/mips/mips/cpu_subr.c:1.1.2.24	Thu Feb 16 10:47:06 2012
+++ src/sys/arch/mips/mips/cpu_subr.c	Mon Feb 27 17:04:39 2012
@@ -138,18 +138,15 @@ cpu_info_alloc(struct pmap_tlb_info *ti,
 	 * it and its locks.
 	 */
 	if (ti == NULL) {
-		const size_t ti_size = roundup2(sizeof(*ti), COHERENCY_UNIT)
-		    + 2*COHERENCY_UNIT;
+		const size_t ti_size = roundup2(sizeof(*ti), COHERENCY_UNIT);
 		if (cpu_info_offset >= ti_size) {
-			ti = (void *) (va + cpu_info_offset - ti_size);
+			ti = (void *) (va + cpu_info_offset);
 		} else {
 			KASSERT(PAGE_SIZE - cpu_info_offset + sizeof(*ci) >= ti_size);
 			ti = (struct pmap_tlb_info *)(va + PAGE_SIZE - ti_size);
 		}
-		ti->ti_lock = (kmutex_t *)
-		    roundup2((intptr_t)ti + sizeof(*ti), COHERENCY_UNIT);
-		ti->ti_hwlock = (kmutex_t *)
-		    ((intptr_t)ti->ti_lock + COHERENCY_UNIT);
+		ti->ti_lock = (kmutex_t *)((intptr_t)ti - COHERENCY_UNIT);
+		ti->ti_hwlock = (kmutex_t *)((intptr_t)ti - 2*COHERENCY_UNIT);
 		pmap_tlb_info_init(ti);
 	}
 
@@ -225,6 +222,41 @@ cpu_hwrena_setup(void)
 #endif
 }
 
+static const char * const ev_trap_names[32] = {
+	"interrupts",
+	"TLB modifications",
+	"load TLB invalid",
+	"store TLB invalid",
+	"load address errors",
+	"store address errors",
+	"I-fetch bus errors",
+	"load/store bus errors",
+	"system calls",
+	"breakpoints",
+	"reserved instructions",
+	"unusable coprocessors",
+	"arithmetic overflows",
+	"trap exceptions",
+	"VCI exceptions",
+	"FP exceptions",
+	"reserved 16",
+	"reserved 17",
+	"COP2 exceptions",
+	"TLB RI exceptions",
+	"TLB XI exceptions",
+	"reserved 21",
+	"MDMX exceptions",
+	"watch exceptions",
+	"machine checks",
+	"thread activations",
+	"DSP exceptions",
+	"reserved 27",
+	"reserved 28",
+	"reserved 29",
+	"cache errors",
+	"VCD exceptions",
+};
+
 void
 cpu_attach_common(device_t self, struct cpu_info *ci)
 {
@@ -249,12 +281,24 @@ cpu_attach_common(device_t self, struct 
 	evcnt_attach_dynamic(&ci->ci_ev_fpu_saves,
 		EVCNT_TYPE_MISC, NULL, xname,
 		"fpu saves");
-	evcnt_attach_dynamic(&ci->ci_ev_user_tlbmisses,
-		EVCNT_TYPE_TRAP, NULL, xname,
-		"user tlb misses");
-	evcnt_attach_dynamic(&ci->ci_ev_kern_tlbmisses,
-		EVCNT_TYPE_TRAP, NULL, xname,
-		"kern tlb misses");
+	snprintf(ci->ci_ev_kern_trap_group, sizeof(ci->ci_ev_kern_trap_group),
+	    "%s kern", xname);
+	snprintf(ci->ci_ev_user_trap_group, sizeof(ci->ci_ev_user_trap_group),
+	    "%s user", xname);
+	evcnt_attach_dynamic(&ci->ci_ev_kern_tlb_misses,
+		EVCNT_TYPE_TRAP, NULL, ci->ci_ev_kern_trap_group,
+		"TLB misses");
+	evcnt_attach_dynamic(&ci->ci_ev_user_tlb_misses,
+		EVCNT_TYPE_TRAP, NULL, ci->ci_ev_user_trap_group,
+		"TLB misses");
+	for (u_int i = 0; i < 32; i++) {
+		evcnt_attach_dynamic(&ci->ci_ev_traps[0][i],
+			EVCNT_TYPE_TRAP, NULL, ci->ci_ev_kern_trap_group,
+			ev_trap_names[i]);
+		evcnt_attach_dynamic(&ci->ci_ev_traps[1][i],
+			EVCNT_TYPE_TRAP, NULL, ci->ci_ev_user_trap_group,
+			ev_trap_names[i]);
+	}
 	evcnt_attach_dynamic(&ci->ci_ev_tlblocked,
 		EVCNT_TYPE_MISC, NULL, xname,
 		"tlb locked");

Index: src/sys/arch/mips/mips/genassym.cf
diff -u src/sys/arch/mips/mips/genassym.cf:1.44.12.31 src/sys/arch/mips/mips/genassym.cf:1.44.12.32
--- src/sys/arch/mips/mips/genassym.cf:1.44.12.31	Fri Dec 23 22:48:07 2011
+++ src/sys/arch/mips/mips/genassym.cf	Mon Feb 27 17:04:39 2012
@@ -89,6 +89,7 @@ include <mips/regnum.h>
 include <mips/vmparam.h>
 include <mips/pte.h>
 include <mips/locore.h>
+include <mips/trap.h>
 
 define	PAGE_SIZE		PAGE_SIZE
 
@@ -289,13 +290,17 @@ ifdef MULTIPROCESSOR
 define	TI_HWLOCK	offsetof(struct pmap_tlb_info, ti_hwlock)
 endif
 
+define	EVCNT_SIZE	sizeof(struct evcnt)
+
 # CPU info
 define	CPU_INFO_CPL		offsetof(struct cpu_info, ci_cpl)
 define	CPU_INFO_IDEPTH		offsetof(struct cpu_info, ci_idepth)
 define	CPU_INFO_CURLWP		offsetof(struct cpu_info, ci_curlwp)
 define	CPU_INFO_IDLELWP	offsetof(struct cpu_info, ci_data.cpu_idlelwp)
-define	CPU_INFO_EV_USER_TLBMISSES	offsetof(struct cpu_info, ci_ev_user_tlbmisses.ev_count)
-define	CPU_INFO_EV_KERN_TLBMISSES	offsetof(struct cpu_info, ci_ev_kern_tlbmisses.ev_count)
+define	CPU_INFO_EV_USER_TLBMISSES	offsetof(struct cpu_info, ci_ev_user_tlb_misses.ev_count)
+define	CPU_INFO_EV_KERN_TLBMISSES	offsetof(struct cpu_info, ci_ev_kern_tlb_misses.ev_count)
+define	CPU_INFO_EV_USER_TLBINVALID	offsetof(struct cpu_info, ci_ev_traps[1][T_TLB_LD_MISS].ev_count)
+define	CPU_INFO_EV_KERN_TLBINVALID	offsetof(struct cpu_info, ci_ev_traps[0][T_TLB_LD_MISS].ev_count)
 define	CPU_INFO_EV_TLBLOCKED	offsetof(struct cpu_info, ci_ev_tlblocked.ev_count)
 define	CPU_INFO_PMAP_SEG0TAB	offsetof(struct cpu_info, ci_pmap_seg0tab)
 ifdef _LP64

Index: src/sys/arch/mips/mips/mipsX_subr.S
diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.55 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.56
--- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.55	Thu Feb  9 20:01:21 2012
+++ src/sys/arch/mips/mips/mipsX_subr.S	Mon Feb 27 17:04:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mipsX_subr.S,v 1.26.36.1.2.55 2012/02/09 20:01:21 matt Exp $	*/
+/*	$NetBSD: mipsX_subr.S,v 1.26.36.1.2.56 2012/02/27 17:04:39 matt Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -662,20 +662,18 @@ NESTED_NOPROFILE(MIPSX(kern_gen_exceptio
 	.mask	0x80000000, -4
 #ifdef PARANOIA
 	PTR_L	k0, L_PCB(MIPS_CURLWP)
-	slt	k0, k0, sp		# k0 = L_PCB(MIPS_CURLWP) < sp
+	PTR_ADDU k0, 1024		# k0 += 1024
+	PTR_SUBU k0, sp, k0		# k0 = sp - k0
+	sltui	k0, k0, USPACE-1024	# k0 = k0 < USPACE - 1024
 1:	beqz	k0, 1b			# loop forever if false
 	 nop
-	PTR_L	k0, L_PCB(MIPS_CURLWP)
-	PTR_ADDU k0, USPACE
-	slt	k0, sp, k0		# k0 = sp < L_PCB(MIPS_CURLWP) + USPACE
-2:	beqz	k0, 2b			# loop forever if false
-	 nop
 #endif /* PARANOIA
 /*
  * Save the relevant kernel registers onto the stack.
  * We don't need to save s0 - s8, sp and gp because
  * the compiler does it for us.
  */
+	move	k0, sp			# save for later
 	PTR_SUBU sp, KERNFRAME_SIZ
 	REG_S	AT, TF_BASE+TF_REG_AST(sp)
 	REG_S	v0, TF_BASE+TF_REG_V0(sp)
@@ -717,8 +715,7 @@ NESTED_NOPROFILE(MIPSX(kern_gen_exceptio
 	REG_S	s5, TF_BASE+TF_REG_S5(sp)
 	REG_S	s6, TF_BASE+TF_REG_S6(sp)
 	REG_S	s7, TF_BASE+TF_REG_S7(sp)
-	PTR_ADDU v0, sp, KERNFRAME_SIZ
-	REG_S	v0, TF_BASE+TF_REG_SP(sp)
+	REG_S	k0, TF_BASE+TF_REG_SP(sp)
 	REG_S	s8, TF_BASE+TF_REG_S8(sp)
 	REG_S	gp, TF_BASE+TF_REG_GP(sp)
 #endif
@@ -1668,10 +1665,16 @@ LEAF_NOPROFILE(MIPSX(kern_tlb_miss))
 	nop
 #endif
 #if (MIPS3 + MIPS64 + MIPS64R2 + MIPS64_RMIXL + MIPS64R2_RMIXL) > 0
-	lui	k1, %hi(CPUVAR(EV_KERN_TLBMISSES))
-	REG_L	k0, %lo(CPUVAR(EV_KERN_TLBMISSES))(k1)
+	PTR_L	k1, L_CPU(MIPS_CURLWP)
+#ifdef MIPS3
+	nop
+#endif
+	REG_L	k0, CPU_INFO_EV_KERN_TLBMISSES(k1)
+#ifdef MIPS3
+	nop
+#endif
 	REG_ADDU k0, 1
-	REG_S	k0, %lo(CPUVAR(EV_KERN_TLBMISSES))(k1)
+	REG_S	k0, CPU_INFO_EV_KERN_TLBMISSES(k1)
 #endif
 #if defined(MULTIPROCESSOR) && (MIPS64_RMIXL + MIPS64R2_RMIXL) > 0
 	_MFC0	k1, MIPS_COP_0_OSSCRATCH, 2	# get tlbinfo hwlock addr
@@ -1790,15 +1793,32 @@ LEAF_NOPROFILE(MIPSX(kern_tlb_invalid_ex
 #endif /* (PGSHIFT & 1) == 0 */
 	tlbwi					# write TLB
 	COP0_SYNC
-#ifdef MIPS3
-	nop
-	nop
+#if (MIPS3 + MIPS64 + MIPS64R2 + MIPS64_RMIXL + MIPS64R2_RMIXL) > 0
+MIPSX(kern_tlb_invalid_eret):
+	mfc0	k0, MIPS_COP_0_CAUSE
+#if (MIPS3) > 0
+	PTR_L	k1, L_CPU(MIPS_CURLWP)
+	and	k0, (T_TLB_LD_MISS ^ T_TLB_ST_MISS) << MIPS_CR_EXC_CODE_SHIFT
+	beqz	k0, 1f
+	 nop
+	PTR_ADDU k1, EVCNT_SIZE
+1:
+#else
+	li	k1, EVCNT_SIZE
+	and	k0, (T_TLB_LD_MISS ^ T_TLB_ST_MISS) << MIPS_CR_EXC_CODE_SHIFT
+	movn	k0, k1, k0			# if (k0) k0 = k1
+	PTR_L	k1, L_CPU(MIPS_CURLWP)
+	PTR_ADDU k1, k0
+#endif
+	REG_L	k0, CPU_INFO_EV_KERN_TLBINVALID(k1)
+	REG_ADDU k0, 1
+	REG_S	k0, CPU_INFO_EV_KERN_TLBINVALID(k1)
 #endif
 #if defined(MULTIPROCESSOR) && (MIPS64_RMIXL + MIPS64R2_RMIXL) > 0
-	_MFC0	k1, MIPS_COP_0_OSSCRATCH, 2	# get tlblock addr
+	_MFC0	k1, MIPS_COP_0_OSSCRATCH, 2	# get tlbinfo hwlock addr
 	INT_S	zero, 0(k1)			# clear lock
-99:
 #endif
+99:
 	eret
 
 #if (PGSHIFT & 1) == 0
@@ -1833,15 +1853,12 @@ MIPSX(kern_tlbi_odd):
 	COP0_SYNC
 	tlbwi					# update TLB
 	COP0_SYNC
-#ifdef MIPS3
-	nop
-	nop
-#endif
-#if defined(MULTIPROCESSOR) && (MIPS64_RMIXL + MIPS64R2_RMIXL) > 0
-	_MFC0	k1, MIPS_COP_0_OSSCRATCH, 2	# get tlblock addr
-	INT_S	zero, 0(k1)			# clear lock
-#endif
+#if (MIPS32 + MIPS32R2) > 0
 	eret
+#else
+	b	MIPSX(kern_tlb_invalid_eret)
+	 nop
+#endif
 #endif /* (PGSHIFT & 1) == 0 */
 
 #if defined(MULTIPROCESSOR) && (MIPS64_RMIXL + MIPS64R2_RMIXL) > 0

Index: src/sys/arch/mips/mips/syscall.c
diff -u src/sys/arch/mips/mips/syscall.c:1.37.12.15 src/sys/arch/mips/mips/syscall.c:1.37.12.16
--- src/sys/arch/mips/mips/syscall.c:1.37.12.15	Fri Apr 29 08:26:30 2011
+++ src/sys/arch/mips/mips/syscall.c	Mon Feb 27 17:04:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: syscall.c,v 1.37.12.15 2011/04/29 08:26:30 matt Exp $	*/
+/*	syscall.c,v 1.37.12.15 2011/04/29 08:26:30 matt Exp	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.37.12.15 2011/04/29 08:26:30 matt Exp $");
+__KERNEL_RCSID(0, "syscall.c,v 1.37.12.15 2011/04/29 08:26:30 matt Exp");
 
 #if defined(_KERNEL_OPT)
 #include "opt_sa.h"
@@ -149,11 +149,13 @@ EMULNAME(syscall)(struct lwp *l, u_int s
 	LWP_CACHE_CREDS(l, p);
 
 	curcpu()->ci_data.cpu_nsyscall++;
+	curcpu()->ci_ev_traps[1][T_SYSCALL].ev_count++;
 
-	if (cause & MIPS_CR_BR_DELAY)
+	if (cause & MIPS_CR_BR_DELAY) {
 		reg->r_regs[_R_PC] = mips_emul_branch(tf, pc, 0, false);
-	else
+	} else {
 		reg->r_regs[_R_PC] = pc + sizeof(uint32_t);
+	}
 
 	callp = p->p_emul->e_sysent;
 	saved_v0 = code = reg->r_regs[_R_V0];

Index: src/sys/arch/mips/mips/trap.c
diff -u src/sys/arch/mips/mips/trap.c:1.217.12.42 src/sys/arch/mips/mips/trap.c:1.217.12.43
--- src/sys/arch/mips/mips/trap.c:1.217.12.42	Mon Feb 13 08:13:42 2012
+++ src/sys/arch/mips/mips/trap.c	Mon Feb 27 17:04:39 2012
@@ -99,24 +99,24 @@ const char * const trap_names[] = {
 	"reserved instruction",
 	"coprocessor unusable",
 	"arithmetic overflow",
-	"r4k trap/r3k reserved 13",
+	"trap",
 	"r4k virtual coherency instruction/r3k reserved 14",
-	"r4k floating point/ r3k reserved 15",
+	"floating point",
 	"reserved 16",
 	"reserved 17",
 	"mipsNN cp2 exception",
-	"reserved 19",
-	"reserved 20",
+	"TLB read-inhibit exception",
+	"TLB execute-inhibit exception",
 	"reserved 21",
-	"mips64 MDMX",
-	"r4k watch",
-	"mipsNN machine check",
-	"reserved 25",
-	"reserved 26",
+	"MDMX",
+	"watch",
+	"machine-check",
+	"thread activation",
+	"DSP exception",
 	"reserved 27",
 	"reserved 28",
 	"reserved 29",
-	"mipsNN cache error",
+	"cache error",
 	"r4000 virtual coherency data",
 };
 
@@ -174,9 +174,12 @@ trap(uint32_t status, uint32_t cause, va
 	curcpu()->ci_data.cpu_ntrap++;
 	type = TRAPTYPE(cause);
 	if (USERMODE(status)) {
+		curcpu()->ci_ev_traps[1][type].ev_count++;
 		tf = utf;
 		type |= T_USER;
 		LWP_CACHE_CREDS(l, p);
+	} else {
+		curcpu()->ci_ev_traps[0][type].ev_count++;
 	}
 
 	switch (type) {

Reply via email to