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 char BADEQ[] = "unexpected `='";
11 84114f06 2004-04-19 devnull
12 84114f06 2004-04-19 devnull BOOL executing;
13 84114f06 2004-04-19 devnull extern char *lp;
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull char eqformat[ARB] = "z";
16 84114f06 2004-04-19 devnull char stformat[ARB] = "zMi";
17 84114f06 2004-04-19 devnull
18 84114f06 2004-04-19 devnull ADDR ditto;
19 84114f06 2004-04-19 devnull
20 84114f06 2004-04-19 devnull ADDR dot;
21 84114f06 2004-04-19 devnull WORD dotinc;
22 84114f06 2004-04-19 devnull WORD adrval, cntval, loopcnt;
23 84114f06 2004-04-19 devnull int adrflg, cntflg;
24 84114f06 2004-04-19 devnull
25 84114f06 2004-04-19 devnull /* command decoding */
26 84114f06 2004-04-19 devnull
27 84114f06 2004-04-19 devnull int
28 84114f06 2004-04-19 devnull command(char *buf, int defcom)
29 84114f06 2004-04-19 devnull {
30 84114f06 2004-04-19 devnull char *reg;
31 84114f06 2004-04-19 devnull char savc;
32 84114f06 2004-04-19 devnull char *savlp=lp;
33 84114f06 2004-04-19 devnull char savlc = lastc;
34 84114f06 2004-04-19 devnull char savpc = peekc;
35 84114f06 2004-04-19 devnull static char lastcom = '=', savecom = '=';
36 84114f06 2004-04-19 devnull
37 84114f06 2004-04-19 devnull if (defcom == 0)
38 84114f06 2004-04-19 devnull defcom = lastcom;
39 84114f06 2004-04-19 devnull if (buf) {
40 84114f06 2004-04-19 devnull if (*buf==EOR)
41 84114f06 2004-04-19 devnull return(FALSE);
42 84114f06 2004-04-19 devnull clrinp();
43 84114f06 2004-04-19 devnull lp=buf;
44 84114f06 2004-04-19 devnull }
45 84114f06 2004-04-19 devnull do {
46 84114f06 2004-04-19 devnull adrflg=expr(0); /* first address */
47 84114f06 2004-04-19 devnull if (adrflg){
48 84114f06 2004-04-19 devnull dot=expv;
49 84114f06 2004-04-19 devnull ditto=expv;
50 84114f06 2004-04-19 devnull }
51 84114f06 2004-04-19 devnull adrval=dot;
52 84114f06 2004-04-19 devnull
53 84114f06 2004-04-19 devnull if (rdc()==',' && expr(0)) { /* count */
54 84114f06 2004-04-19 devnull cntflg=TRUE;
55 84114f06 2004-04-19 devnull cntval=expv;
56 84114f06 2004-04-19 devnull } else {
57 84114f06 2004-04-19 devnull cntflg=FALSE;
58 84114f06 2004-04-19 devnull cntval=1;
59 84114f06 2004-04-19 devnull reread();
60 84114f06 2004-04-19 devnull }
61 84114f06 2004-04-19 devnull
62 84114f06 2004-04-19 devnull if (!eol(rdc()))
63 84114f06 2004-04-19 devnull lastcom=lastc; /* command */
64 84114f06 2004-04-19 devnull else {
65 84114f06 2004-04-19 devnull if (adrflg==0)
66 84114f06 2004-04-19 devnull dot=inkdot(dotinc);
67 84114f06 2004-04-19 devnull reread();
68 84114f06 2004-04-19 devnull lastcom=defcom;
69 84114f06 2004-04-19 devnull }
70 84114f06 2004-04-19 devnull switch(lastcom) {
71 84114f06 2004-04-19 devnull case '/':
72 84114f06 2004-04-19 devnull case '=':
73 84114f06 2004-04-19 devnull case '?':
74 84114f06 2004-04-19 devnull savecom = lastcom;
75 84114f06 2004-04-19 devnull acommand(lastcom);
76 84114f06 2004-04-19 devnull break;
77 84114f06 2004-04-19 devnull
78 84114f06 2004-04-19 devnull case '>':
79 fa325e9b 2020-01-10 cross lastcom = savecom;
80 84114f06 2004-04-19 devnull savc=rdc();
81 84114f06 2004-04-19 devnull if (reg=regname(savc))
82 84114f06 2004-04-19 devnull rput(correg, reg, dot);
83 fa325e9b 2020-01-10 cross else
84 84114f06 2004-04-19 devnull error("bad variable");
85 84114f06 2004-04-19 devnull break;
86 84114f06 2004-04-19 devnull
87 84114f06 2004-04-19 devnull case '!':
88 84114f06 2004-04-19 devnull lastcom=savecom;
89 fa325e9b 2020-01-10 cross shell();
90 84114f06 2004-04-19 devnull break;
91 84114f06 2004-04-19 devnull
92 84114f06 2004-04-19 devnull case '$':
93 84114f06 2004-04-19 devnull lastcom=savecom;
94 fa325e9b 2020-01-10 cross printdollar(nextchar());
95 84114f06 2004-04-19 devnull break;
96 84114f06 2004-04-19 devnull
97 84114f06 2004-04-19 devnull case ':':
98 fa325e9b 2020-01-10 cross if (!executing) {
99 84114f06 2004-04-19 devnull executing=TRUE;
100 84114f06 2004-04-19 devnull subpcs(nextchar());
101 84114f06 2004-04-19 devnull executing=FALSE;
102 84114f06 2004-04-19 devnull lastcom=savecom;
103 84114f06 2004-04-19 devnull }
104 84114f06 2004-04-19 devnull break;
105 84114f06 2004-04-19 devnull
106 84114f06 2004-04-19 devnull case 0:
107 84114f06 2004-04-19 devnull prints(DBNAME);
108 84114f06 2004-04-19 devnull break;
109 84114f06 2004-04-19 devnull
110 fa325e9b 2020-01-10 cross default:
111 84114f06 2004-04-19 devnull error("bad command");
112 84114f06 2004-04-19 devnull }
113 84114f06 2004-04-19 devnull flushbuf();
114 84114f06 2004-04-19 devnull } while (rdc()==';');
115 84114f06 2004-04-19 devnull if (buf == 0)
116 84114f06 2004-04-19 devnull reread();
117 84114f06 2004-04-19 devnull else {
118 84114f06 2004-04-19 devnull clrinp();
119 84114f06 2004-04-19 devnull lp=savlp;
120 84114f06 2004-04-19 devnull lastc = savlc;
121 84114f06 2004-04-19 devnull peekc = savpc;
122 84114f06 2004-04-19 devnull }
123 84114f06 2004-04-19 devnull
124 84114f06 2004-04-19 devnull if(adrflg)
125 84114f06 2004-04-19 devnull return dot;
126 84114f06 2004-04-19 devnull return 1;
127 84114f06 2004-04-19 devnull }
128 84114f06 2004-04-19 devnull
129 84114f06 2004-04-19 devnull /*
130 84114f06 2004-04-19 devnull * [/?][wml]
131 84114f06 2004-04-19 devnull */
132 84114f06 2004-04-19 devnull
133 84114f06 2004-04-19 devnull void
134 84114f06 2004-04-19 devnull acommand(int pc)
135 84114f06 2004-04-19 devnull {
136 84114f06 2004-04-19 devnull int eqcom;
137 84114f06 2004-04-19 devnull Map *map;
138 84114f06 2004-04-19 devnull char *fmt;
139 84114f06 2004-04-19 devnull char buf[512];
140 84114f06 2004-04-19 devnull
141 84114f06 2004-04-19 devnull if (pc == '=') {
142 84114f06 2004-04-19 devnull eqcom = 1;
143 84114f06 2004-04-19 devnull fmt = eqformat;
144 84114f06 2004-04-19 devnull map = dotmap;
145 84114f06 2004-04-19 devnull } else {
146 84114f06 2004-04-19 devnull eqcom = 0;
147 84114f06 2004-04-19 devnull fmt = stformat;
148 84114f06 2004-04-19 devnull if (pc == '/')
149 84114f06 2004-04-19 devnull map = cormap;
150 84114f06 2004-04-19 devnull else
151 84114f06 2004-04-19 devnull map = symmap;
152 84114f06 2004-04-19 devnull }
153 84114f06 2004-04-19 devnull if (!map) {
154 84114f06 2004-04-19 devnull sprint(buf, "no map for %c", pc);
155 84114f06 2004-04-19 devnull error(buf);
156 84114f06 2004-04-19 devnull }
157 84114f06 2004-04-19 devnull
158 84114f06 2004-04-19 devnull switch (rdc())
159 84114f06 2004-04-19 devnull {
160 84114f06 2004-04-19 devnull case 'm':
161 84114f06 2004-04-19 devnull if (eqcom)
162 fa325e9b 2020-01-10 cross error(BADEQ);
163 84114f06 2004-04-19 devnull cmdmap(map);
164 84114f06 2004-04-19 devnull break;
165 84114f06 2004-04-19 devnull
166 84114f06 2004-04-19 devnull case 'L':
167 84114f06 2004-04-19 devnull case 'l':
168 84114f06 2004-04-19 devnull if (eqcom)
169 fa325e9b 2020-01-10 cross error(BADEQ);
170 84114f06 2004-04-19 devnull cmdsrc(lastc, map);
171 84114f06 2004-04-19 devnull break;
172 84114f06 2004-04-19 devnull
173 84114f06 2004-04-19 devnull case 'W':
174 84114f06 2004-04-19 devnull case 'w':
175 84114f06 2004-04-19 devnull if (eqcom)
176 fa325e9b 2020-01-10 cross error(BADEQ);
177 84114f06 2004-04-19 devnull cmdwrite(lastc, map);
178 84114f06 2004-04-19 devnull break;
179 84114f06 2004-04-19 devnull
180 84114f06 2004-04-19 devnull default:
181 84114f06 2004-04-19 devnull reread();
182 84114f06 2004-04-19 devnull getformat(fmt);
183 84114f06 2004-04-19 devnull scanform(cntval, !eqcom, fmt, map, eqcom);
184 84114f06 2004-04-19 devnull }
185 84114f06 2004-04-19 devnull }
186 84114f06 2004-04-19 devnull
187 84114f06 2004-04-19 devnull void
188 84114f06 2004-04-19 devnull cmdsrc(int c, Map *map)
189 84114f06 2004-04-19 devnull {
190 84114f06 2004-04-19 devnull u32int w;
191 84114f06 2004-04-19 devnull long locval, locmsk;
192 84114f06 2004-04-19 devnull ADDR savdot;
193 84114f06 2004-04-19 devnull ushort sh;
194 84114f06 2004-04-19 devnull char buf[512];
195 84114f06 2004-04-19 devnull int ret;
196 84114f06 2004-04-19 devnull
197 84114f06 2004-04-19 devnull if (c == 'L')
198 84114f06 2004-04-19 devnull dotinc = 4;
199 84114f06 2004-04-19 devnull else
200 84114f06 2004-04-19 devnull dotinc = 2;
201 84114f06 2004-04-19 devnull savdot=dot;
202 fa325e9b 2020-01-10 cross expr(1);
203 84114f06 2004-04-19 devnull locval=expv;
204 84114f06 2004-04-19 devnull if (expr(0))
205 fa325e9b 2020-01-10 cross locmsk=expv;
206 84114f06 2004-04-19 devnull else
207 84114f06 2004-04-19 devnull locmsk = ~0;
208 84114f06 2004-04-19 devnull if (c == 'L')
209 84114f06 2004-04-19 devnull while ((ret = get4(map, dot, &w)) > 0 && (w&locmsk) != locval)
210 84114f06 2004-04-19 devnull dot = inkdot(dotinc);
211 84114f06 2004-04-19 devnull else
212 84114f06 2004-04-19 devnull while ((ret = get2(map, dot, &sh)) > 0 && (sh&locmsk) != locval)
213 84114f06 2004-04-19 devnull dot = inkdot(dotinc);
214 fa325e9b 2020-01-10 cross if (ret < 0) {
215 fa325e9b 2020-01-10 cross dot=savdot;
216 84114f06 2004-04-19 devnull error("%r");
217 84114f06 2004-04-19 devnull }
218 84114f06 2004-04-19 devnull symoff(buf, 512, dot, CANY);
219 84114f06 2004-04-19 devnull dprint(buf);
220 84114f06 2004-04-19 devnull }
221 84114f06 2004-04-19 devnull
222 84114f06 2004-04-19 devnull static char badwrite[] = "can't write process memory or text image";
223 84114f06 2004-04-19 devnull
224 84114f06 2004-04-19 devnull void
225 84114f06 2004-04-19 devnull cmdwrite(int wcom, Map *map)
226 84114f06 2004-04-19 devnull {
227 84114f06 2004-04-19 devnull ADDR savdot;
228 84114f06 2004-04-19 devnull char *format;
229 84114f06 2004-04-19 devnull int pass;
230 84114f06 2004-04-19 devnull
231 84114f06 2004-04-19 devnull if (wcom == 'w')
232 84114f06 2004-04-19 devnull format = "x";
233 84114f06 2004-04-19 devnull else
234 84114f06 2004-04-19 devnull format = "X";
235 84114f06 2004-04-19 devnull expr(1);
236 84114f06 2004-04-19 devnull pass = 0;
237 84114f06 2004-04-19 devnull do {
238 fa325e9b 2020-01-10 cross pass++;
239 84114f06 2004-04-19 devnull savdot=dot;
240 84114f06 2004-04-19 devnull exform(1, 1, format, map, 0, pass);
241 84114f06 2004-04-19 devnull dot=savdot;
242 84114f06 2004-04-19 devnull if (wcom == 'W') {
243 84114f06 2004-04-19 devnull if (put4(map, dot, expv) <= 0)
244 84114f06 2004-04-19 devnull error(badwrite);
245 84114f06 2004-04-19 devnull } else {
246 84114f06 2004-04-19 devnull if (put2(map, dot, expv) <= 0)
247 84114f06 2004-04-19 devnull error(badwrite);
248 84114f06 2004-04-19 devnull }
249 84114f06 2004-04-19 devnull savdot=dot;
250 fa325e9b 2020-01-10 cross dprint("=%8t");
251 84114f06 2004-04-19 devnull exform(1, 0, format, map, 0, pass);
252 84114f06 2004-04-19 devnull newline();
253 84114f06 2004-04-19 devnull } while (expr(0));
254 84114f06 2004-04-19 devnull dot=savdot;
255 84114f06 2004-04-19 devnull }
256 84114f06 2004-04-19 devnull
257 84114f06 2004-04-19 devnull /*
258 84114f06 2004-04-19 devnull * collect a register name; return register offset
259 84114f06 2004-04-19 devnull * this is not what i'd call a good division of labour
260 84114f06 2004-04-19 devnull */
261 84114f06 2004-04-19 devnull
262 84114f06 2004-04-19 devnull char *
263 84114f06 2004-04-19 devnull regname(int regnam)
264 84114f06 2004-04-19 devnull {
265 84114f06 2004-04-19 devnull static char buf[64];
266 84114f06 2004-04-19 devnull char *p;
267 84114f06 2004-04-19 devnull int c;
268 84114f06 2004-04-19 devnull
269 84114f06 2004-04-19 devnull p = buf;
270 84114f06 2004-04-19 devnull *p++ = regnam;
271 84114f06 2004-04-19 devnull while (isalnum(c = readchar())) {
272 84114f06 2004-04-19 devnull if (p >= buf+sizeof(buf)-1)
273 84114f06 2004-04-19 devnull error("register name too long");
274 84114f06 2004-04-19 devnull *p++ = c;
275 84114f06 2004-04-19 devnull }
276 84114f06 2004-04-19 devnull *p = 0;
277 84114f06 2004-04-19 devnull reread();
278 84114f06 2004-04-19 devnull return (buf);
279 84114f06 2004-04-19 devnull }
280 84114f06 2004-04-19 devnull
281 84114f06 2004-04-19 devnull /*
282 84114f06 2004-04-19 devnull * shell escape
283 84114f06 2004-04-19 devnull */
284 84114f06 2004-04-19 devnull
285 84114f06 2004-04-19 devnull void
286 84114f06 2004-04-19 devnull shell(void)
287 84114f06 2004-04-19 devnull {
288 84114f06 2004-04-19 devnull int rc, unixpid;
289 84114f06 2004-04-19 devnull char *argp = lp;
290 84114f06 2004-04-19 devnull
291 84114f06 2004-04-19 devnull while (lastc!=EOR)
292 84114f06 2004-04-19 devnull rdc();
293 84114f06 2004-04-19 devnull if ((unixpid=fork())==0) {
294 84114f06 2004-04-19 devnull *lp=0;
295 84114f06 2004-04-19 devnull execl("/bin/rc", "rc", "-c", argp, 0);
296 84114f06 2004-04-19 devnull exits("execl"); /* botch */
297 84114f06 2004-04-19 devnull } else if (unixpid == -1) {
298 84114f06 2004-04-19 devnull error("cannot fork");
299 84114f06 2004-04-19 devnull } else {
300 84114f06 2004-04-19 devnull mkfault = 0;
301 84114f06 2004-04-19 devnull while ((rc = waitpid()) != unixpid){
302 84114f06 2004-04-19 devnull if(rc == -1 && mkfault){
303 84114f06 2004-04-19 devnull mkfault = 0;
304 84114f06 2004-04-19 devnull continue;
305 84114f06 2004-04-19 devnull }
306 84114f06 2004-04-19 devnull break;
307 84114f06 2004-04-19 devnull }
308 fa325e9b 2020-01-10 cross prints("!");
309 84114f06 2004-04-19 devnull reread();
310 84114f06 2004-04-19 devnull }
311 84114f06 2004-04-19 devnull }