db_interface.c revision 1.5.2.2 1 1.5.2.2 bouyer /* $NetBSD: db_interface.c,v 1.5.2.2 2000/12/08 09:30:17 bouyer 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.1 sakamoto
10 1.1 sakamoto #include <machine/db_machdep.h>
11 1.5.2.1 bouyer #include <machine/frame.h>
12 1.5.2.1 bouyer
13 1.5.2.1 bouyer #include <ddb/db_sym.h>
14 1.5.2.1 bouyer #include <ddb/db_command.h>
15 1.5.2.1 bouyer #include <ddb/db_extern.h>
16 1.5.2.1 bouyer #include <ddb/db_access.h>
17 1.5.2.1 bouyer #include <ddb/db_output.h>
18 1.5.2.1 bouyer #include <ddb/ddbvar.h>
19 1.1 sakamoto
20 1.5.2.2 bouyer extern label_t *db_recover;
21 1.5.2.2 bouyer
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.5.2.2 bouyer }
52 1.5.2.2 bouyer
53 1.5.2.2 bouyer int
54 1.5.2.2 bouyer kdb_trap(type, v)
55 1.5.2.2 bouyer int type;
56 1.5.2.2 bouyer void *v;
57 1.5.2.2 bouyer {
58 1.5.2.2 bouyer struct trapframe *frame = v;
59 1.5.2.2 bouyer
60 1.5.2.2 bouyer switch (type) {
61 1.5.2.2 bouyer case T_BREAKPOINT:
62 1.5.2.2 bouyer case -1:
63 1.5.2.2 bouyer break;
64 1.5.2.2 bouyer default:
65 1.5.2.2 bouyer if (!db_onpanic && db_recover == 0)
66 1.5.2.2 bouyer return 0;
67 1.5.2.2 bouyer if (db_recover != 0) {
68 1.5.2.2 bouyer db_error("Faulted in DDB; continuing...\n");
69 1.5.2.2 bouyer /*NOTREACHED*/
70 1.5.2.2 bouyer }
71 1.5.2.2 bouyer }
72 1.5.2.2 bouyer
73 1.5.2.2 bouyer /* XXX Should switch to kdb's own stack here. */
74 1.5.2.2 bouyer
75 1.5.2.2 bouyer bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
76 1.5.2.2 bouyer DDB_REGS->iar = frame->srr0;
77 1.5.2.2 bouyer DDB_REGS->msr = frame->srr1;
78 1.5.2.2 bouyer
79 1.5.2.2 bouyer db_trap(T_BREAKPOINT, 0);
80 1.5.2.2 bouyer
81 1.5.2.2 bouyer bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
82 1.5.2.2 bouyer frame->srr0 = DDB_REGS->iar;
83 1.5.2.2 bouyer frame->srr1 = DDB_REGS->msr;
84 1.5.2.2 bouyer
85 1.5.2.2 bouyer return 1;
86 1.1 sakamoto }
87