Module Name:    src
Committed By:   mrg
Date:           Fri Jun  5 01:36:07 UTC 2009

Modified Files:
        src/sys/arch/sparc/sparc: genassym.cf intr.c locore.s

Log Message:
convert sparc "intrcnt" counters to evcnt(9) style.  XXX some of the names
could be better, but i just copied them from the old intrnames in locore.

i benchmarked this with a simple test of ircii ./configure && make, to see
if the additional load/store & arith would cause any noticeable degradation
as the change also converts 32 bit counters to 64 bits.  amusingly, the
only trend i saw in this was that for both portions, i see a consistent
(across at least 8 runs) benefit of about 0.8% improvement.  ie, the newer
larger code size / counter size code actually runs faster for some reason..
maybe there's a cacheline effect in the size of the code?

XXX the current implementation depends on a couple of things:
XXX   - ev_count member of evcnt{} is first and has offset 0
XXX   - that sizeof(struct evcnt) equals 32
XXX if these are not true, locore.s has #error's to catch it


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/arch/sparc/sparc/genassym.cf
cvs rdiff -u -r1.104 -r1.105 src/sys/arch/sparc/sparc/intr.c
cvs rdiff -u -r1.246 -r1.247 src/sys/arch/sparc/sparc/locore.s

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/sparc/sparc/genassym.cf
diff -u src/sys/arch/sparc/sparc/genassym.cf:1.56 src/sys/arch/sparc/sparc/genassym.cf:1.57
--- src/sys/arch/sparc/sparc/genassym.cf:1.56	Sat Sep 20 18:29:05 2008
+++ src/sys/arch/sparc/sparc/genassym.cf	Fri Jun  5 01:36:07 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.56 2008/09/20 18:29:05 tsutsui Exp $
+#	$NetBSD: genassym.cf,v 1.57 2009/06/05 01:36:07 mrg Exp $
 
 #
 # Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -129,6 +129,7 @@
 define	V_SOFT		offsetof(struct uvmexp, softs)
 define	V_FAULTS	offsetof(struct uvmexp, faults)
 define	EV_COUNT	offsetof(struct evcnt, ev_count)
+define	EV_STRUCTSIZE	sizeof(struct evcnt)
 
 # CPU info structure
 define	CPUINFO_STRUCTSIZE	sizeof(struct cpu_info)

