Blame


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