Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc64 Revamp interrupts again:



details:   https://anonhg.NetBSD.org/src/rev/d77c1b475d37
branches:  trunk
changeset: 483692:d77c1b475d37
user:      eeh <eeh%NetBSD.org@localhost>
date:      Thu Mar 16 02:36:56 2000 +0000

description:
Revamp interrupts again:

        Fix a bug causing interrmittent panics in interrupt dispatch.
        Use interrupt vectors for softints.
        Add a new send_softint interface.
        Improved D$ flushing.
        Improve traptrace and other debugging enhancements.

diffstat:

 sys/arch/sparc64/dev/fd.c               |   26 +-
 sys/arch/sparc64/dev/zs.c               |   32 +--
 sys/arch/sparc64/include/cpu.h          |   16 +-
 sys/arch/sparc64/include/db_machdep.h   |   20 +-
 sys/arch/sparc64/include/intr.h         |    3 +-
 sys/arch/sparc64/sparc64/autoconf.c     |   13 +-
 sys/arch/sparc64/sparc64/db_interface.c |  131 +++++++-----
 sys/arch/sparc64/sparc64/db_trace.c     |   25 ++-
 sys/arch/sparc64/sparc64/intr.c         |   75 ++++--
 sys/arch/sparc64/sparc64/intreg.h       |    6 +-
 sys/arch/sparc64/sparc64/locore.s       |  338 +++++++++++++++++++++----------
 sys/arch/sparc64/sparc64/pmap.c         |   18 +-
 12 files changed, 431 insertions(+), 272 deletions(-)

diffs (truncated from 1512 to 300 lines):

diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/dev/fd.c
--- a/sys/arch/sparc64/dev/fd.c Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/dev/fd.c Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fd.c,v 1.11 2000/02/07 20:16:53 thorpej Exp $  */
+/*     $NetBSD: fd.c,v 1.12 2000/03/16 02:36:56 eeh Exp $      */
 
 /*-
  * Copyright (c) 1993, 1994, 1995 Charles M. Hannum.
@@ -78,6 +78,9 @@
 /* XXX misuse a flag to identify format operation */
 #define B_FORMAT B_XXX
 
+/* These machines are fast enough that doing this in assembly is silly. */
+#define        FDC_C_HANDLER
+
 #define FD_DEBUG
 #ifdef FD_DEBUG
 int    fdc_debug = 0;
@@ -257,24 +260,7 @@
 void   fd_mountroot_hook __P((struct device *));
 static void fdconf __P((struct fdc_softc *));
 
-#if PIL_FDSOFT == 4
-#define IE_FDSOFT      IE_L4
-#else
-#error 4
-#endif
-
-#ifdef FDC_C_HANDLER
-#if defined(SUN4M)
-#define FD_SET_SWINTR do {             \
-       if (CPU_ISSUN4M)                \
-               raise(0, PIL_FDSOFT);   \
-       else                            \
-               ienab_bis(IE_L4);       \
-} while(0)
-#else
-#define AUDIO_SET_SWINTR ienab_bis(IE_FDSOFT)
-#endif /* defined(SUN4M) */
-#endif /* FDC_C_HANDLER */
+#define        FD_SET_SWINTR   send_softint(-1, PIL_FDSOFT, fdc->sc_sih)
 
 #define OBP_FDNAME     (CPU_ISSUN4M ? "SUNW,fdtwo" : "fd")
 
@@ -1075,7 +1061,7 @@
                if ((msr & NE7_NDM) == 0) {
                        fdcresult(fdc);
                        fdc->sc_istate = ISTATE_IDLE;
-                       ienab_bis(IE_FDSOFT);
+                       FD_SET_SWINTR;
                        printf("fdc: overrun: tc = %d\n", fdc->sc_tc);
                        break;
                }
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/dev/zs.c
--- a/sys/arch/sparc64/dev/zs.c Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/dev/zs.c Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: zs.c,v 1.14 2000/03/06 21:36:12 thorpej Exp $  */
+/*     $NetBSD: zs.c,v 1.15 2000/03/16 02:36:57 eeh Exp $      */
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -96,19 +96,6 @@
  */
 #define PCLK   (9600 * 512)    /* PCLK pin input clock rate */
 
