xref: /csrg-svn/sys/deprecated/kdb/kdb_pcs.c (revision 30296)
1*30296Ssam /*
2*30296Ssam  * Copyright (c) 1986 Regents of the University of California.
3*30296Ssam  * All rights reserved.  The Berkeley software License Agreement
4*30296Ssam  * specifies the terms and conditions for redistribution.
5*30296Ssam  *
6*30296Ssam  *	@(#)kdb_pcs.c	7.2 (Berkeley) 12/15/86
7*30296Ssam  */
830110Ssam 
930110Ssam #include "../kdb/defs.h"
1030110Ssam 
1130110Ssam char	*NOBKPT;
1230110Ssam char	*SZBKPT;
1330110Ssam char	*EXBKPT;
1430110Ssam char	*BADMOD;
1530110Ssam 
1630110Ssam /* breakpoints */
1730110Ssam BKPTR	bkpthead;
1830110Ssam 
1930110Ssam char	*lp;
2030110Ssam char	lastc;
21*30296Ssam extern	char *kdbmalloc();
2230110Ssam long	loopcnt;
2330110Ssam 
2430110Ssam /* sub process control */
2530110Ssam 
2630110Ssam subpcs(modif)
2730110Ssam {
2830110Ssam 	register check, runmode;
2930110Ssam 	register BKPTR bkptr;
3030110Ssam 	register char *comptr;
3130110Ssam 
3230110Ssam 	loopcnt=cntval;
3330110Ssam 	switch (modif) {
3430110Ssam 
3530110Ssam 		/* delete breakpoint */
3630110Ssam 	case 'd': case 'D':
37*30296Ssam 		if (bkptr=scanbkpt((ADDR)dot)) {
3830110Ssam 			bkptr->flag=0;
3930110Ssam 			return;
4030110Ssam 		}
4130110Ssam 		error(NOBKPT);
4230110Ssam 
4330110Ssam 		/* set breakpoint */
4430110Ssam 	case 'b': case 'B':
45*30296Ssam 		if (bkptr=scanbkpt((ADDR)dot))
4630110Ssam 			bkptr->flag=0;
4730110Ssam 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
4830110Ssam 			if (bkptr->flag == 0)
4930110Ssam 				break;
5030110Ssam 		if (bkptr==0) {
5130110Ssam 			bkptr=(BKPTR)kdbmalloc(sizeof *bkptr);
5230110Ssam 			if (bkptr == (BKPTR)-1)
5330110Ssam 				error(SZBKPT);
5430110Ssam 			bkptr->nxtbkpt=bkpthead;
5530110Ssam 			bkpthead=bkptr;
5630110Ssam 		}
5730110Ssam 		bkptr->loc = dot;
5830110Ssam 		bkptr->initcnt = bkptr->count = cntval;
5930110Ssam 		bkptr->flag = BKPTSET;
60*30296Ssam 		check=MAXCOM-1; comptr=bkptr->comm; (void) rdc(); lp--;
6130110Ssam 		do
6230110Ssam 			*comptr++ = readchar();
6330110Ssam 		while (check-- && lastc!=EOR);
6430110Ssam 		*comptr=0; lp--;
6530110Ssam 		if (check)
6630110Ssam 			return;
6730110Ssam 		error(EXBKPT);
6830110Ssam 
6930110Ssam 		/* single step */
7030110Ssam 	case 's': case 'S':
7130110Ssam 		runmode=SINGLE;
7230110Ssam 		break;
7330110Ssam 
7430110Ssam 		/* continue */
7530110Ssam 	case 'c': case 'C':
7630110Ssam 		runmode=CONTIN;
7730110Ssam 		break;
7830110Ssam 
7930110Ssam 	default:
8030110Ssam 		error(BADMOD);
8130110Ssam 	}
8230110Ssam 	if (loopcnt>0)
8330110Ssam 		runpcs(runmode, 0);
8430110Ssam }
85