From owner-svn-src-projects@FreeBSD.ORG Wed Nov 18 22:52:06 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 26236106566B; Wed, 18 Nov 2009 22:52:06 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 139988FC08; Wed, 18 Nov 2009 22:52:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nAIMq50O086662; Wed, 18 Nov 2009 22:52:05 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAIMq5LV086656; Wed, 18 Nov 2009 22:52:05 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <200911182252.nAIMq5LV086656@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Wed, 18 Nov 2009 22:52:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199496 - in projects/mips/sys/mips: include mips X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Nov 2009 22:52:06 -0000 Author: gonzo Date: Wed Nov 18 22:52:05 2009 New Revision: 199496 URL: http://svn.freebsd.org/changeset/base/199496 Log: - Add cpu_init_interrupts function that is supposed to prepeare stuff required for spinning out interrupts later - Add API for managing intrcnt/intrnames arrays - Some minor style(9) fixes Modified: projects/mips/sys/mips/include/intr_machdep.h projects/mips/sys/mips/mips/exception.S projects/mips/sys/mips/mips/genassym.c projects/mips/sys/mips/mips/intr_machdep.c projects/mips/sys/mips/mips/machdep.c Modified: projects/mips/sys/mips/include/intr_machdep.h ============================================================================== --- projects/mips/sys/mips/include/intr_machdep.h Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/include/intr_machdep.h Wed Nov 18 22:52:05 2009 (r199496) @@ -52,11 +52,25 @@ extern struct mips_intrhand mips_intr_ha struct trapframe; +void cpu_init_interrupts(void); void cpu_establish_hardintr(const char *, driver_filter_t *, driver_intr_t *, void *, int, int, void **); void cpu_establish_softintr(const char *, driver_filter_t *, void (*)(void*), void *, int, int, void **); void cpu_intr(struct trapframe *); +/* + * Opaque datatype that represents intr counter + */ +typedef unsigned long* mips_intrcnt_t; +mips_intrcnt_t mips_intrcnt_create(const char *); +void mips_intrcnt_setname(mips_intrcnt_t, const char *); + +static __inline void +mips_intrcnt_inc(mips_intrcnt_t counter) +{ + if (counter) + atomic_add_long(counter, 1); +} #endif /* !_MACHINE_INTR_MACHDEP_H_ */ Modified: projects/mips/sys/mips/mips/exception.S ============================================================================== --- projects/mips/sys/mips/mips/exception.S Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/exception.S Wed Nov 18 22:52:05 2009 (r199496) @@ -97,6 +97,11 @@ #endif /* + * Reasonable limit + */ +#define INTRCNT_COUNT 128 + +/* * Assume that w alaways need nops to escape CP0 hazard * TODO: Make hazard delays configurable. Stuck with 5 cycles on the moment * For more info on CP0 hazards see Chapter 7 (p.99) of "MIPS32 Architecture @@ -1273,15 +1278,11 @@ END(MipsFPTrap) .globl intrnames .globl eintrnames intrnames: - .asciiz "clock" - .asciiz "rtc" - .asciiz "sio" - .asciiz "pe" - .asciiz "pic-nic" + .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 eintrnames: - .align 2 + .align 4 intrcnt: - .word 0,0,0,0,0 + .space INTRCNT_COUNT * 4 * 2 eintrcnt: Modified: projects/mips/sys/mips/mips/genassym.c ============================================================================== --- projects/mips/sys/mips/mips/genassym.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/genassym.c Wed Nov 18 22:52:05 2009 (r199496) @@ -99,3 +99,4 @@ ASSYM(NPTEPG, NPTEPG); ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED); ASSYM(TDF_ASTPENDING, TDF_ASTPENDING); ASSYM(PCPU_SIZE, sizeof(struct pcpu)); +ASSYM(MAXCOMLEN, MAXCOMLEN); Modified: projects/mips/sys/mips/mips/intr_machdep.c ============================================================================== --- projects/mips/sys/mips/mips/intr_machdep.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/intr_machdep.c Wed Nov 18 22:52:05 2009 (r199496) @@ -46,12 +46,29 @@ __FBSDID("$FreeBSD$"); static struct intr_event *hardintr_events[NHARD_IRQS]; static struct intr_event *softintr_events[NSOFT_IRQS]; +static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS]; -#ifdef notyet -static int intrcnt_tab[NHARD_IRQS + NSOFT_IRQS]; -static int intrcnt_index = 0; -static int last_printed = 0; -#endif +static int intrcnt_index; + +mips_intrcnt_t +mips_intrcnt_create(const char* name) +{ + mips_intrcnt_t counter = &intrcnt[intrcnt_index++]; + + mips_intrcnt_setname(counter, name); + return counter; +} + +void +mips_intrcnt_setname(mips_intrcnt_t counter, const char *name) +{ + int idx = counter - intrcnt; + + KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter")); + + snprintf(intrnames + (MAXCOMLEN + 1) * idx, + MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name); +} static void mips_mask_hard_irq(void *source) @@ -85,6 +102,30 @@ mips_unmask_soft_irq(void *source) mips_wr_status(mips_rd_status() | ((1 << irq) << 8)); } +/* + * Perform initialization of interrupts prior to setting + * handlings + */ +void +cpu_init_interrupts() +{ + int i; + char name[MAXCOMLEN + 1]; + + /* + * Initialize all available vectors so spare IRQ + * would show up in systat output + */ + for (i = 0; i < NSOFT_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "sint%d:", i); + mips_intr_counters[i] = mips_intrcnt_create(name); + } + + for (i = 0; i < NHARD_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "int%d:", i); + mips_intr_counters[NSOFT_IRQS + i] = mips_intrcnt_create(name); + } +} void cpu_establish_hardintr(const char *name, driver_filter_t *filt, @@ -107,23 +148,17 @@ cpu_establish_hardintr(const char *name, if (event == NULL) { error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, irq, mips_mask_hard_irq, mips_unmask_hard_irq, - NULL, NULL, "hard intr%d:", irq); + NULL, NULL, "int%d", irq); if (error) return; hardintr_events[irq] = event; -#ifdef notyet - last_printed += snprintf(intrnames + last_printed, - MAXCOMLEN + 1, "hard irq%d: %s", irq, name); - last_printed++; - intrcnt_tab[irq] = intrcnt_index; - intrcnt_index++; -#endif - } intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(mips_intr_counters[NSOFT_IRQS + irq], event->ie_fullname); + mips_unmask_hard_irq((void*)(uintptr_t)irq); } @@ -146,7 +181,7 @@ cpu_establish_softintr(const char *name, if (event == NULL) { error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, irq, mips_mask_soft_irq, mips_unmask_soft_irq, - NULL, NULL, "intr%d:", irq); + NULL, NULL, "sint%d:", irq); if (error) return; softintr_events[irq] = event; @@ -155,6 +190,8 @@ cpu_establish_softintr(const char *name, intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(mips_intr_counters[irq], event->ie_fullname); + mips_unmask_soft_irq((void*)(uintptr_t)irq); } @@ -184,6 +221,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 0; event = softintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[i]); break; default: /* Hardware interrupt. */ @@ -191,6 +229,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 1; event = hardintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[NSOFT_IRQS + i]); break; } Modified: projects/mips/sys/mips/mips/machdep.c ============================================================================== --- projects/mips/sys/mips/mips/machdep.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/machdep.c Wed Nov 18 22:52:05 2009 (r199496) @@ -75,16 +75,17 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include -#include -#include -#include -#include -#include #include #include +#include +#include +#include #include +#include +#include #ifdef DDB #include #include @@ -186,6 +187,7 @@ cpu_startup(void *dummy) printf("avail memory = %lu (%luMB)\n", ptoa(cnt.v_free_count), ptoa(cnt.v_free_count) / 1048576); + cpu_init_interrupts(); /* * Set up buffers, so they can be used to read disk labels.