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