Add a new mechanism, cndbctl(), to tell the console driver that

ddb is entered.  Don't refer to `in_Debugger' to see if we
are in the debugger.  (The variable used to be static in Debugger()
and wasn't updated if ddb is entered via traps and panic anyway.)

- Don't refer to `in_Debugger'.
- Add `db_active' to i386/i386/db_interface.d (as in
  alpha/alpha/db_interface.c).
- Remove cnpollc() stub from ddb/db_input.c.
- Add the dbctl function to syscons, pcvt, and sio. (The function for
  pcvt and sio is noop at the moment.)

Jointly developed by: bde and me

(The final version was tweaked by me and not reviewed by bde.  Thus,
if there is any error in this commit, that is entirely of mine, not
his.)

Some changes were obtained from: NetBSD
This commit is contained in:
yokota 2000-01-11 14:54:01 +00:00
parent ddf2890cdf
commit 715966bf8a
14 changed files with 87 additions and 76 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -361,10 +361,3 @@ db_check_interrupt()
break;
}
}
/* called from kdb_trap in db_interface.c */
void
cnpollc (flag)
int flag;
{
}

View File

@ -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));

View File

@ -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 */

View File

@ -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 @@ scgetc(sc_softc_t *sc, u_int flags)
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");

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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 */

View File

@ -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);

View File

@ -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)
{

View File

@ -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 */