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