summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Burkholder <jake@FreeBSD.org>2002-12-31 06:51:19 +0000
committerJake Burkholder <jake@FreeBSD.org>2002-12-31 06:51:19 +0000
commitedb333eef88e835a5a4bd2e90a63ea988a13dabf (patch)
tree9dcdd6d37e0be79ab1ed2b28087e7987606ab01a
parent4dadad5ee17e46a4feae3335f8a910a2dd6e2716 (diff)
Notes
-rw-r--r--sys/ddb/db_break.c44
-rw-r--r--sys/ddb/db_break.h8
2 files changed, 51 insertions, 1 deletions
diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c
index 9522f3b374da..bc5ac20ab733 100644
--- a/sys/ddb/db_break.c
+++ b/sys/ddb/db_break.c
@@ -33,6 +33,8 @@
/*
* Breakpoints.
*/
+#include "opt_comconsole.h"
+
#include <sys/param.h>
#include <vm/vm.h>
@@ -363,3 +365,45 @@ db_map_addr(addr)
#endif
return kernel_map;
}
+
+#ifdef ALT_BREAK_TO_DEBUGGER
+/*
+ * Solaris implements a new BREAK which is initiated by a character sequence
+ * CR ~ ^b which is similar to a familiar pattern used on Sun servers by the
+ * Remote Console.
+ *
+ * Note that this function may be called from almost anywhere, with interrupts
+ * disabled and with unknown locks held, so it must not access data other than
+ * its arguments. Its up to the caller to ensure that the state variable is
+ * consistent.
+ */
+
+#define KEY_CR 13 /* CR '\r' */
+#define KEY_TILDE 126 /* ~ */
+#define KEY_CRTLB 2 /* ^B */
+
+int
+db_alt_break(int data, int *state)
+{
+ int brk = 0;
+
+ switch (data) {
+ case KEY_CR:
+ *state = KEY_TILDE;
+ break;
+ case KEY_TILDE:
+ if (*state == KEY_TILDE)
+ *state = KEY_CRTLB;
+ else
+ *state = 0;
+ break;
+ case KEY_CRTLB:
+ if (*state == KEY_CRTLB)
+ brk = 1;
+ default:
+ *state = 0;
+ break;
+ }
+ return (brk);
+}
+#endif
diff --git a/sys/ddb/db_break.h b/sys/ddb/db_break.h
index d6ed76e6a821..ef43f689072b 100644
--- a/sys/ddb/db_break.h
+++ b/sys/ddb/db_break.h
@@ -41,8 +41,10 @@
#define BKPT_INST_TYPE int
#endif
+struct vm_map;
+
struct db_breakpoint {
- vm_map_t map; /* in this map */
+ struct vm_map *map; /* in this map */
db_addr_t address; /* set here */
int init_count; /* number of times to skip bkpt */
int count; /* current count */
@@ -64,4 +66,8 @@ void db_set_breakpoints(void);
db_breakpoint_t db_set_temp_breakpoint(db_addr_t);
#endif
+#ifdef ALT_BREAK_TO_DEBUGGER
+int db_alt_break(int, int *);
+#endif
+
#endif /* !_DDB_DB_BREAK_H_ */