-/*
- * Select software interrupt bit based on TTY ipl.
- */
-#if PIL_TTY == 1
-# define IE_ZSSOFT IE_L1
-#elif PIL_TTY == 4
-# define IE_ZSSOFT IE_L4
-#elif PIL_TTY == 6
-# define IE_ZSSOFT IE_L6
-#else
-# error "no suitable software interrupt bit"
-#endif
-
 #define        ZS_DELAY()
 
 /* The layout of this is hardware-dependent (padding, order). */
@@ -590,13 +577,8 @@
 
        /* We are at splzs here, so no need to lock. */
        if (softreq && (zssoftpending == 0)) {
-               zssoftpending = IE_ZSSOFT;
-#if defined(SUN4M)
-               if (CPU_ISSUN4M)
-                       raise(0, PIL_TTY);
-               else
-#endif
-                       ienab_bis(IE_ZSSOFT);
+               zssoftpending = PIL_TTY;
+               send_softint(-1, PIL_TTY, &levelsoft);
        }
        return (rval);
 }
@@ -614,14 +596,6 @@
        /* This is not the only ISR on this IPL. */
        if (zssoftpending == 0)
                return (0);
-
-       /*
-        * The soft intr. bit will be set by zshard only if
-        * the variable zssoftpending is zero.  The order of
-        * these next two statements prevents our clearing
-        * the soft intr bit just after zshard has set it.
-        */
-       /* ienab_bic(IE_ZSSOFT); */
        zssoftpending = 0;
 
        /* Make sure we call the tty layer at spltty. */
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/include/cpu.h
--- a/sys/arch/sparc64/include/cpu.h    Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/include/cpu.h    Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.h,v 1.15 1999/12/30 16:26:18 eeh Exp $ */
+/*     $NetBSD: cpu.h,v 1.16 2000/03/16 02:36:58 eeh Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -107,9 +107,17 @@
 #define SIR_NET                0
 #define SIR_CLOCK      1
 
-#define setsoftint()   ienab_bis(IE_L1)
-#define setsoftnet()   (sir.sir_which[SIR_NET] = 1, setsoftint())
-#define setsoftclock() (sir.sir_which[SIR_CLOCK] = 1, setsoftint())
+extern struct intrhand soft01intr, soft01net, soft01clock;
+
+#if 0
+#define setsoftint()   send_softint(-1, IPL_SOFTINT, &soft01intr)
+#define setsoftnet()   send_softint(-1, IPL_SOFTNET, &soft01net)
+#define setsoftclock() send_softint(-1, IPL_SOFTCLOCK, &soft01clock)
+#else
+void setsoftint __P((void));
+void setsoftnet __P((void));
+void setsoftclock __P((void));
+#endif
 
 int    want_ast;
 
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/include/db_machdep.h
--- a/sys/arch/sparc64/include/db_machdep.h     Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/include/db_machdep.h     Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: db_machdep.h,v 1.9 2000/01/10 03:53:20 eeh Exp $ */
+/*     $NetBSD: db_machdep.h,v 1.10 2000/03/16 02:36:58 eeh Exp $ */
 
 /*
  * Mach Operating System
@@ -45,18 +45,20 @@
 typedef        vaddr_t         db_addr_t;      /* address - unsigned */
 typedef        long            db_expr_t;      /* expression - signed */
 
