xref: /plan9/sys/src/cmd/db/pcs.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 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