BSD 4 development
[unix-history] / .ref-5cb41021d721f4e0ac572d592613f963e495d1ff / usr / src / old / sdb / xeq.c
CommitLineData
e3075328
BJ
1static char sccsid[] = "@(#)xeq.c 4.1 %G%";
2#include "head.h"
3#include <a.out.h>
4#include <stab.h>
5struct user u;
6#include <stdio.h>
7INT signo;
8INT adrflg;
9INT pid;
10ADDR userpc;
11L_INT cntval;
12
13
14/* service routines for sub process control */
15
16
17/*
18 * single step until loc with descriptor format d is modified
19 * return its new value.
20 */
21monex(loc, d)
22ADDR loc; char d; {
23 register ADDR oldval;
24
25 oldval = getval(loc, d, DSP);
26 do {
27 subpcs('s');
28 } while (oldval == getval(loc, d, DSP));
29 return(getval(loc, d, DSP));
30}
31
32/* single step count source stmts */
33singstep(count, cmd)
34 char cmd; {
35 register int thisline, curline;
36 register struct proct *thisproc;
37
38 if (sdbttym.sg_flags != userttym.sg_flags)
39 stty(2, &userttym);
40 dot = *(ADDR *) (((ADDR) &u) + PC);
41 thisproc = adrtoprocp(dot);
42 thisline = adrtolineno(dot);
43 if (count == 0) count = 1;
44 for(; count; count--) {
45 do {
46 if (cmd == 'S') { /* MACHINE DEPENDENT */
47 dot = *(ADDR *) (((ADDR) &u) + PC);
48 if ((get(dot,ISP) & 0xff) == 0xfb){ /* calls */
49 int retaddr;
50 subpcs('s');
51 retaddr =
52 *(ADDR *) (((ADDR) &u) + USP) + 16;
53 retaddr = dot = get(retaddr, DSP);
54 subpcs('b');
55 subpcs('c');
56 dot = retaddr;
57 subpcs('d');
58 dot = *(ADDR *) (((ADDR) &u) + PC);
59 if (retaddr != dot && signo == 0) {
60 gtty(2, &userttym);
61 if (sdbttym.sg_flags !=
62 userttym.sg_flags)
63 stty(2, &sdbttym);
64 printf("Breakpoint at \n");
65 return;
66 }
67 continue;
68 }
69 }
70
71 subpcs('s');
72 dot = *(ADDR *) (((ADDR) &u) + PC);
73 curline = adrtolineno(dot);
74 } while (!signo &&
75 ((thisproc == adrtoprocp(dot) && thisline == curline) ||
76 curline == -1));
77 gtty(2, &userttym);
78 if (sdbttym.sg_flags != userttym.sg_flags)
79 stty(2, &sdbttym);
80 if (signo) return;
81 }
82}
83
84doscall() {
85 int subargs[NUMARGS];
86 /* subargs[0] = address,
87 * subargs[1] = number of arguments
88 * subargs[2:NUMARGS] = actual arguments
89 */
90 union {
91 int w[128-NUMARGS];
92 char c[4*(128-NUMARGS)];
93 }substr;
94
95 register int i, numchars, *subargp;
96 register char ch;
97 ADDR straddr, adr, praddr;
98 ADDR j;
99
100 praddr = extaddr(proc);
101 if (praddr == -1) {
102 printf("Cannot find %s\n", proc);
103 return;
104 }
105 straddr = extaddr("_dbargs");
106 if (straddr == -1) {
107 error("Program not loaded with -lg");
108 return;
109 }
110
111 numchars = 0;
112 subargp = subargs;
113 argsp++;
114 *subargp++ = praddr;
115 subargp++;
116
117 for (i=0; i<NUMARGS - 2; i++) { /* process an argument */
118 ch = *argsp;
119 if (ch == '\'') {
120 *subargp++ = *(argsp+1);
121 argsp += 2;
122 } else if (ch == '"') {
123 *subargp++ = straddr + sizeof subargs + numchars;
124 argsp++;
125 for (;;) {
126 ch = *argsp++;
127 if (ch == '\\') {
128 switch(ch = *argsp++) {
129 case 'r':
130 ch = '\015';
131 break;
132 case 'n':
133 ch = '\012';
134 break;
135 case '\\':
136 ch = '\\';
137 break;
138 }
139 }
140 substr.c[numchars++] = ch;
141 if (ch == '"') {
142 substr.c[numchars-1] = '\0';
143 break;
144 }
145 if (ch == '\0') {
146 error("Unterminated string constant");
147 return;
148 }
149 if (numchars > sizeof substr.c) {
150 error("Too many string constants");
151 return;
152 }
153 }
154 } else if ((ch >= '0' && ch <= '9') || ch == '-') {
155 *subargp++ = readint(&argsp);
156 } else if ((ch >= 'a' && ch <= 'z') ||
157 (ch >= 'A' && ch <= 'Z') || ch == '_') {
158 cpname(var, argsp);
159 j = varaddr(curproc()->pname, var);
160 if (j == -1) {
161 return;
162 }
163 *subargp++ =
164 sl_class == N_RSYM ?
165 *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*j) :
166 getval(j, typetodesc(sl_type, 0)[0], DSP);
167 do {
168 argsp++;
169 } while (varchar(*argsp) || number(*argsp));
170 } else if (ch != ')') {
171 printf("Unexpected character %c\n", ch);
172 return;
173 }
174
175 do {
176 ch = *argsp++;
177 } while(ch == ' ');
178 if (ch == ')') {
179 if (scallx == 0) {
180 scallx = 1;
181 pcs = *(ADDR *)(((ADDR)&u)+PC);
182 fps = *(ADDR *)(((ADDR)&u)+FP);
183 aps = *(ADDR *)(((ADDR)&u)+AP);
184 if (bkpts = scanbkpt(userpc)) {
185 if (flagss = bkpts->flag) {
186 bkpts->flag = BKPTSET;
187 }
188 }
189 }
190 dot = *(ADDR *)(((ADDR)&u)+PC) = extaddr("_dbsubc");
191 if (dot == -1) {
192 error("Internal error - cannot find _dbsubc");
193 return;
194 }
195 adrflg = 1;
196 cntval = 1;
197 if (pid == 0 || signo) subpcs('r');
198 subargs[1] = (subargp - subargs) - 2;
199 adr = straddr;
200 for (j=0; j<=(subargp-subargs); j++) {
201 put(adr, DSP, subargs[j]);
202 adr += WORDSIZE;
203 }
204 adr = straddr + sizeof subargs;
205 for (j=0; j<(numchars+WORDSIZE-1)/WORDSIZE; j++) {
206 put(adr, DSP, substr.w[j]);
207 adr += WORDSIZE;
208 }
209 dschar = *argsp++;
210 errflg = 0;
211 dopcs('c');
212 if (!signo) printf("Breakpoint");
213 printf(" at\n");
214 return;
215 }
216 while (*argsp == ' ' || *argsp == ',')
217 argsp++;
218 }
219
220 error ("Too many arguments");
221
222}
223
224
225/* get arguments from core file, place them in args */
226getargs() {
227 struct proct *procp;
228 ADDR p, av;
229 int ac, i;
230 char *argsp = args;
231 union {
232 char c[WORDSIZE];
233 int w;
234 float f;
235 } word;
236
237 if ((procp = initframe()) == badproc) goto old1;
238 do {
239 if (eqstr("main", procp->pname))
240 goto fnd;
241 } while ((procp = nextframe()) != badproc);
242
243old1: cpstr(args, oldargs);
244 printf("%s %s\n", symfil, args);
245 return;
246
247fnd: ac = get(argp, DSP);
248 if ((ac == 0) || (ac & 0xff)) goto old1;
249 ac = get(argp+4, DSP);
250 av = (ADDR) get(argp+8, DSP);
251
252 av += WORDSIZE;
253 ac--;
254
255 for (; ac; ac--) {
256 p = (ADDR) get(av, DSP);
257 av += WORDSIZE;
258 for (;;) {
259 word.w = get(p, DSP);
260 for (i=0; i<WORDSIZE; i++) {
261 if (word.c[i] == '\0') goto l1;
262 *argsp++ = word.c[i];
263 }
264 p += WORDSIZE;
265 }
266l1: *argsp++ = ' ';
267 }
268 *argsp == '\0';
269 printf("%s %s\n", symfil, args);
270 return;
271
272
273}
274
275dopcs(c)
276char c; {
277 if (c != 'r' && c != 'R' && sdbttym.sg_flags != userttym.sg_flags)
278 stty(2, &userttym);
279 subpcs(c);
280 gtty(2, &userttym);
281 if (sdbttym.sg_flags != userttym.sg_flags)
282 stty(2, &sdbttym);
283
284 if (eqany(c, "cCsS") &&
285 *(ADDR *)(((ADDR)&u)+PC) == extaddr("_dbsubn")) {
286 if (dschar == '/') {
287 dispf((ADDR) 0, *argsp ? argsp : "d", N_RSYM, 0, 0, DSP);
288 }
289 else
290 printf("Procedure returned normally\n");
291 userpc = dot = *(ADDR *)(((ADDR)&u)+PC) = pcs;
292 *(ADDR *)(((ADDR)&u)+FP) = fps;
293 *(ADDR *)(((ADDR)&u)+AP) = aps;
294 if (bkpts)
295 bkpts->flag = flagss;
296 scallx = 0;
297 longjmp(env, 0);
298 }
299}
300
301/* execute commands from a breakpoint */
302acommand(cmds)
303char *cmds; {
304 char *p = cmds;
305 int endflg = 0;
306
307 setcur(0);
308 do { /* process a command */
309 for (;;) {
310 if (*p == ';') {
311 *p = '\n';
312 break;
313 }
314 if (*p == '\n') {
315 endflg++;
316 break;
317 }
318 p++;
319 }
320 if (decode(cmds) == 1) {
321 printf("Bad command: ");
322 do {
323 printf("%c", *cmds);
324 } while (*cmds++ != '\n');
325 return;
326 }
327 docommand();
328 p = cmds = p + 1;
329 } while (!endflg);
330}