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