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