xref: /original-bsd/old/sdb/xeq.c (revision 2301fdfb)
1 static	char sccsid[] = "@(#)xeq.c 4.3 08/17/82";
2 #include "head.h"
3 #include <a.out.h>
4 #include <stab.h>
5 struct user u;
6 #include <stdio.h>
7 INT signo;
8 INT adrflg;
9 INT pid;
10 ADDR userpc;
11 L_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  */
21 monex(loc, d)
22 ADDR 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 */
33 singstep(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 
84 doscall() {
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 */
226 getargs() {
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 
243 old1:	cpstr(args, oldargs);
244 	printf("%s %s\n", symfil, args);
245 	return;
246 
247 fnd:	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 		}
266 l1:		*argsp++ = ' ';
267 	}
268 	*argsp == '\0';
269 	printf("%s %s\n", symfil, args);
270 	return;
271 
272 
273 }
274 
275 dopcs(c)
276 char 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 */
302 acommand(cmds)
303 char *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 		if (!endflg)
329 			*p = ';';
330 		p = cmds = p + 1;
331 	} while (!endflg);
332 }
333