|
|
1.1 root 1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)kdb_runpcs.c 7.3 (Berkeley) 12/15/86
7: */
8:
9: #include "../kdb/defs.h"
10:
11: char *lp;
12:
13: /* breakpoints */
14: BKPTR bkpthead;
15:
16: char lastc;
17:
18: long dot;
19: int adrflg;
20: long loopcnt;
21: ADDR userpc = 1;
22:
23: runpcs(runmode, execsig)
24: {
25: register BKPTR bkpt;
26:
27: if (adrflg)
28: userpc = dot;
29: if (execsig == 0)
30: printf("kdb: running\n");
31: if (runmode==SINGLE) {
32: /*
33: * To single step, delete the
34: * breakpoints and invoke the
35: * hardware single step in the
36: * main loop.
37: */
38: delbp();
39: reset(SINGLE);
40: }
41: /*
42: * If we're currently at a breakpoint,
43: * restore the instruction and single
44: * step before continuing. Otherwise,
45: * we can just set our breakpoints and
46: * continue.
47: */
48: if (bkpt = scanbkpt(userpc)) {
49: execbkpt(bkpt);
50: /*NOTREACHED*/
51: }
52: setbp();
53: reset(CONTIN);
54: }
55:
56: static int execbkptf;
57:
58: /*
59: * Continue execution after a trap.
60: *
61: * If tracetrap is nonzero, we've entered here because of a
62: * trace trap. If we're skipping a breakpoint (execbkptf),
63: * or this is the next iteration of a breakpoint, continue.
64: * If this is the next iteration of a single step, do the
65: * next step. Otherwise return 1 if we stopped because
66: * of a breakpoint,
67: */
68: nextpcs(tracetrap)
69: int tracetrap;
70: {
71: register BKPTR bkpt;
72: short rc;
73:
74: clrsstep(); /* clear hardware single step */
75: delbp();
76: if (execbkptf) {
77: execbkptf = 0;
78: runpcs(CONTIN, 1);
79: /*NOTREACHED*/
80: }
81: if (!tracetrap && (bkpt = scanbkpt(userpc))) {
82: /*
83: * Stopped at a breakpoint,
84: * execute any command.
85: */
86: dot = bkpt->loc;
87: if (bkpt->flag == BKPTEXEC ||
88: ((bkpt->flag = BKPTEXEC) && bkpt->comm[0] != EOR &&
89: command(bkpt->comm, ':') && --bkpt->count)) {
90: loopcnt++;
91: execbkpt(bkpt);
92: } else {
93: bkpt->count = bkpt->initcnt;
94: rc = 1;
95: }
96: } else
97: rc = 0;
98: if (--loopcnt > 0)
99: runpcs(rc ? CONTIN : SINGLE, 1);
100: return (rc);
101: }
102:
103: #define BPOUT 0
104: #define BPIN 1
105: static int bpstate = BPOUT;
106:
107: execbkpt(bkptr)
108: BKPTR bkptr;
109: {
110:
111: delbp();
112: bkptr->flag = BKPTSET;
113: execbkptf++;
114: reset(SINGLE);
115: }
116:
117: BKPTR
118: scanbkpt(addr)
119: ADDR addr;
120: {
121: register BKPTR bkptr;
122:
123: for (bkptr = bkpthead; bkptr; bkptr = bkptr->nxtbkpt)
124: if (bkptr->flag && bkptr->loc == addr)
125: break;
126: return (bkptr);
127: }
128:
129: delbp()
130: {
131: register off_t a;
132: register BKPTR bkptr;
133:
134: if (bpstate == BPOUT)
135: return;
136: for (bkptr = bkpthead; bkptr; bkptr = bkptr->nxtbkpt)
137: if (bkptr->flag) {
138: a = bkptr->loc;
139: put((off_t)a, ISP, (long)bkptr->ins);
140: }
141: bpstate = BPOUT;
142: }
143:
144: setbp()
145: {
146: register off_t a;
147: register BKPTR bkptr;
148:
149: if (bpstate == BPIN)
150: return;
151: for (bkptr = bkpthead; bkptr; bkptr = bkptr->nxtbkpt)
152: if (bkptr->flag) {
153: a = bkptr->loc;
154: bkptr->ins = get(a, ISP);
155: put(a, ISP, (long)SETBP(bkptr->ins));
156: }
157: bpstate = BPIN;
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.