plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

runpcs.c (3021B)


      1 /*
      2  *
      3  *	debugger
      4  *
      5  */
      6 
      7 #include "defs.h"
      8 #include "fns.h"
      9 
     10 BKPT *bkpthead;
     11 
     12 BOOL bpin;
     13 
     14 int pid;
     15 int nnote;
     16 int ending;
     17 char note[NNOTE][ERRMAX];
     18 
     19 /* service routines for sub process control */
     20 
     21 int
     22 runpcs(int runmode, int keepnote)
     23 {
     24 	int rc;
     25 	BKPT *bkpt;
     26 	ADDR x;
     27 
     28 	rc = 0;
     29 	if (adrflg)
     30 		rput(correg, mach->pc, dot);
     31 	if(rget(correg, mach->pc, &dot) < 0)
     32 		error("%r");
     33 	flush();
     34 	while (--loopcnt >= 0) {
     35 		if(loopcnt != 0)
     36 			printpc();
     37 		if (runmode == SINGLE) {
     38 			bkpt = scanbkpt(dot);
     39 			if (bkpt) {
     40 				switch(bkpt->flag){
     41 				case BKPTTMP:
     42 					bkpt->flag = BKPTCLR;
     43 					break;
     44 				case BKPTSKIP:
     45 					bkpt->flag = BKPTSET;
     46 					break;
     47 				}
     48 			}
     49 			runstep(dot, keepnote);
     50 		} else {
     51 			if(rget(correg, mach->pc, &x) < 0)
     52 				error("%r");
     53 			if ((bkpt = scanbkpt(x)) != 0) {
     54 				execbkpt(bkpt, keepnote);
     55 				keepnote = 0;
     56 			}
     57 			setbp();
     58 			runrun(keepnote);
     59 		}
     60 		keepnote = 0;
     61 		delbp();
     62 		if(rget(correg, mach->pc, &dot) < 0)
     63 			error("%r");
     64 		/* real note? */
     65 		if (nnote > 0) {
     66 			keepnote = 1;
     67 			rc = 0;
     68 			continue;
     69 		}
     70 		bkpt = scanbkpt(dot);
     71 		if(bkpt == 0){
     72 			keepnote = 0;
     73 			rc = 0;
     74 			continue;
     75 		}
     76 		/* breakpoint */
     77 		if (bkpt->flag == BKPTTMP)
     78 			bkpt->flag = BKPTCLR;
     79 		else if (bkpt->flag == BKPTSKIP) {
     80 			execbkpt(bkpt, keepnote);
     81 			keepnote = 0;
     82 			loopcnt++;	/* we didn't really stop */
     83 			continue;
     84 		}
     85 		else {
     86 			bkpt->flag = BKPTSKIP;
     87 			--bkpt->count;
     88 			if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0)
     89 			&&  bkpt->count != 0) {
     90 				execbkpt(bkpt, keepnote);
     91 				keepnote = 0;
     92 				loopcnt++;
     93 				continue;
     94 			}
     95 			bkpt->count = bkpt->initcnt;
     96 		}
     97 		rc = 1;
     98 	}
     99 	return(rc);
    100 }
    101 
    102 /*
    103  * finish the process off;
    104  * kill if still running
    105  */
    106 
    107 void
    108 endpcs(void)
    109 {
    110 	BKPT *bk;
    111 
    112 	if(ending)
    113 		return;
    114 	ending = 1;
    115 	if (pid) {
    116 		if(pcsactive){
    117 			killpcs();
    118 			pcsactive = 0;
    119 		}
    120 		pid=0;
    121 		nnote=0;
    122 		for (bk=bkpthead; bk; bk = bk->nxtbkpt)
    123 			if (bk->flag == BKPTTMP)
    124 				bk->flag = BKPTCLR;
    125 			else if (bk->flag != BKPTCLR)
    126 				bk->flag = BKPTSET;
    127 	}
    128 	bpin = FALSE;
    129 	ending = 0;
    130 }
    131 
    132 /*
    133  * start up the program to be debugged in a child
    134  */
    135 
    136 void
    137 setup(void)
    138 {
    139 
    140 	nnote = 0;
    141 	startpcs();
    142 	bpin = FALSE;
    143 	pcsactive = 1;
    144 }
    145 
    146 /*
    147  * skip over a breakpoint:
    148  * remove breakpoints, then single step
    149  * so we can put it back
    150  */
    151 void
    152 execbkpt(BKPT *bk, int keepnote)
    153 {
    154 	runstep(bk->loc, keepnote);
    155 	bk->flag = BKPTSET;
    156 }
    157 
    158 /*
    159  * find the breakpoint at adr, if any
    160  */
    161 
    162 BKPT *
    163 scanbkpt(ADDR adr)
    164 {
    165 	BKPT *bk;
    166 
    167 	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
    168 		if (bk->flag != BKPTCLR && bk->loc == adr)
    169 			break;
    170 	return(bk);
    171 }
    172 
    173 /*
    174  * remove all breakpoints from the process' address space
    175  */
    176 
    177 void
    178 delbp(void)
    179 {
    180 	BKPT *bk;
    181 
    182 	if (bpin == FALSE || pid == 0)
    183 		return;
    184 	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
    185 		if (bk->flag != BKPTCLR)
    186 			bkput(bk, 0);
    187 	bpin = FALSE;
    188 }
    189 
    190 /*
    191  * install all the breakpoints
    192  */
    193 
    194 void
    195 setbp(void)
    196 {
    197 	BKPT *bk;
    198 
    199 	if (bpin == TRUE || pid == 0)
    200 		return;
    201 	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
    202 		if (bk->flag != BKPTCLR)
    203 			bkput(bk, 1);
    204 	bpin = TRUE;
    205 }