xref: /original-bsd/sys/deprecated/kdb/kdb_pcs.c (revision 2bd07fe6)
1 /*
2  * Copyright (c) 1986, 1989 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)kdb_pcs.c	7.4 (Berkeley) 05/03/90
7  */
8 
9 #include "../kdb/defs.h"
10 
11 char	*kdbNOBKPT;
12 char	*kdbSZBKPT;
13 char	*kdbEXBKPT;
14 char	*kdbBADMOD;
15 
16 /* breakpoints */
17 BKPTR	kdbbkpthead;
18 
19 char	*kdblp;
20 char	kdblastc;
21 extern	char *kdbmalloc();
22 long	kdbloopcnt;
23 
24 /* sub process control */
25 
26 kdbsubpcs(modif)
27 {
28 	register check, runmode;
29 	register BKPTR bkptr;
30 	register char *comptr;
31 
32 	kdbloopcnt=kdbcntval;
33 	switch (modif) {
34 
35 		/* delete breakpoint */
36 	case 'd': case 'D':
37 		if (bkptr=kdbscanbkpt((ADDR)kdbdot)) {
38 			bkptr->flag=0;
39 			return;
40 		}
41 		kdberror(kdbNOBKPT);
42 
43 		/* set breakpoint */
44 	case 'b': case 'B':
45 		if (bkptr=kdbscanbkpt((ADDR)kdbdot))
46 			bkptr->flag=0;
47 		for (bkptr=kdbbkpthead; bkptr; bkptr=bkptr->nxtbkpt)
48 			if (bkptr->flag == 0)
49 				break;
50 		if (bkptr==0) {
51 			bkptr=(BKPTR)kdbmalloc(sizeof *bkptr);
52 			if (bkptr == (BKPTR)-1)
53 				kdberror(kdbSZBKPT);
54 			bkptr->nxtbkpt=kdbbkpthead;
55 			kdbbkpthead=bkptr;
56 		}
57 		bkptr->loc = kdbdot;
58 		bkptr->initcnt = bkptr->count = kdbcntval;
59 		bkptr->flag = BKPTSET;
60 		check=MAXCOM-1; comptr=bkptr->comm; (void) kdbrdc(); kdblp--;
61 		do
62 			*comptr++ = kdbreadchar();
63 		while (check-- && kdblastc!=EOR);
64 		*comptr=0; kdblp--;
65 		if (check)
66 			return;
67 		kdberror(kdbEXBKPT);
68 
69 		/* single step */
70 	case 's': case 'S':
71 		runmode=SINGLE;
72 		break;
73 
74 		/* continue */
75 	case 'c': case 'C':
76 		runmode=CONTIN;
77 		break;
78 
79 		/* kill */
80 	case 'k': case 'K':
81 		reset(PANIC);
82 		/* NOTREACHED */
83 
84 	default:
85 		kdberror(kdbBADMOD);
86 	}
87 	if (kdbloopcnt>0)
88 		kdbrunpcs(runmode, 0);
89 }
90