13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * 33e12c5d1SDavid du Colombier * debugger 43e12c5d1SDavid du Colombier * 53e12c5d1SDavid du Colombier */ 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier #include "defs.h" 83e12c5d1SDavid du Colombier #include "fns.h" 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier char NOPCS[] = "no process"; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier extern char lastc; 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier /* sub process control */ 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier void 173e12c5d1SDavid du Colombier subpcs(int modif) 183e12c5d1SDavid du Colombier { 193e12c5d1SDavid du Colombier int check; 203e12c5d1SDavid du Colombier int runmode; 213e12c5d1SDavid du Colombier int keepnote; 223e12c5d1SDavid du Colombier int n, r; 233e12c5d1SDavid du Colombier long line, curr; 243e12c5d1SDavid du Colombier BKPT *bk; 253e12c5d1SDavid du Colombier char *comptr; 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier runmode=SINGLE; 283e12c5d1SDavid du Colombier r = 0; 293e12c5d1SDavid du Colombier keepnote=0; 303e12c5d1SDavid du Colombier loopcnt=cntval; 313e12c5d1SDavid du Colombier switch (modif) { 323e12c5d1SDavid du Colombier 333e12c5d1SDavid du Colombier /* delete breakpoint */ 343e12c5d1SDavid du Colombier case 'd': 353e12c5d1SDavid du Colombier case 'D': 363e12c5d1SDavid du Colombier if ((bk=scanbkpt(dot)) == 0) 373e12c5d1SDavid du Colombier error("no breakpoint set"); 383e12c5d1SDavid du Colombier bk->flag=BKPTCLR; 393e12c5d1SDavid du Colombier return; 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier /* set breakpoint */ 423e12c5d1SDavid du Colombier case 'b': 433e12c5d1SDavid du Colombier case 'B': 443e12c5d1SDavid du Colombier if (bk=scanbkpt(dot)) 453e12c5d1SDavid du Colombier bk->flag=BKPTCLR; 463e12c5d1SDavid du Colombier for (bk=bkpthead; bk; bk=bk->nxtbkpt) 473e12c5d1SDavid du Colombier if (bk->flag == BKPTCLR) 483e12c5d1SDavid du Colombier break; 493e12c5d1SDavid du Colombier if (bk==0) { 503e12c5d1SDavid du Colombier bk = (BKPT *)malloc(sizeof(*bk)); 513e12c5d1SDavid du Colombier if (bk == 0) 523e12c5d1SDavid du Colombier error("too many breakpoints"); 533e12c5d1SDavid du Colombier bk->nxtbkpt=bkpthead; 543e12c5d1SDavid du Colombier bkpthead=bk; 553e12c5d1SDavid du Colombier } 563e12c5d1SDavid du Colombier bk->loc = dot; 573e12c5d1SDavid du Colombier bk->initcnt = bk->count = cntval; 583e12c5d1SDavid du Colombier bk->flag = modif == 'b' ? BKPTSET : BKPTTMP; 593e12c5d1SDavid du Colombier check=MAXCOM-1; 603e12c5d1SDavid du Colombier comptr=bk->comm; 613e12c5d1SDavid du Colombier rdc(); 623e12c5d1SDavid du Colombier reread(); 633e12c5d1SDavid du Colombier do { 643e12c5d1SDavid du Colombier *comptr++ = readchar(); 653e12c5d1SDavid du Colombier } while (check-- && lastc!=EOR); 663e12c5d1SDavid du Colombier *comptr=0; 673e12c5d1SDavid du Colombier if(bk->comm[0] != EOR && cntflg == FALSE) 683e12c5d1SDavid du Colombier bk->initcnt = bk->count = HUGEINT; 693e12c5d1SDavid du Colombier reread(); 703e12c5d1SDavid du Colombier if (check) 713e12c5d1SDavid du Colombier return; 723e12c5d1SDavid du Colombier error("bkpt command too long"); 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier /* exit */ 753e12c5d1SDavid du Colombier case 'k' : 763e12c5d1SDavid du Colombier case 'K': 773e12c5d1SDavid du Colombier if (pid == 0) 783e12c5d1SDavid du Colombier error(NOPCS); 793e12c5d1SDavid du Colombier dprint("%d: killed", pid); 803e12c5d1SDavid du Colombier pcsactive = 1; /* force 'kill' ctl */ 813e12c5d1SDavid du Colombier endpcs(); 823e12c5d1SDavid du Colombier return; 833e12c5d1SDavid du Colombier 843e12c5d1SDavid du Colombier /* run program */ 853e12c5d1SDavid du Colombier case 'r': 863e12c5d1SDavid du Colombier case 'R': 873e12c5d1SDavid du Colombier endpcs(); 883e12c5d1SDavid du Colombier setup(); 893e12c5d1SDavid du Colombier runmode = CONTIN; 903e12c5d1SDavid du Colombier break; 913e12c5d1SDavid du Colombier 923e12c5d1SDavid du Colombier /* single step */ 933e12c5d1SDavid du Colombier case 's': 943e12c5d1SDavid du Colombier if (pid == 0) { 953e12c5d1SDavid du Colombier setup(); 963e12c5d1SDavid du Colombier loopcnt--; 973e12c5d1SDavid du Colombier } 983e12c5d1SDavid du Colombier runmode=SINGLE; 993e12c5d1SDavid du Colombier keepnote=defval(1); 1003e12c5d1SDavid du Colombier break; 1013e12c5d1SDavid du Colombier case 'S': 1023e12c5d1SDavid du Colombier if (pid == 0) { 1033e12c5d1SDavid du Colombier setup(); 1043e12c5d1SDavid du Colombier loopcnt--; 1053e12c5d1SDavid du Colombier } 1063e12c5d1SDavid du Colombier keepnote=defval(1); 107*219b2ee8SDavid du Colombier line = pc2line(rget(cormap, mach->pc)); 1083e12c5d1SDavid du Colombier n = loopcnt; 1093e12c5d1SDavid du Colombier dprint("%s: running\n", symfil); 1103e12c5d1SDavid du Colombier flush(); 1113e12c5d1SDavid du Colombier for (loopcnt = 1; n > 0; loopcnt = 1) { 1123e12c5d1SDavid du Colombier r = runpcs(SINGLE, keepnote); 1133e12c5d1SDavid du Colombier curr = pc2line(dot); 1143e12c5d1SDavid du Colombier if (line != curr) { /* on a new line of c */ 1153e12c5d1SDavid du Colombier line = curr; 1163e12c5d1SDavid du Colombier n--; 1173e12c5d1SDavid du Colombier } 1183e12c5d1SDavid du Colombier } 1193e12c5d1SDavid du Colombier loopcnt = 0; 1203e12c5d1SDavid du Colombier break; 1213e12c5d1SDavid du Colombier /* continue with optional note */ 1223e12c5d1SDavid du Colombier case 'c': 1233e12c5d1SDavid du Colombier case 'C': 1243e12c5d1SDavid du Colombier if (pid==0) 1253e12c5d1SDavid du Colombier error(NOPCS); 1263e12c5d1SDavid du Colombier runmode=CONTIN; 1273e12c5d1SDavid du Colombier keepnote=defval(1); 1283e12c5d1SDavid du Colombier break; 1293e12c5d1SDavid du Colombier 1303e12c5d1SDavid du Colombier case 'n': /* deal with notes */ 1313e12c5d1SDavid du Colombier if (pid==0) 1323e12c5d1SDavid du Colombier error(NOPCS); 1333e12c5d1SDavid du Colombier n=defval(-1); 1343e12c5d1SDavid du Colombier if(n>=0 && n<nnote){ 1353e12c5d1SDavid du Colombier nnote--; 1363e12c5d1SDavid du Colombier memmove(note[n], note[n+1], (nnote-n)*sizeof(note[0])); 1373e12c5d1SDavid du Colombier } 1383e12c5d1SDavid du Colombier notes(); 1393e12c5d1SDavid du Colombier return; 1403e12c5d1SDavid du Colombier 1413e12c5d1SDavid du Colombier case 'h': /* halt the current process */ 1423e12c5d1SDavid du Colombier if (adrflg && adrval == 0) { 1433e12c5d1SDavid du Colombier if (pid == 0) 1443e12c5d1SDavid du Colombier error(NOPCS); 1453e12c5d1SDavid du Colombier ungrab(); 1463e12c5d1SDavid du Colombier } 1473e12c5d1SDavid du Colombier else { 1483e12c5d1SDavid du Colombier grab(); 1493e12c5d1SDavid du Colombier dprint("stopped at%16t"); 1503e12c5d1SDavid du Colombier goto Return; 1513e12c5d1SDavid du Colombier } 1523e12c5d1SDavid du Colombier return; 1533e12c5d1SDavid du Colombier 1543e12c5d1SDavid du Colombier case 'x': /* continue executing the current process */ 1553e12c5d1SDavid du Colombier if (pid == 0) 1563e12c5d1SDavid du Colombier error(NOPCS); 1573e12c5d1SDavid du Colombier ungrab(); 1583e12c5d1SDavid du Colombier return; 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier default: 1613e12c5d1SDavid du Colombier error("bad `:' command"); 1623e12c5d1SDavid du Colombier } 1633e12c5d1SDavid du Colombier 1643e12c5d1SDavid du Colombier if (loopcnt>0) { 1653e12c5d1SDavid du Colombier dprint("%s: running\n", symfil); 1663e12c5d1SDavid du Colombier flush(); 1673e12c5d1SDavid du Colombier r = runpcs(runmode,keepnote); 1683e12c5d1SDavid du Colombier } 1693e12c5d1SDavid du Colombier if (r) 1703e12c5d1SDavid du Colombier dprint("breakpoint%16t"); 1713e12c5d1SDavid du Colombier else 1723e12c5d1SDavid du Colombier dprint("stopped at%16t"); 1733e12c5d1SDavid du Colombier Return: 1743e12c5d1SDavid du Colombier delbp(); 1753e12c5d1SDavid du Colombier printpc(); 1763e12c5d1SDavid du Colombier notes(); 1773e12c5d1SDavid du Colombier } 178