db_interface.c revision 1.8 1 /* $NetBSD: db_interface.c,v 1.8 2000/11/24 21:49:06 tsubai 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
23 cpu_Debugger()
24 {
25 ddb_trap();
26 }
27
28 int
29 ddb_trap_glue(frame)
30 struct trapframe *frame;
31 {
32 int msr;
33
34 if (!(frame->srr1 & PSL_PR)
35 && (frame->exc == EXC_TRC
36 || (frame->exc == EXC_PGM
37 && (frame->srr1 & 0x20000))
38 || frame->exc == EXC_BPT)) {
39
40 bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
41 DDB_REGS->iar = frame->srr0;
42 DDB_REGS->msr = frame->srr1;
43
44 db_trap(T_BREAKPOINT, 0);
45
46 bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
47
48 return 1;
49 }
50 return 0;
51 }
52
53 int
54 kdb_trap(type, v)
55 int type;
56 void *v;
57 {
58 struct trapframe *frame = v;
59
60 switch (type) {
61 case T_BREAKPOINT:
62 case -1:
63 break;
64 default:
65 if (!db_onpanic && db_recover == 0)
66 return 0;
67 if (db_recover != 0) {
68 db_error("Faulted in DDB; continuing...\n");
69 /*NOTREACHED*/
70 }
71 }
72
73 /* XXX Should switch to kdb's own stack here. */
74
75 bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
76 DDB_REGS->iar = frame->srr0;
77 DDB_REGS->msr = frame->srr1;
78
79 db_trap(T_BREAKPOINT, 0);
80
81 bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
82 frame->srr0 = DDB_REGS->iar;
83 frame->srr1 = DDB_REGS->msr;
84
85 return 1;
86 }
87