aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorJustin T. Gibbs <gibbs@FreeBSD.org>2011-06-14 21:37:25 +0000
committerJustin T. Gibbs <gibbs@FreeBSD.org>2011-06-14 21:37:25 +0000
commit583bef38632dcc668ff4a7a9a5af10781399e347 (patch)
tree46e00a6562f919ac1955d58d67efefb78351cb40 /sys/kern
parent144b716627d51e0e4551b6366661036a111ae5c0 (diff)
downloadsrc-583bef38632dcc668ff4a7a9a5af10781399e347.tar.gz
src-583bef38632dcc668ff4a7a9a5af10781399e347.zip
sys/kern/subr_kdb.c:
Modify the "alternate break sequence" detecting state machine so that only a contiguous invocation of the break sequence is accepted. The old implementation did not reset the state machine when detecting an unexpected character. While here, use an enum for the states of the machine instead of magic numbers.bmitted by: Sponsored by: Spectra Logic Corporation
Notes
Notes: svn path=/head/; revision=223099
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/subr_kdb.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c
index 1d67864b1533..c2f6e99531d0 100644
--- a/sys/kern/subr_kdb.c
+++ b/sys/kern/subr_kdb.c
@@ -244,29 +244,44 @@ kdb_reboot(void)
#define KEY_CRTLP 16 /* ^P */
#define KEY_CRTLR 18 /* ^R */
+/* States of th KDB "alternate break sequence" detecting state machine. */
+enum {
+ KDB_ALT_BREAK_SEEN_NONE,
+ KDB_ALT_BREAK_SEEN_CR,
+ KDB_ALT_BREAK_SEEN_CR_TILDE,
+};
+
int
kdb_alt_break(int key, int *state)
{
int brk;
+ /* All states transition to KDB_ALT_BREAK_SEEN_CR on a CR. */
+ if (key == KEY_CR) {
+ *state = KDB_ALT_BREAK_SEEN_CR;
+ return (0);
+ }
+
brk = 0;
switch (*state) {
- case 0:
- if (key == KEY_CR)
- *state = 1;
- break;
- case 1:
+ case KDB_ALT_BREAK_SEEN_CR:
+ *state = KDB_ALT_BREAK_SEEN_NONE;
if (key == KEY_TILDE)
- *state = 2;
+ *state = KDB_ALT_BREAK_SEEN_CR_TILDE;
break;
- case 2:
+ case KDB_ALT_BREAK_SEEN_CR_TILDE:
+ *state = KDB_ALT_BREAK_SEEN_NONE;
if (key == KEY_CRTLB)
brk = KDB_REQ_DEBUGGER;
else if (key == KEY_CRTLP)
brk = KDB_REQ_PANIC;
else if (key == KEY_CRTLR)
brk = KDB_REQ_REBOOT;
- *state = 0;
+ break;
+ case KDB_ALT_BREAK_SEEN_NONE:
+ default:
+ *state = KDB_ALT_BREAK_SEEN_NONE;
+ break;
}
return (brk);
}