Blob


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