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