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