Index: src/sys/arch/sparc/sparc/intr.c
diff -u src/sys/arch/sparc/sparc/intr.c:1.104 src/sys/arch/sparc/sparc/intr.c:1.105
--- src/sys/arch/sparc/sparc/intr.c:1.104	Wed May 27 02:19:50 2009
+++ src/sys/arch/sparc/sparc/intr.c	Fri Jun  5 01:36:07 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.104 2009/05/27 02:19:50 mrg Exp $ */
+/*	$NetBSD: intr.c,v 1.105 2009/06/05 01:36:07 mrg Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.104 2009/05/27 02:19:50 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.105 2009/06/05 01:36:07 mrg Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_sparc_arch.h"
@@ -80,6 +80,39 @@
 EVCNT_ATTACH_STATIC(lev14_evcnt);
 #endif
 
+struct evcnt intrcnt[15] = {
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "spur", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev1", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev2", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev3", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev4", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev5", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev6", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev7", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev8", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev9", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "clock", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev11", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev12", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev13", "hard"),
+   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "prof", "hard"),
+};
+
+EVCNT_ATTACH_STATIC2(intrcnt, 0);
+EVCNT_ATTACH_STATIC2(intrcnt, 1);
+EVCNT_ATTACH_STATIC2(intrcnt, 2);
+EVCNT_ATTACH_STATIC2(intrcnt, 3);
+EVCNT_ATTACH_STATIC2(intrcnt, 4);
+EVCNT_ATTACH_STATIC2(intrcnt, 5);
+EVCNT_ATTACH_STATIC2(intrcnt, 6);
+EVCNT_ATTACH_STATIC2(intrcnt, 7);
+EVCNT_ATTACH_STATIC2(intrcnt, 8);
+EVCNT_ATTACH_STATIC2(intrcnt, 9);
+EVCNT_ATTACH_STATIC2(intrcnt, 10);
+EVCNT_ATTACH_STATIC2(intrcnt, 11);
+EVCNT_ATTACH_STATIC2(intrcnt, 12);
+EVCNT_ATTACH_STATIC2(intrcnt, 13);
+EVCNT_ATTACH_STATIC2(intrcnt, 14);
 
 void	strayintr(struct clockframe *);
 #ifdef DIAGNOSTIC

Index: src/sys/arch/sparc/sparc/locore.s
diff -u src/sys/arch/sparc/sparc/locore.s:1.246 src/sys/arch/sparc/sparc/locore.s:1.247
--- src/sys/arch/sparc/sparc/locore.s:1.246	Fri May 29 22:06:55 2009
+++ src/sys/arch/sparc/sparc/locore.s	Fri Jun  5 01:36:07 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.246 2009/05/29 22:06:55 mrg Exp $	*/
+/*	$NetBSD: locore.s,v 1.247 2009/06/05 01:36:07 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -118,6 +118,15 @@
 	inc	%o1; \
 	st	%o1, [%o0 + %lo(what)]
 
+#if EV_COUNT != 0
+# error "this code does not work with EV_COUNT != 0"
+#endif
+#if EV_STRUCTSIZE != 32
+# error "this code does not work with EV_STRUCTSIZE != 32"
+#else
+# define EV_STRUCTSHIFT	5
+#endif
+
 /*
  * Another handy macro: load one register window, given `base' address.
  * This can be either a simple register (e.g., %sp) or include an initial
@@ -2518,11 +2527,13 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	_C_LABEL(intrcnt), %l4	! intrcnt[intlev]++;
-	ld	[%l4 + %l5], %o0
+	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+	sll	%l3, EV_STRUCTSHIFT, %o2
+	ldd	[%l4 + %o2], %o0
 	std	%l2, [%sp + CCFSZ + 8]
-	inc	%o0
-	st	%o0, [%l4 + %l5]
+	inccc   %o1
+	addx    %o0, 0, %o0
+	std	%o0, [%l4 + %o2]
 	set	_C_LABEL(sintrhand), %l4! %l4 = sintrhand[intlev];
 	ld	[%l4 + %l5], %l4
 
@@ -2670,11 +2681,13 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	_C_LABEL(intrcnt), %l4	! intrcnt[intlev]++;
-	ld	[%l4 + %l5], %o0
+	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+	sll	%l3, EV_STRUCTSHIFT, %o2
+	ldd	[%l4 + %o2], %o0
 	std	%l2, [%sp + CCFSZ + 8]	! set up intrframe/clockframe
-	inc	%o0
-	st	%o0, [%l4 + %l5]
+	inccc   %o1
+	addx    %o0, 0, %o0
+	std	%o0, [%l4 + %o2]
 
 	st	%fp, [%sp + CCFSZ + 16]
 
@@ -2715,11 +2728,13 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	_C_LABEL(intrcnt), %l4	! intrcnt[intlev]++;
-	ld	[%l4 + %l5], %o0
+	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+	sll	%l3, EV_STRUCTSHIFT, %o2
+	ldd	[%l4 + %o2], %o0
 	std	%l2, [%sp + CCFSZ + 8]	! set up intrframe/clockframe
-	inc	%o0
-	st	%o0, [%l4 + %l5]
+	inccc   %o1
+	addx    %o0, 0, %o0
+	std	%o0, [%l4 + %o2]
 	set	_C_LABEL(intrhand), %l4	! %l4 = intrhand[intlev];
 	ld	[%l4 + %l5], %l4
 
@@ -6320,30 +6335,5 @@
 _C_LABEL(proc0paddr):
 	.word	_C_LABEL(u0)	! KVA of proc0 uarea
 
-/* interrupt counters	XXX THESE BELONG ELSEWHERE (if anywhere) */
-	.globl	_C_LABEL(intrcnt), _C_LABEL(eintrcnt)
-	.globl	_C_LABEL(intrnames), _C_LABEL(eintrnames)
-_C_LABEL(intrnames):
-	.asciz	"spur"
-	.asciz	"lev1"
-	.asciz	"lev2"
-	.asciz	"lev3"
-	.asciz	"lev4"
-	.asciz	"lev5"
-	.asciz	"lev6"
-	.asciz	"lev7"
-	.asciz  "lev8"
-	.asciz	"lev9"
-	.asciz	"clock"
-	.asciz	"lev11"
-	.asciz	"lev12"
-	.asciz	"lev13"
-	.asciz	"prof"
-_C_LABEL(eintrnames):
-	_ALIGN
-_C_LABEL(intrcnt):
-	.skip	4*15
-_C_LABEL(eintrcnt):
-
 	.comm	_C_LABEL(nwindows), 4
 	.comm	_C_LABEL(romp), 4

Reply via email to