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