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