summaryrefslogtreecommitdiff
path: root/ddb/db_trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'ddb/db_trap.c')
-rw-r--r--ddb/db_trap.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/ddb/db_trap.c b/ddb/db_trap.c
index 395a9b51..7e107319 100644
--- a/ddb/db_trap.c
+++ b/ddb/db_trap.c
@@ -35,6 +35,7 @@
*/
#include <mach/boolean.h>
#include <machine/db_machdep.h>
+#include <machine/setjmp.h>
#include <ddb/db_command.h>
#include <ddb/db_access.h>
#include <ddb/db_break.h>
@@ -42,28 +43,26 @@
#include <ddb/db_output.h>
#include <ddb/db_task_thread.h>
#include <ddb/db_trap.h>
+#include <ddb/db_run.h>
+#include <machine/db_interface.h>
extern jmp_buf_t *db_recover;
-extern void db_restart_at_pc();
-extern boolean_t db_stop_at_pc();
-
extern int db_inst_count;
extern int db_load_count;
extern int db_store_count;
void
-db_task_trap(type, code, user_space)
- int type, code;
- boolean_t user_space;
+db_task_trap(
+ int type,
+ int code,
+ boolean_t user_space)
{
jmp_buf_t db_jmpbuf;
jmp_buf_t *prev;
boolean_t bkpt;
boolean_t watchpt;
- void db_init_default_thread();
- void db_check_breakpoint_valid();
task_t task_space;
task_space = db_target_space(current_thread(), user_space);
@@ -90,6 +89,9 @@ db_task_trap(type, code, user_space)
db_print_loc_and_inst(db_dot, task_space);
else
db_printf("Trouble printing location %#X.\n", db_dot);
+
+ if (!bkpt && !watchpt && _setjmp(db_recover = &db_jmpbuf) == 0)
+ db_stack_trace_cmd(0, 0, -1, "");
db_recover = prev;
db_command_loop();
@@ -99,8 +101,9 @@ db_task_trap(type, code, user_space)
}
void
-db_trap(type, code)
- int type, code;
+db_trap(
+ int type,
+ int code)
{
db_task_trap(type, code, !DB_VALID_KERN_ADDR(PC_REGS(DDB_REGS)));
}