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