xref: /csrg-svn/sys/deprecated/kdb/kdb_pcs.c (revision 38917)
130296Ssam /*
2*38917Skarels  * Copyright (c) 1986, 1989 Regents of the University of California.
330296Ssam  * All rights reserved.  The Berkeley software License Agreement
430296Ssam  * specifies the terms and conditions for redistribution.
530296Ssam  *
6*38917Skarels  *	@(#)kdb_pcs.c	7.3 (Berkeley) 09/02/89
730296Ssam  */
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;
2130296Ssam 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':
3730296Ssam 		if (bkptr=scanbkpt((ADDR)dot)) {
3830110Ssam 			bkptr->flag=0;
3930110Ssam 			return;
4030110Ssam 		}
4130110Ssam 		error(NOBKPT);
4230110Ssam 
4330110Ssam 		/* set breakpoint */
4430110Ssam 	case 'b': case 'B':
4530296Ssam 		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;
6030296Ssam 		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 
79*38917Skarels 		/* kill */
80*38917Skarels 	case 'k': case 'K':
81*38917Skarels 		reset(PANIC);
82*38917Skarels 		/* NOTREACHED */
83*38917Skarels 
8430110Ssam 	default:
8530110Ssam 		error(BADMOD);
8630110Ssam 	}
8730110Ssam 	if (loopcnt>0)
8830110Ssam 		runpcs(runmode, 0);
8930110Ssam }
90