db_interface.c revision 1.9 1 /* $NetBSD: db_interface.c,v 1.9 2001/02/04 17:38:11 briggs Exp $ */
2 /* $OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $ */
3
4 #include "opt_ddb.h"
5
6 #include <sys/param.h>
7 #include <sys/proc.h>
8 #include <sys/systm.h>
9
10 #include <machine/db_machdep.h>
11 #include <machine/frame.h>
12
13 #include <ddb/db_sym.h>
14 #include <ddb/db_command.h>
15 #include <ddb/db_extern.h>
16 #include <ddb/db_access.h>
17 #include <ddb/db_output.h>
18 #include <ddb/ddbvar.h>
19
20 extern label_t *db_recover;
21
22 void ddb_trap __P((void)); /* Call into trap_subr.S */
23 int ddb_trap_glue __P((struct trapframe *)); /* Called from trap_subr.S */
24
25 void
26 cpu_Debugger()
27 {
28 ddb_trap();
29 }
30
31 int
32 ddb_trap_glue(frame)
33 struct trapframe *frame;
34 {
35 if (!(frame->srr1 & PSL_PR)
36 && (frame->exc == EXC_TRC
37 || (frame->exc == EXC_PGM
38 && (frame->srr1 & 0x20000))
39 || frame->exc == EXC_BPT)) {
40
41 bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
42 DDB_REGS->iar = frame->srr0;
43 DDB_REGS->msr = frame->srr1;
44
45 db_trap(T_BREAKPOINT, 0);
46
47 bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
48
49 return 1;
50 }
51 return 0;
52 }
53
54 int
55 kdb_trap(type, v)
56 int type;
57 void *v;
58 {
59 struct trapframe *frame = v;
60
61 switch (type) {
62 case T_BREAKPOINT:
63 case -1:
64 break;
65 default:
66 if (!db_onpanic && db_recover == 0)
67 return 0;
68 if (db_recover != 0) {
69 db_error("Faulted in DDB; continuing...\n");
70 /*NOTREACHED*/
71 }
72 }
73
74 /* XXX Should switch to kdb's own stack here. */
75
76 bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
77 DDB_REGS->iar = frame->srr0;
78 DDB_REGS->msr = frame->srr1;
79
80 db_trap(T_BREAKPOINT, 0);
81
82 bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
83 frame->srr0 = DDB_REGS->iar;
84 frame->srr1 = DDB_REGS->msr;
85
86 return 1;
87 }
88