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 }