-#if 1
-typedef struct {
-       struct trapframe64 ddb_tf;
-       struct frame64   ddb_fr;
-} db_regs_t;
-#else
-struct trapregs {
-       int64_t tt;
+struct trapstate {
        int64_t tstate;
        int64_t tpc;
        int64_t tnpc;
+       int64_t tt;
 };
+#if 1
+typedef struct {
+       struct trapframe64      ddb_tf;
+       struct frame64          ddb_fr;
+       struct trapstate        ddb_ts[5];
+       int                     ddb_tl;
+} db_regs_t;
+#else
 typedef struct db_regs {
        struct trapregs dbr_traps[4];
        int             dbr_y;
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/include/intr.h
--- a/sys/arch/sparc64/include/intr.h   Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/include/intr.h   Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: intr.h,v 1.1 1999/05/30 02:37:10 mrg Exp $ */
+/*     $NetBSD: intr.h,v 1.2 2000/03/16 02:36:58 eeh Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -38,6 +38,7 @@
 
 /* XXX - arbitrary numbers; no interpretation is defined yet */
 #define IPL_NONE       0       /* nothing */
+#define IPL_SOFTINT    1       /* softint */
 #define IPL_SOFTCLOCK  1       /* timeouts */
 #define IPL_SOFTNET    1       /* protocol stack */
 #define IPL_BIO                2       /* block I/O */
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/sparc64/autoconf.c
--- a/sys/arch/sparc64/sparc64/autoconf.c       Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/sparc64/autoconf.c       Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: autoconf.c,v 1.26 2000/01/16 03:10:58 eeh Exp $ */
+/*     $NetBSD: autoconf.c,v 1.27 2000/03/16 02:37:00 eeh Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -240,7 +240,7 @@
         * Eventually we should drop all of this in favor of traversing
         * process address spaces during MMU faults.
         */
-       pmap_bootstrap(KERNBASE, (u_int)&end, nctx);
+       pmap_bootstrap(KERNBASE, (u_long)&end, nctx);
 }
 
 /*
@@ -342,6 +342,15 @@
                case 's':
                        boothowto |= RB_SINGLE;
                        break;
+
+               case 't':
+               {
+                       /* turn on traptrace w/o breaking into kdb */
+                       extern int trap_trace_dis;
+
+                       trap_trace_dis = 0;
+                       break;
+               }
                }
        }
 }
diff -r 619f6387e91b -r d77c1b475d37 sys/arch/sparc64/sparc64/db_interface.c
--- a/sys/arch/sparc64/sparc64/db_interface.c   Thu Mar 16 01:45:51 2000 +0000
+++ b/sys/arch/sparc64/sparc64/db_interface.c   Thu Mar 16 02:36:56 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: db_interface.c,v 1.27 2000/01/21 23:29:09 thorpej Exp $ */
+/*     $NetBSD: db_interface.c,v 1.28 2000/03/16 02:36:58 eeh Exp $ */
 
 /*
  * Mach Operating System
@@ -60,6 +60,17 @@
 
 extern void OF_enter __P((void));
 
+extern struct traptrace {
+       unsigned short tl:3,    /* Trap level */
+               ns:4,           /* PCB nsaved */
+               tt:9;           /* Trap type */
+       unsigned short pid;     /* PID */
+       u_int tstate;           /* tstate */
+       u_int tsp;              /* sp */
+       u_int tpc;              /* pc */
+       u_int tfault;           /* MMU tag access */
+} trap_trace[], trap_trace_end[];
+
 static int nil;
 
 struct db_variable db_regs[] = {
@@ -116,6 +127,7 @@
 void db_dump_window __P((db_expr_t, int, db_expr_t, char *));
 void db_dump_stack __P((db_expr_t, int, db_expr_t, char *));
 void db_dump_trap __P((db_expr_t, int, db_expr_t, char *));
+void db_dump_ts __P((db_expr_t, int, db_expr_t, char *));
 void db_dump_pcb __P((db_expr_t, int, db_expr_t, char *));
 void db_dump_pv __P((db_expr_t, int, db_expr_t, char *));
 void db_setpcb __P((db_expr_t, int, db_expr_t, char *));
@@ -131,6 +143,8 @@
 void db_watch __P((db_expr_t, int, db_expr_t, char *));
 
 static void db_dump_pmap __P((struct pmap*));
+static void db_print_trace_entry __P((struct traptrace *, int));
+
 
 /*
  * Received keyboard interrupt sequence.
@@ -145,9 +159,6 @@
        }
 }
 
-/* Flip this to turn on traptrace */
-int traptrace_enabled = 0;
-
 /*
  *  kdb_trap - field a TRACE or BPT trap
  */
@@ -156,18 +167,13 @@
        int     type;
        register struct trapframe64 *tf;
 {
-       int i, s, tl;
-       struct trapstate {
-               int64_t tstate;
-               int64_t tpc;
-               int64_t tnpc;
-               int64_t tt;
-       } ts[5];
-       extern int savetstate(struct trapstate ts[]);
-       extern void restoretstate(int tl, struct trapstate ts[]);



Home | Main Index | Thread Index | Old Index