1 /*
2 *
3 * debugger
4 *
5 */
6
7 #include "defs.h"
8 #include "fns.h"
9
10 BKPT *bkpthead;
11
12 BOOL bpin;
13
14 int pid;
15 int nnote;
16 int ending;
17 char note[NNOTE][ERRMAX];
18
19 /* service routines for sub process control */
20
runpcs(int runmode,int keepnote)21 runpcs(int runmode, int keepnote)
22 {
23 int rc;
24 BKPT *bkpt;
25
26 rc = 0;
27 if (adrflg)
28 rput(cormap, mach->pc, dot);
29 dot = rget(cormap, mach->pc);
30 flush();
31 while (loopcnt-- > 0) {
32 if(loopcnt != 0)
33 printpc();
34 if (runmode == SINGLE) {
35 bkpt = scanbkpt(dot);
36 if (bkpt) {
37 switch(bkpt->flag){
38 case BKPTTMP:
39 bkpt->flag = BKPTCLR;
40 break;
41 case BKPTSKIP:
42 bkpt->flag = BKPTSET;
43 break;
44 }
45 }
46 runstep(dot, keepnote);
47 } else {
48 if ((bkpt = scanbkpt(rget(cormap, mach->pc))) != 0) {
49 execbkpt(bkpt, keepnote);
50 keepnote = 0;
51 }
52 setbp();
53 runrun(keepnote);
54 }
55 keepnote = 0;
56 delbp();
57 dot = rget(cormap, mach->pc);
58 /* real note? */
59 if (nnote > 0) {
60 keepnote = 1;
61 rc = 0;
62 continue;
63 }
64 bkpt = scanbkpt(dot);
65 if(bkpt == 0){
66 keepnote = 0;
67 rc = 0;
68 continue;
69 }
70 /* breakpoint */
71 if (bkpt->flag == BKPTTMP)
72 bkpt->flag = BKPTCLR;
73 else if (bkpt->flag == BKPTSKIP) {
74 execbkpt(bkpt, keepnote);
75 keepnote = 0;
76 loopcnt++; /* we didn't really stop */
77 continue;
78 }
79 else {
80 bkpt->flag = BKPTSKIP;
81 --bkpt->count;
82 if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0)
83 && bkpt->count != 0) {
84 execbkpt(bkpt, keepnote);
85 keepnote = 0;
86 loopcnt++;
87 continue;
88 }
89 bkpt->count = bkpt->initcnt;
90 }
91 rc = 1;
92 }
93 return(rc);
94 }
95
96 /*
97 * finish the process off;
98 * kill if still running
99 */
100
101 void
endpcs(void)102 endpcs(void)
103 {
104 BKPT *bk;
105
106 if(ending)
107 return;
108 ending = 1;
109 if (pid) {
110 if(pcsactive){
111 killpcs();
112 pcsactive = 0;
113 }
114 pid=0;
115 nnote=0;
116 for (bk=bkpthead; bk; bk = bk->nxtbkpt)
117 if (bk->flag == BKPTTMP)
118 bk->flag = BKPTCLR;
119 else if (bk->flag != BKPTCLR)
120 bk->flag = BKPTSET;
121 }
122 bpin = FALSE;
123 ending = 0;
124 }
125
126 /*
127 * start up the program to be debugged in a child
128 */
129
130 void
setup(void)131 setup(void)
132 {
133
134 nnote = 0;
135 startpcs();
136 bpin = FALSE;
137 pcsactive = 1;
138 }
139
140 /*
141 * skip over a breakpoint:
142 * remove breakpoints, then single step
143 * so we can put it back
144 */
145 void
execbkpt(BKPT * bk,int keepnote)146 execbkpt(BKPT *bk, int keepnote)
147 {
148 runstep(bk->loc, keepnote);
149 bk->flag = BKPTSET;
150 }
151
152 /*
153 * find the breakpoint at adr, if any
154 */
155
156 BKPT *
scanbkpt(ADDR adr)157 scanbkpt(ADDR adr)
158 {
159 BKPT *bk;
160
161 for (bk = bkpthead; bk; bk = bk->nxtbkpt)
162 if (bk->flag != BKPTCLR && bk->loc == adr)
163 break;
164 return(bk);
165 }
166
167 /*
168 * remove all breakpoints from the process' address space
169 */
170
171 void
delbp(void)172 delbp(void)
173 {
174 BKPT *bk;
175
176 if (bpin == FALSE || pid == 0)
177 return;
178 for (bk = bkpthead; bk; bk = bk->nxtbkpt)
179 if (bk->flag != BKPTCLR)
180 bkput(bk, 0);
181 bpin = FALSE;
182 }
183
184 /*
185 * install all the breakpoints
186 */
187
188 void
setbp(void)189 setbp(void)
190 {
191 BKPT *bk;
192
193 if (bpin == TRUE || pid == 0)
194 return;
195 for (bk = bkpthead; bk; bk = bk->nxtbkpt)
196 if (bk->flag != BKPTCLR)
197 bkput(bk, 1);
198 bpin = TRUE;
199 }
200