|
|
1.1 root 1: static char sccsid[] = "@(#)xeq.c 4.1 10/9/80";
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: p = cmds = p + 1;
329: } while (!endflg);
330: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.