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