diff options
-rw-r--r-- | sys/alpha/alpha/db_interface.c | 11 | ||||
-rw-r--r-- | sys/amd64/amd64/db_interface.c | 16 | ||||
-rw-r--r-- | sys/amd64/amd64/trap.c | 6 | ||||
-rw-r--r-- | sys/ddb/db_input.c | 7 | ||||
-rw-r--r-- | sys/ddb/ddb.h | 3 | ||||
-rw-r--r-- | sys/dev/sio/sio.c | 4 | ||||
-rw-r--r-- | sys/dev/syscons/syscons.c | 55 | ||||
-rw-r--r-- | sys/i386/i386/db_interface.c | 16 | ||||
-rw-r--r-- | sys/i386/i386/trap.c | 6 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_drv.c | 3 | ||||
-rw-r--r-- | sys/isa/sio.c | 4 | ||||
-rw-r--r-- | sys/kern/subr_trap.c | 6 | ||||
-rw-r--r-- | sys/kern/tty_cons.c | 18 | ||||
-rw-r--r-- | sys/sys/cons.h | 8 |
14 files changed, 87 insertions, 76 deletions
diff --git a/sys/alpha/alpha/db_interface.c b/sys/alpha/alpha/db_interface.c index f1189f1..1e015ae 100644 --- a/sys/alpha/alpha/db_interface.c +++ b/sys/alpha/alpha/db_interface.c @@ -1,4 +1,5 @@ /* $NetBSD: db_interface.c,v 1.2 1997/09/16 19:07:19 thorpej Exp $ */ +/* $FreeBSD$ */ /* * Mach Operating System @@ -83,7 +84,7 @@ extern char *trap_type[]; extern int trap_types; #endif -int db_active = 0; +int db_active; void ddbprinttrap __P((unsigned long, unsigned long, unsigned long, unsigned long)); @@ -188,14 +189,14 @@ kdb_trap(a0, a1, a2, entry, regs) s = splhigh(); db_active++; - cnpollc(TRUE); /* Set polling mode, unblank video */ - if (ddb_mode) + if (ddb_mode) { + cndbctl(TRUE); /* DDB active, unblank video */ db_trap(entry, a0); /* Where the work happens */ - else + cndbctl(FALSE); /* DDB inactive */ + } else gdb_handle_exception(&ddb_regs, entry, a0); - cnpollc(FALSE); /* Resume interrupt mode */ db_active--; splx(s); diff --git a/sys/amd64/amd64/db_interface.c b/sys/amd64/amd64/db_interface.c index 2369154..839d9b7 100644 --- a/sys/amd64/amd64/db_interface.c +++ b/sys/amd64/amd64/db_interface.c @@ -52,6 +52,7 @@ extern jmp_buf db_jmpbuf; extern void gdb_handle_exception __P((db_regs_t *, int, int)); +int db_active; db_regs_t ddb_regs; static jmp_buf db_global_jmpbuf; @@ -132,8 +133,6 @@ kdb_trap(type, code, regs) ddb_regs.tf_ss = rss(); } - cnpollc(TRUE); - #ifdef SMP #ifdef CPUSTOP_ON_DDBBREAK @@ -153,10 +152,14 @@ kdb_trap(type, code, regs) (void) setjmp(db_global_jmpbuf); db_global_jmpbuf_valid = TRUE; - if (ddb_mode) + db_active++; + if (ddb_mode) { + cndbctl(TRUE); db_trap(type, code); - else + cndbctl(FALSE); + } else gdb_handle_exception(&ddb_regs, type, code); + db_active--; db_global_jmpbuf_valid = FALSE; #ifdef SMP @@ -181,8 +184,6 @@ kdb_trap(type, code, regs) #endif /* CPUSTOP_ON_DDBBREAK */ #endif /* SMP */ - cnpollc(FALSE); - regs->tf_eip = ddb_regs.tf_eip; regs->tf_eflags = ddb_regs.tf_eflags; regs->tf_eax = ddb_regs.tf_eax; @@ -296,12 +297,11 @@ db_write_bytes(addr, size, data) * Move this to machdep.c and allow it to be called if any debugger is * installed. */ -volatile int in_Debugger = 0; - void Debugger(msg) const char *msg; { + static volatile u_char in_Debugger; /* * XXX diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index e1bfac4..4199346 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -90,9 +90,7 @@ #include <machine/vm86.h> -#ifdef DDB - extern int in_Debugger, debugger_on_panic; -#endif +#include <ddb/ddb.h> #include "isa.h" #include "npx.h" @@ -900,7 +898,7 @@ trap_fatal(frame, eva) return; #endif #ifdef DDB - if ((debugger_on_panic || in_Debugger) && kdb_trap(type, 0, frame)) + if ((debugger_on_panic || db_active) && kdb_trap(type, 0, frame)) return; #endif printf("trap number = %d\n", type); diff --git a/sys/ddb/db_input.c b/sys/ddb/db_input.c index d97de6b..a09f003 100644 --- a/sys/ddb/db_input.c +++ b/sys/ddb/db_input.c @@ -361,10 +361,3 @@ db_check_interrupt() break; } } - -/* called from kdb_trap in db_interface.c */ -void -cnpollc (flag) - int flag; -{ -} diff --git a/sys/ddb/ddb.h b/sys/ddb/ddb.h index 46fb2b5..972772f 100644 --- a/sys/ddb/ddb.h +++ b/sys/ddb/ddb.h @@ -67,9 +67,11 @@ func_name(addr, have_addr, count, modif) \ extern char *esym; extern db_expr_t db_maxoff; +extern int db_active; extern int db_indent; extern int db_inst_count; extern int db_load_count; +extern int debugger_on_panic; extern int db_store_count; extern db_expr_t db_radix; extern db_expr_t db_max_width; @@ -77,7 +79,6 @@ extern db_expr_t db_tab_stop_width; struct vm_map; -void cnpollc __P((int)); void db_check_interrupt __P((void)); void db_clear_watchpoints __P((void)); db_addr_t db_disasm __P((db_addr_t loc, boolean_t altfmt)); diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index 81dd1d7..476c967 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -2682,8 +2682,8 @@ static cn_getc_t siocngetc; static cn_putc_t siocnputc; #ifdef __i386__ -CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc); - +CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, + siocnputc, NULL); #endif /* To get the GDB related variables */ diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 822d42b..64ecd73 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -124,15 +124,7 @@ SYSCTL_INT(_machdep, OID_AUTO, enable_panic_key, CTLFLAG_RW, &enable_panic_key, #define VIRTUAL_TTY(sc, x) (SC_DEV((sc), (x))->si_tty) -#define debugger FALSE - -#ifdef __i386__ -#ifdef DDB -extern int in_Debugger; -#undef debugger -#define debugger in_Debugger -#endif /* DDB */ -#endif /* __i386__ */ +static int debugger; /* prototypes */ static int scvidprobe(int unit, int flags, int cons); @@ -199,13 +191,15 @@ static cn_init_t sccninit; static cn_getc_t sccngetc; static cn_checkc_t sccncheckc; static cn_putc_t sccnputc; +static cn_dbctl_t sccndbctl; static cn_term_t sccnterm; #if __alpha__ void sccnattach(void); #endif -CONS_DRIVER(sc, sccnprobe, sccninit, sccnterm, sccngetc, sccncheckc, sccnputc); +CONS_DRIVER(sc, sccnprobe, sccninit, sccnterm, sccngetc, sccncheckc, sccnputc, + sccndbctl); static d_open_t scopen; static d_close_t scclose; @@ -1474,6 +1468,28 @@ sccncheckc(dev_t dev) return sccngetch(SCGETC_NONBLOCK); } +static void +sccndbctl(dev_t dev, int on) +{ + /* try to switch to the kernel console screen */ + if (on && debugger == 0) { + /* + * TRY to make sure the screen saver is stopped, + * and the screen is updated before switching to + * the vty0. + */ + scrn_timer(NULL); + if (!cold + && sc_console->sc->cur_scp->smode.mode == VT_AUTO + && sc_console->smode.mode == VT_AUTO) + switch_scr(sc_console->sc, sc_console->index); + } + if (on) + ++debugger; + else + --debugger; +} + static int sccngetch(int flags) { @@ -1553,7 +1569,7 @@ sccnupdate(scr_stat *scp) if (scp->sc->font_loading_in_progress || scp->sc->videoio_in_progress) return; - if (debugger || panicstr || shutdown_in_progress) { + if (debugger > 0 || panicstr || shutdown_in_progress) { sc_touch_scrn_saver(); } else if (scp != scp->sc->cur_scp) { return; @@ -1626,7 +1642,7 @@ scrn_timer(void *arg) /* should we stop the screen saver? */ getmicrouptime(&tv); - if (debugger || panicstr || shutdown_in_progress) + if (debugger > 0 || panicstr || shutdown_in_progress) sc_touch_scrn_saver(); if (run_scrn_saver) { if (tv.tv_sec > sc->scrn_time_stamp + scrn_blank_time) @@ -3720,21 +3736,6 @@ next_code: case DBG: #ifndef SC_DISABLE_DDBKEY #ifdef DDB - if (debugger) - break; - /* try to switch to the kernel console screen */ - if (sc_console) { - /* - * TRY to make sure the screen saver is stopped, - * and the screen is updated before switching to - * the vty0. - */ - scrn_timer(NULL); - if (!cold - && sc_console->sc->cur_scp->smode.mode == VT_AUTO - && sc_console->smode.mode == VT_AUTO) - switch_scr(sc_console->sc, sc_console->index); - } Debugger("manual escape to debugger"); #else printf("No debugger in kernel\n"); diff --git a/sys/i386/i386/db_interface.c b/sys/i386/i386/db_interface.c index 2369154..839d9b7 100644 --- a/sys/i386/i386/db_interface.c +++ b/sys/i386/i386/db_interface.c @@ -52,6 +52,7 @@ extern jmp_buf db_jmpbuf; extern void gdb_handle_exception __P((db_regs_t *, int, int)); +int db_active; db_regs_t ddb_regs; static jmp_buf db_global_jmpbuf; @@ -132,8 +133,6 @@ kdb_trap(type, code, regs) ddb_regs.tf_ss = rss(); } - cnpollc(TRUE); - #ifdef SMP #ifdef CPUSTOP_ON_DDBBREAK @@ -153,10 +152,14 @@ kdb_trap(type, code, regs) (void) setjmp(db_global_jmpbuf); db_global_jmpbuf_valid = TRUE; - if (ddb_mode) + db_active++; + if (ddb_mode) { + cndbctl(TRUE); db_trap(type, code); - else + cndbctl(FALSE); + } else gdb_handle_exception(&ddb_regs, type, code); + db_active--; db_global_jmpbuf_valid = FALSE; #ifdef SMP @@ -181,8 +184,6 @@ kdb_trap(type, code, regs) #endif /* CPUSTOP_ON_DDBBREAK */ #endif /* SMP */ - cnpollc(FALSE); - regs->tf_eip = ddb_regs.tf_eip; regs->tf_eflags = ddb_regs.tf_eflags; regs->tf_eax = ddb_regs.tf_eax; @@ -296,12 +297,11 @@ db_write_bytes(addr, size, data) * Move this to machdep.c and allow it to be called if any debugger is * installed. */ -volatile int in_Debugger = 0; - void Debugger(msg) const char *msg; { + static volatile u_char in_Debugger; /* * XXX diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index e1bfac4..4199346 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -90,9 +90,7 @@ #include <machine/vm86.h> -#ifdef DDB - extern int in_Debugger, debugger_on_panic; -#endif +#include <ddb/ddb.h> #include "isa.h" #include "npx.h" @@ -900,7 +898,7 @@ trap_fatal(frame, eva) return; #endif #ifdef DDB - if ((debugger_on_panic || in_Debugger) && kdb_trap(type, 0, frame)) + if ((debugger_on_panic || db_active) && kdb_trap(type, 0, frame)) return; #endif printf("trap number = %d\n", type); diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c index 112014e..5c50173 100644 --- a/sys/i386/isa/pcvt/pcvt_drv.c +++ b/sys/i386/isa/pcvt/pcvt_drv.c @@ -92,7 +92,8 @@ static cn_getc_t pccngetc; static cn_checkc_t pccncheckc; static cn_putc_t pccnputc; -CONS_DRIVER(pc, pccnprobe, pccninit, pccnterm, pccngetc, pccncheckc, pccnputc); +CONS_DRIVER(pc, pccnprobe, pccninit, pccnterm, pccngetc, pccncheckc, pccnputc, + NULL); static d_open_t pcopen; static d_close_t pcclose; diff --git a/sys/isa/sio.c b/sys/isa/sio.c index 81dd1d7..476c967 100644 --- a/sys/isa/sio.c +++ b/sys/isa/sio.c @@ -2682,8 +2682,8 @@ static cn_getc_t siocngetc; static cn_putc_t siocnputc; #ifdef __i386__ -CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc); - +CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, + siocnputc, NULL); #endif /* To get the GDB related variables */ diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index e1bfac4..4199346 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -90,9 +90,7 @@ #include <machine/vm86.h> -#ifdef DDB - extern int in_Debugger, debugger_on_panic; -#endif +#include <ddb/ddb.h> #include "isa.h" #include "npx.h" @@ -900,7 +898,7 @@ trap_fatal(frame, eva) return; #endif #ifdef DDB - if ((debugger_on_panic || in_Debugger) && kdb_trap(type, 0, frame)) + if ((debugger_on_panic || db_active) && kdb_trap(type, 0, frame)) return; #endif printf("trap number = %d\n", type); diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index bac3312..32656f8 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -97,7 +97,7 @@ static d_open_t *cn_phys_open; /* physical device open function */ struct consdev *cn_tab; /* physical console device info */ static dev_t condev_t; /* represents the device private info */ -CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL); +CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL, NULL); void cninit() @@ -423,6 +423,22 @@ cnputc(c) } } +void +cndbctl(on) + int on; +{ + static int refcount; + + if (cn_tab == NULL) + return; + if (!on) + refcount--; + if (refcount == 0 && cn_tab->cn_dbctl != NULL) + (*cn_tab->cn_dbctl)(cn_tab->cn_dev, on); + if (on) + refcount++; +} + static void cn_drvinit(void *unused) { diff --git a/sys/sys/cons.h b/sys/sys/cons.h index 7314dbc..48be371 100644 --- a/sys/sys/cons.h +++ b/sys/sys/cons.h @@ -49,6 +49,7 @@ typedef void cn_term_t __P((struct consdev *)); typedef int cn_getc_t __P((dev_t)); typedef int cn_checkc_t __P((dev_t)); typedef void cn_putc_t __P((dev_t, int)); +typedef void cn_dbctl_t __P((dev_t, int)); struct consdev { cn_probe_t *cn_probe; @@ -63,6 +64,8 @@ struct consdev { /* kernel "return char if available" interface */ cn_putc_t *cn_putc; /* kernel putchar interface */ + cn_dbctl_t *cn_dbctl; + /* debugger control interface */ struct tty *cn_tp; /* tty structure for console device */ dev_t cn_dev; /* major/minor of device */ short cn_pri; /* pecking order; the higher the better */ @@ -79,9 +82,9 @@ extern struct linker_set cons_set; extern int cons_unavail; extern struct consdev *cn_tab; -#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc) \ +#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc, dbctl) \ static struct consdev name##_consdev = { \ - probe, init, term, getc, checkc, putc \ + probe, init, term, getc, checkc, putc, dbctl \ }; \ DATA_SET(cons_set, name##_consdev) @@ -90,6 +93,7 @@ int cncheckc __P((void)); int cngetc __P((void)); void cninit __P((void)); void cninit_finish __P((void)); +void cndbctl __P((int)); void cnputc __P((int)); #endif /* _KERNEL */ |