summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2003-10-18 02:13:39 +0000
committerrwatson <rwatson@FreeBSD.org>2003-10-18 02:13:39 +0000
commitbf32888a2a941a3b6462ab328ab155738985c61f (patch)
treeaa1cacbc6f61924122f241c976bd9a367800934d
parent68dcd813b1ef06ea01356629c68e765c79b7e227 (diff)
downloadFreeBSD-src-bf32888a2a941a3b6462ab328ab155738985c61f.zip
FreeBSD-src-bf32888a2a941a3b6462ab328ab155738985c61f.tar.gz
Add a new cn_flags fields to struct consdev, the low-level console
definition structure. Define one flag, CN_FLAG_NODEBUG, which indicates the console driver cannot be used in the context of the debugger. This may be used, for example, if the console device interacts with kernel services that cannot be used from the debugger context, such as the network stack. These drivers are skipped over for calls to cn_checkc() and cn_putc(), and the calling function simply moves on to the next available console.
-rw-r--r--sys/kern/tty_cons.c16
-rw-r--r--sys/sys/cons.h4
2 files changed, 14 insertions, 6 deletions
diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c
index a8221a4..d94747e 100644
--- a/sys/kern/tty_cons.c
+++ b/sys/kern/tty_cons.c
@@ -538,9 +538,11 @@ cncheckc(void)
return (-1);
STAILQ_FOREACH(cnd, &cn_devlist, cnd_next) {
cn = cnd->cnd_cn;
- c = cn->cn_checkc(cn);
- if (c != -1) {
- return (c);
+ if (!db_active || (cn->cn_flags & CN_FLAG_NODEBUG)) {
+ c = cn->cn_checkc(cn);
+ if (c != -1) {
+ return (c);
+ }
}
}
return (-1);
@@ -557,9 +559,11 @@ cnputc(int c)
return;
STAILQ_FOREACH(cnd, &cn_devlist, cnd_next) {
cn = cnd->cnd_cn;
- if (c == '\n')
- cn->cn_putc(cn, '\r');
- cn->cn_putc(cn, c);
+ if (!db_active || (cn->cn_flags & CN_FLAG_NODEBUG)) {
+ if (c == '\n')
+ cn->cn_putc(cn, '\r');
+ cn->cn_putc(cn, c);
+ }
}
#ifdef DDB
if (console_pausing && !db_active && (c == '\n')) {
diff --git a/sys/sys/cons.h b/sys/sys/cons.h
index e8994bf..d7face7 100644
--- a/sys/sys/cons.h
+++ b/sys/sys/cons.h
@@ -70,6 +70,7 @@ struct consdev {
short cn_pri; /* pecking order; the higher the better */
void *cn_arg; /* drivers method argument */
int cn_unit; /* some drivers prefer this */
+ int cn_flags; /* capabilities of this console */
char cn_name[SPECNAMELEN + 1]; /* console (device) name */
};
@@ -80,6 +81,9 @@ struct consdev {
#define CN_INTERNAL 3 /* "internal" bit-mapped display */
#define CN_REMOTE 4 /* serial interface with remote bit set */
+/* Values for cn_flags. */
+#define CN_FLAG_NODEBUG 0x00000001 /* Not supported with debugger. */
+
#ifdef _KERNEL
extern int cons_unavail;
OpenPOWER on IntegriCloud