xref: /plan9/sys/src/cmd/db/runpcs.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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