URI:
       trunpcs.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       trunpcs.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 }