|
|
1.1 root 1: /*
2: * db/db4.c
3: * A debugger.
4: * Breakpoints.
5: */
6:
7: #include "db.h"
8:
9: /*
10: * Delete a breakpoint.
11: * If 'r' is set, it is a return breakpoint.
12: * If 's' is set, it is a :sc breakpoint.
13: */
14: int
15: bpt_del(t, addr) int t; ADDR_T addr;
16: {
17: register int f;
18: register BPT *bp;
19:
20: switch (t) {
21: case 'b': f = BBPT; break;
22: case 'r': f = BRET; break;
23: case 's': f = BSIN; break;
24: }
25:
26: for (bp = &bpt[0]; bp < &bpt[NBPT]; bp++) {
27: if ((bp->b_flag & f) == 0 || bp->b_badd != addr)
28: continue;
29: bp->b_flag &= ~f;
30: return 1;
31: }
32: return 0;
33: }
34:
35: /*
36: * Initialize the breakpoint table.
37: */
38: void
39: bpt_init()
40: {
41: register BPT *bp;
42:
43: for (bp = &bpt[0]; bp < &bpt[NBPT]; bp++) {
44: bp->b_flag = 0;
45: bp->b_bcom = bp->b_rcom = NULL;
46: }
47: }
48:
49: /*
50: * Display breakpoints.
51: */
52: void
53: bpt_display()
54: {
55: register BPT *bp;
56:
57: for (bp = &bpt[0]; bp < &bpt[NBPT]; bp++) {
58: if (testint())
59: return;
60: if ((bp->b_flag&BBPT) != 0)
61: bpt_print(' ', bp->b_badd, bp->b_bcom);
62: if (testint())
63: return;
64: if ((bp->b_flag&BRET) != 0)
65: bpt_print('r', bp->b_badd, bp->b_rcom);
66: if (testint())
67: return;
68: if ((bp->b_flag&BSIN) != 0)
69: bpt_print('s', bp->b_badd, "");
70: }
71: }
72:
73: /*
74: * Print a breakpoint address, type and command.
75: */
76: void
77: bpt_print(t, addr, cmd) int t; ADDR_T addr; register char *cmd;
78: {
79: register int c;
80:
81: printx(addr_fmt, addr);
82: printx("%c (", t);
83: putaddr(ISEG, addr);
84: printx(") ");
85: while ((c = *cmd++) != '\0') {
86: if (c == '\n') {
87: printx("\\n");
88: continue;
89: }
90: if (c == '\\') {
91: printx("\\\\");
92: continue;
93: }
94: putx(c);
95: }
96: putx('\n');
97: }
98:
99: /*
100: * Set a breakpoint.
101: */
102: int
103: bpt_set(f, addr, fp, cmd) int f; ADDR_T addr, fp; char *cmd;
104: {
105: register BPT *bp;
106: int bits;
107:
108: dbprintf(("bpt_set(%d, 0x%lX, 0x%lX, %s)\n", f, addr, fp, cmd));
109:
110: /* Make sure "addr" is a valid text address. */
111: add = addr;
112: if (getb(ISEG, (char *)&bits, sizeof(bits)) == 0)
113: return 0;
114:
115: /* Look for existing breakpoint at same address. */
116: for (bp = &bpt[0]; bp < &bpt[NBPT]; bp++)
117: if (bp->b_flag && bp->b_badd == addr)
118: goto out;
119:
120: /* Look for unused breakpoint. */
121: for (bp = &bpt[0]; bp < &bpt[NBPT]; bp++)
122: if (bp->b_flag == 0)
123: goto out;
124: return 0;
125:
126: out:
127: dbprintf(("setting bpt[%d]\n", bp - bpt));
128: if (f != BBPT && (bp->b_flag&f) != 0)
129: return 0; /* already set, ignore */
130: bp->b_flag |= f;
131: bp->b_badd = addr;
132: bp->b_bins[0] = bits & 0xFF; /* store original contents */
133: switch (f) {
134: case BBPT:
135: bp->b_bcom = save_cmd(bp->b_bcom, cmd);
136: break;
137: case BRET:
138: bp->b_rfpt = fp;
139: bp->b_rcom = save_cmd(bp->b_rcom, cmd);
140: break;
141: case BSIN:
142: bp->b_sfpt = fp;
143: break;
144: }
145: return 1;
146: }
147:
148: /* end of db/db4.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.