home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / runpcs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.1 KB  |  254 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        NOFORK;
  12. MSG        ENDPCS;
  13. MSG        BADWAIT;
  14.  
  15. CHAR        *lp;
  16. INT        sigint;
  17. INT        sigqit;
  18.  
  19. /* breakpoints */
  20. BKPTR        bkpthead;
  21.  
  22. REGLIST        reglist[];
  23.  
  24. CHAR        lastc;
  25. POS        corhdr[];
  26. POS        *endhdr;
  27.  
  28. INT        fcor;
  29. INT        fsym;
  30. STRING        errflg;
  31. INT        errno;
  32. INT        signo;
  33.  
  34. L_INT        dot;
  35. STRING        symfil;
  36. INT        wtflag;
  37. INT        pid;
  38. L_INT        expv;
  39. INT        adrflg;
  40. L_INT        loopcnt;
  41.  
  42.  
  43.  
  44.  
  45.  
  46. /* service routines for sub process control */
  47.  
  48. getsig(sig)
  49. {    return(expr(0) ? shorten(expv) : sig);
  50. }
  51.  
  52. INT        userpc=1;
  53.  
  54. runpcs(runmode, execsig)
  55. {
  56.     INT        rc;
  57.     REG BKPTR    bkpt;
  58.     IF adrflg
  59.     THEN userpc=shorten(dot);
  60.     FI
  61.     setbp();
  62.     printf("%s: running\n", symfil);
  63.  
  64.     WHILE (loopcnt--)>0
  65.     DO
  66. #ifdef DEBUG
  67.         printf("\ncontinue %d %d\n",userpc,execsig);
  68. #endif
  69.         stty(0,&usrtty);
  70.         ptrace(runmode,pid,userpc,execsig);
  71.         bpwait(); chkerr(); readregs();
  72.  
  73.         /*look for bkpt*/
  74.         IF signo==0 ANDF (bkpt=scanbkpt(endhdr[pc]-2))
  75.         THEN /*stopped at bkpt*/
  76.              userpc=endhdr[pc]=bkpt->loc;
  77.              IF bkpt->flag==BKPTEXEC
  78.             ORF ((bkpt->flag=BKPTEXEC, command(bkpt->comm,':')) ANDF --bkpt->count)
  79.              THEN execbkpt(bkpt); execsig=0; loopcnt++;
  80.               userpc=1;
  81.              ELSE bkpt->count=bkpt->initcnt;
  82.               rc=1;
  83.              FI
  84.         ELSE rc=0; execsig=signo; userpc=1;
  85.         FI
  86.     OD
  87.     return(rc);
  88. }
  89.  
  90. endpcs()
  91. {
  92.     REG BKPTR    bkptr;
  93.     IF pid
  94.     THEN ptrace(EXIT,pid,0,0); pid=0; userpc=1;
  95.          FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  96.          DO IF bkptr->flag
  97.         THEN bkptr->flag=BKPTSET;
  98.         FI
  99.          OD
  100.     FI
  101. }
  102.  
  103. setup()
  104. {
  105.     close(fsym); fsym = -1;
  106.     IF (pid = fork()) == 0
  107.     THEN ptrace(SETTRC,0,0,0);
  108.          signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
  109.          doexec(); exit(0);
  110.     ELIF pid == -1
  111.     THEN error(NOFORK);
  112.     ELSE bpwait(); readregs(); lp[0]=EOR; lp[1]=0;
  113.          fsym=open(symfil,wtflag);
  114.          IF errflg
  115.          THEN printf("%s: cannot execute\n",symfil);
  116.           endpcs(); error(0);
  117.          FI
  118.     FI
  119. }
  120.  
  121. execbkpt(bkptr)
  122. BKPTR    bkptr;
  123. {    INT        bkptloc;
  124. #ifdef DEBUG
  125.     printf("exbkpt: %d\n",bkptr->count);
  126. #endif
  127.     bkptloc = bkptr->loc;
  128.     ptrace(WIUSER,pid,bkptloc,bkptr->ins);
  129.     stty(0,&usrtty);
  130.     ptrace(SINGLE,pid,bkptloc,0);
  131.     bpwait(); chkerr();
  132.     ptrace(WIUSER,pid,bkptloc,BPT);
  133.     bkptr->flag=BKPTSET;
  134. }
  135.  
  136.  
  137. doexec()
  138. {
  139.     STRING        argl[MAXARG];
  140.     CHAR        args[LINSIZ];
  141.     STRING        p, *ap, filnam;
  142.     ap=argl; p=args;
  143.     *ap++=symfil;
  144.     REP    IF rdc()==EOR THEN break; FI
  145.         *ap = p;
  146.         WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB DO *p++=lastc; readchar(); OD
  147.         *p++=0; filnam = *ap+1;
  148.         IF **ap=='<'
  149.         THEN    close(0);
  150.             IF open(filnam,0)<0
  151.             THEN    printf("%s: cannot open\n",filnam); exit(0);
  152.             FI
  153.         ELIF **ap=='>'
  154.         THEN    close(1);
  155.             IF creat(filnam,0666)<0
  156.             THEN    printf("%s: cannot create\n",filnam); exit(0);
  157.             FI
  158.         ELSE    ap++;
  159.         FI
  160.     PER lastc!=EOR DONE
  161.     *ap++=0;
  162.     execv(symfil, argl);
  163. }
  164.  
  165. BKPTR    scanbkpt(adr)
  166. {
  167.     REG BKPTR    bkptr;
  168.     FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  169.     DO IF bkptr->flag ANDF bkptr->loc==adr
  170.        THEN break;
  171.        FI
  172.     OD
  173.     return(bkptr);
  174. }
  175.  
  176. delbp()
  177. {
  178.     REG INT        a;
  179.     REG BKPTR    bkptr;
  180.     FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  181.     DO IF bkptr->flag
  182.        THEN a=bkptr->loc;
  183.         ptrace(WIUSER,pid,a,bkptr->ins);
  184.        FI
  185.     OD
  186. }
  187.  
  188. setbp()
  189. {
  190.     REG INT        a;
  191.     REG BKPTR    bkptr;
  192.  
  193.     FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  194.     DO IF bkptr->flag
  195.        THEN a = bkptr->loc;
  196.         bkptr->ins = ptrace(RIUSER, pid, a, 0);
  197.         ptrace(WIUSER, pid, a, BPT);
  198.         IF errno
  199.         THEN prints("cannot set breakpoint: ");
  200.              psymoff(leng(bkptr->loc),ISYM,"\n");
  201.         FI
  202.        FI
  203.     OD
  204. }
  205.  
  206. bpwait()
  207. {
  208.     REG INT w;
  209.     INT stat;
  210.  
  211.     signal(SIGINT, 1);
  212.     WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE
  213.     signal(SIGINT,sigint);
  214.     gtty(0,&usrtty);
  215.     stty(0,&adbtty);
  216.     IF w == -1
  217.     THEN pid=0;
  218.          errflg=BADWAIT;
  219.     ELIF (stat & 0177) != 0177
  220.     THEN IF signo = stat&0177
  221.          THEN sigprint();
  222.          FI
  223.          IF stat&0200
  224.          THEN prints(" - core dumped");
  225.           close(fcor);
  226.           setcor();
  227.          FI
  228.          pid=0;
  229.          errflg=ENDPCS;
  230.     ELSE signo = stat>>8;
  231.          IF signo!=SIGTRC
  232.          THEN sigprint();
  233.          ELSE signo=0;
  234.          FI
  235.          flushbuf();
  236.     FI
  237. }
  238.  
  239. readregs()
  240. {
  241.     /*get REG values from pcs*/
  242.     REG i;
  243.     FOR i=0; i<9; i++
  244.     DO endhdr[reglist[i].roffs] =
  245.             ptrace(RUREGS, pid, 2*(512+reglist[i].roffs), 0);
  246.     OD
  247.  
  248.     /* REALing poINT        */
  249.     FOR i=FROFF; i<FRLEN+FROFF; i++
  250.     DO corhdr[i] = ptrace(RUREGS,pid,i,0); OD
  251. }
  252.  
  253.  
  254.