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 BKPT *bkpthead; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier BOOL bpin; 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier int pid; 153e12c5d1SDavid du Colombier int nnote; 163e12c5d1SDavid du Colombier int ending; 173e12c5d1SDavid du Colombier char note[NNOTE][ERRLEN]; 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier /* service routines for sub process control */ 203e12c5d1SDavid du Colombier 213e12c5d1SDavid du Colombier runpcs(int runmode, int keepnote) 223e12c5d1SDavid du Colombier { 233e12c5d1SDavid du Colombier int rc; 243e12c5d1SDavid du Colombier BKPT *bkpt; 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier rc = 0; 273e12c5d1SDavid du Colombier if (adrflg) 28*219b2ee8SDavid du Colombier rput(cormap, mach->pc, dot); 29*219b2ee8SDavid du Colombier dot = rget(cormap, mach->pc); 303e12c5d1SDavid du Colombier flush(); 313e12c5d1SDavid du Colombier while (--loopcnt >= 0) { 323e12c5d1SDavid du Colombier if (runmode == SINGLE) { 333e12c5d1SDavid du Colombier bkpt = scanbkpt(dot); 343e12c5d1SDavid du Colombier if (bkpt) { 353e12c5d1SDavid du Colombier switch(bkpt->flag){ 363e12c5d1SDavid du Colombier case BKPTTMP: 373e12c5d1SDavid du Colombier bkpt->flag = BKPTCLR; 383e12c5d1SDavid du Colombier break; 393e12c5d1SDavid du Colombier case BKPTSKIP: 403e12c5d1SDavid du Colombier bkpt->flag = BKPTSET; 413e12c5d1SDavid du Colombier break; 423e12c5d1SDavid du Colombier } 433e12c5d1SDavid du Colombier } 443e12c5d1SDavid du Colombier runstep(dot, keepnote); 453e12c5d1SDavid du Colombier } else { 46*219b2ee8SDavid du Colombier if ((bkpt = scanbkpt(rget(cormap, mach->pc))) != 0) { 473e12c5d1SDavid du Colombier execbkpt(bkpt, keepnote); 483e12c5d1SDavid du Colombier keepnote = 0; 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier setbp(); 513e12c5d1SDavid du Colombier runrun(keepnote); 523e12c5d1SDavid du Colombier } 533e12c5d1SDavid du Colombier keepnote = 0; 543e12c5d1SDavid du Colombier delbp(); 55*219b2ee8SDavid du Colombier dot = rget(cormap, mach->pc); 563e12c5d1SDavid du Colombier /* real note? */ 573e12c5d1SDavid du Colombier if (nnote > 0) { 583e12c5d1SDavid du Colombier keepnote = 1; 593e12c5d1SDavid du Colombier rc = 0; 603e12c5d1SDavid du Colombier continue; 613e12c5d1SDavid du Colombier } 623e12c5d1SDavid du Colombier bkpt = scanbkpt(dot); 633e12c5d1SDavid du Colombier if(bkpt == 0){ 643e12c5d1SDavid du Colombier keepnote = 0; 653e12c5d1SDavid du Colombier rc = 0; 663e12c5d1SDavid du Colombier continue; 673e12c5d1SDavid du Colombier } 683e12c5d1SDavid du Colombier /* breakpoint */ 693e12c5d1SDavid du Colombier if (bkpt->flag == BKPTTMP) 703e12c5d1SDavid du Colombier bkpt->flag = BKPTCLR; 713e12c5d1SDavid du Colombier else if (bkpt->flag == BKPTSKIP) { 723e12c5d1SDavid du Colombier execbkpt(bkpt, keepnote); 733e12c5d1SDavid du Colombier keepnote = 0; 743e12c5d1SDavid du Colombier loopcnt++; /* we didn't really stop */ 753e12c5d1SDavid du Colombier continue; 763e12c5d1SDavid du Colombier } 773e12c5d1SDavid du Colombier else { 783e12c5d1SDavid du Colombier bkpt->flag = BKPTSKIP; 793e12c5d1SDavid du Colombier --bkpt->count; 803e12c5d1SDavid du Colombier if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0) 813e12c5d1SDavid du Colombier && bkpt->count != 0) { 823e12c5d1SDavid du Colombier execbkpt(bkpt, keepnote); 833e12c5d1SDavid du Colombier keepnote = 0; 843e12c5d1SDavid du Colombier loopcnt++; 853e12c5d1SDavid du Colombier continue; 863e12c5d1SDavid du Colombier } 873e12c5d1SDavid du Colombier bkpt->count = bkpt->initcnt; 883e12c5d1SDavid du Colombier } 893e12c5d1SDavid du Colombier rc = 1; 903e12c5d1SDavid du Colombier } 913e12c5d1SDavid du Colombier return(rc); 923e12c5d1SDavid du Colombier } 933e12c5d1SDavid du Colombier 943e12c5d1SDavid du Colombier /* 953e12c5d1SDavid du Colombier * finish the process off; 963e12c5d1SDavid du Colombier * kill if still running 973e12c5d1SDavid du Colombier */ 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier void 1003e12c5d1SDavid du Colombier endpcs(void) 1013e12c5d1SDavid du Colombier { 1023e12c5d1SDavid du Colombier BKPT *bk; 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier if(ending) 1053e12c5d1SDavid du Colombier return; 1063e12c5d1SDavid du Colombier ending = 1; 1073e12c5d1SDavid du Colombier if (pid) { 1083e12c5d1SDavid du Colombier if(pcsactive){ 1093e12c5d1SDavid du Colombier killpcs(); 1103e12c5d1SDavid du Colombier pcsactive = 0; 1113e12c5d1SDavid du Colombier } 1123e12c5d1SDavid du Colombier pid=0; 1133e12c5d1SDavid du Colombier nnote=0; 1143e12c5d1SDavid du Colombier for (bk=bkpthead; bk; bk = bk->nxtbkpt) 1153e12c5d1SDavid du Colombier if (bk->flag == BKPTTMP) 1163e12c5d1SDavid du Colombier bk->flag = BKPTCLR; 1173e12c5d1SDavid du Colombier else if (bk->flag != BKPTCLR) 1183e12c5d1SDavid du Colombier bk->flag = BKPTSET; 1193e12c5d1SDavid du Colombier } 1203e12c5d1SDavid du Colombier bpin = FALSE; 1213e12c5d1SDavid du Colombier ending = 0; 1223e12c5d1SDavid du Colombier } 1233e12c5d1SDavid du Colombier 1243e12c5d1SDavid du Colombier /* 1253e12c5d1SDavid du Colombier * start up the program to be debugged in a child 1263e12c5d1SDavid du Colombier */ 1273e12c5d1SDavid du Colombier 1283e12c5d1SDavid du Colombier void 1293e12c5d1SDavid du Colombier setup(void) 1303e12c5d1SDavid du Colombier { 1313e12c5d1SDavid du Colombier 1323e12c5d1SDavid du Colombier nnote = 0; 1333e12c5d1SDavid du Colombier startpcs(); 1343e12c5d1SDavid du Colombier bpin = FALSE; 1353e12c5d1SDavid du Colombier pcsactive = 1; 1363e12c5d1SDavid du Colombier } 1373e12c5d1SDavid du Colombier 1383e12c5d1SDavid du Colombier /* 1393e12c5d1SDavid du Colombier * skip over a breakpoint: 1403e12c5d1SDavid du Colombier * remove breakpoints, then single step 1413e12c5d1SDavid du Colombier * so we can put it back 1423e12c5d1SDavid du Colombier */ 1433e12c5d1SDavid du Colombier void 1443e12c5d1SDavid du Colombier execbkpt(BKPT *bk, int keepnote) 1453e12c5d1SDavid du Colombier { 1463e12c5d1SDavid du Colombier runstep(bk->loc, keepnote); 1473e12c5d1SDavid du Colombier bk->flag = BKPTSET; 1483e12c5d1SDavid du Colombier } 1493e12c5d1SDavid du Colombier 1503e12c5d1SDavid du Colombier /* 1513e12c5d1SDavid du Colombier * find the breakpoint at adr, if any 1523e12c5d1SDavid du Colombier */ 1533e12c5d1SDavid du Colombier 1543e12c5d1SDavid du Colombier BKPT * 1553e12c5d1SDavid du Colombier scanbkpt(ADDR adr) 1563e12c5d1SDavid du Colombier { 1573e12c5d1SDavid du Colombier BKPT *bk; 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier for (bk = bkpthead; bk; bk = bk->nxtbkpt) 1603e12c5d1SDavid du Colombier if (bk->flag != BKPTCLR && bk->loc == adr) 1613e12c5d1SDavid du Colombier break; 1623e12c5d1SDavid du Colombier return(bk); 1633e12c5d1SDavid du Colombier } 1643e12c5d1SDavid du Colombier 1653e12c5d1SDavid du Colombier /* 1663e12c5d1SDavid du Colombier * remove all breakpoints from the process' address space 1673e12c5d1SDavid du Colombier */ 1683e12c5d1SDavid du Colombier 1693e12c5d1SDavid du Colombier void 1703e12c5d1SDavid du Colombier delbp(void) 1713e12c5d1SDavid du Colombier { 1723e12c5d1SDavid du Colombier BKPT *bk; 1733e12c5d1SDavid du Colombier 1743e12c5d1SDavid du Colombier if (bpin == FALSE || pid == 0) 1753e12c5d1SDavid du Colombier return; 1763e12c5d1SDavid du Colombier for (bk = bkpthead; bk; bk = bk->nxtbkpt) 1773e12c5d1SDavid du Colombier if (bk->flag != BKPTCLR) 1783e12c5d1SDavid du Colombier bkput(bk, 0); 1793e12c5d1SDavid du Colombier bpin = FALSE; 1803e12c5d1SDavid du Colombier } 1813e12c5d1SDavid du Colombier 1823e12c5d1SDavid du Colombier /* 1833e12c5d1SDavid du Colombier * install all the breakpoints 1843e12c5d1SDavid du Colombier */ 1853e12c5d1SDavid du Colombier 1863e12c5d1SDavid du Colombier void 1873e12c5d1SDavid du Colombier setbp(void) 1883e12c5d1SDavid du Colombier { 1893e12c5d1SDavid du Colombier BKPT *bk; 1903e12c5d1SDavid du Colombier 1913e12c5d1SDavid du Colombier if (bpin == TRUE || pid == 0) 1923e12c5d1SDavid du Colombier return; 1933e12c5d1SDavid du Colombier for (bk = bkpthead; bk; bk = bk->nxtbkpt) 1943e12c5d1SDavid du Colombier if (bk->flag != BKPTCLR) 1953e12c5d1SDavid du Colombier bkput(bk, 1); 1963e12c5d1SDavid du Colombier bpin = TRUE; 1973e12c5d1SDavid du Colombier } 198