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

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        LONGFIL;
  12. MSG        NOTOPEN;
  13. MSG        A68BAD;
  14. MSG        A68LNK;
  15. MSG        BADMOD;
  16.  
  17. MAP        txtmap;
  18. MAP        datmap;
  19.  
  20. SYMTAB        symbol;
  21. INT        lastframe;
  22. INT        callpc;
  23.  
  24. INT        infile;
  25. INT        outfile;
  26. CHAR        *lp;
  27. INT        maxoff;
  28. INT        maxpos;
  29. INT        octal;
  30.  
  31. /* symbol management */
  32. L_INT        localval;
  33.  
  34. /* breakpoints */
  35. BKPTR        bkpthead;
  36.  
  37. REGLIST reglist [] {
  38.         "ps", ps,
  39.         "pc", pc,
  40.         "sp", sp,
  41.         "r5", r5,
  42.         "r4", r4,
  43.         "r3", r3,
  44.         "r2", r2,
  45.         "r1", r1,
  46.         "r0", r0,
  47. };
  48.  
  49. INT        frnames[] { 0, 3, 4, 5, 1, 2 };
  50.  
  51. char        lastc;
  52. POS        corhdr[];
  53. POS        *endhdr;
  54.  
  55. INT        fcor;
  56. STRING        errflg;
  57. INT        signo;
  58.  
  59.  
  60. L_INT        dot;
  61. L_INT        var[];
  62. STRING        symfil;
  63. STRING        corfil;
  64. INT        pid;
  65. L_INT        adrval;
  66. INT        adrflg;
  67. L_INT        cntval;
  68. INT        cntflg;
  69.  
  70. STRING        signals[] {
  71.         "",
  72.         "hangup",
  73.         "interrupt",
  74.         "quit",
  75.         "illegal instruction",
  76.         "trace/BPT",
  77.         "IOT",
  78.         "EMT",
  79.         "floating exception",
  80.         "killed",
  81.         "bus error",
  82.         "memory fault",
  83.         "bad system call",
  84.         "broken pipe",
  85.         "alarm call",
  86.         "terminated",
  87. };
  88.  
  89.  
  90.  
  91.  
  92. /* general printing routines ($) */
  93.  
  94. printtrace(modif)
  95. {
  96.     INT        narg, i, stat, name, limit;
  97.     POS        dynam;
  98.     REG BKPTR    bkptr;
  99.     CHAR        hi, lo;
  100.     INT        word;
  101.     STRING        comptr;
  102.     L_INT        argp, frame, link;
  103.     SYMPTR        symp;
  104.  
  105.     IF cntflg==0 THEN cntval = -1; FI
  106.  
  107.     switch (modif) {
  108.  
  109.         case '<':
  110.         case '>':
  111.         {CHAR        file[64];
  112.         INT        index;
  113.  
  114.         index=0;
  115.         IF modif=='<'
  116.         THEN    iclose();
  117.         ELSE    oclose();
  118.         FI
  119.         IF rdc()!=EOR
  120.         THEN    REP file[index++]=lastc;
  121.                 IF index>=63 THEN error(LONGFIL); FI
  122.             PER readchar()!=EOR DONE
  123.             file[index]=0;
  124.             IF modif=='<'
  125.             THEN    infile=open(file,0);
  126.                 IF infile<0
  127.                 THEN    infile=0; error(NOTOPEN);
  128.                 FI
  129.             ELSE    outfile=open(file,1);
  130.                 IF outfile<0
  131.                 THEN    outfile=creat(file,0644);
  132.                 ELSE    lseek(outfile,0L,2);
  133.                 FI
  134.             FI
  135.  
  136.         FI
  137.         lp--;
  138.         }
  139.         break;
  140.  
  141.         case 'o':
  142.         octal = TRUE; break;
  143.  
  144.         case 'd':
  145.         octal = FALSE; break;
  146.  
  147.         case 'q': case 'Q': case '%':
  148.         done();
  149.  
  150.         case 'w': case 'W':
  151.         maxpos=(adrflg?adrval:MAXPOS);
  152.         break;
  153.  
  154.         case 's': case 'S':
  155.         maxoff=(adrflg?adrval:MAXOFF);
  156.         break;
  157.  
  158.         case 'v': case 'V':
  159.         prints("variables\n");
  160.         FOR i=0;i<=35;i++
  161.         DO IF var[i]
  162.            THEN printc((i<=9 ? '0' : 'a'-10) + i);
  163.             printf(" = %Q\n",var[i]);
  164.            FI
  165.         OD
  166.         break;
  167.  
  168.         case 'm': case 'M':
  169.         printmap("? map",&txtmap);
  170.         printmap("/ map",&datmap);
  171.         break;
  172.  
  173.         case 0: case '?':
  174.         IF pid
  175.         THEN printf("pcs id = %d\n",pid);
  176.         ELSE prints("no process\n");
  177.         FI
  178.         sigprint(); flushbuf();
  179.  
  180.         case 'r': case 'R':
  181.         printregs();
  182.         return;
  183.  
  184.         case 'f': case 'F':
  185.         printfregs(modif=='F');
  186.         return;
  187.  
  188.         case 'c': case 'C':
  189.         frame=(adrflg?adrval:endhdr[r5])&EVEN; lastframe=0;
  190.         callpc=(adrflg?get(frame+2,DSP):endhdr[pc]);
  191.         WHILE cntval--
  192.         DO    chkerr();
  193.             narg = findroutine(frame);
  194.             printf("%.8s(", symbol.symc);
  195.             argp = frame+4;
  196.             IF --narg >= 0
  197.             THEN    printf("%o", get(argp, DSP));
  198.             FI
  199.             WHILE --narg >= 0
  200.             DO    argp += 2;
  201.                 printf(",%o", get(argp, DSP));
  202.             OD
  203.             prints(")\n");
  204.  
  205.             IF modif=='C'
  206.             THEN WHILE localsym(frame)
  207.                  DO word=get(localval,DSP);
  208.                 printf("%8t%.8s:%10t", symbol.symc);
  209.                 IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%o\n",word); FI
  210.                  OD
  211.             FI
  212.  
  213.             lastframe=frame;
  214.             frame=get(frame, DSP)&EVEN;
  215.             IF frame==0 THEN break; FI
  216.         OD
  217.         break;
  218.  
  219.         /*print externals*/
  220.         case 'e': case 'E':
  221.         symset();
  222.         WHILE (symp=symget())
  223.         DO chkerr();
  224.            IF (symp->symf)==043 ORF (symp->symf)==044
  225.            THEN printf("%.8s:%12t%o\n", symp->symc, get(leng(symp->symv),DSP));
  226.            FI
  227.         OD
  228.         break;
  229.  
  230.         case 'a': case 'A':
  231.         frame=(adrflg ? adrval : endhdr[r4]);
  232.  
  233.         WHILE cntval--
  234.         DO chkerr();
  235.            stat=get(frame,DSP); dynam=get(frame+2,DSP); link=get(frame+4,DSP);
  236.            IF modif=='A'
  237.            THEN printf("%8O:%8t%-8o,%-8o,%-8o",frame,stat,dynam,link);
  238.            FI
  239.            IF stat==1 THEN break; FI
  240.            IF errflg THEN error(A68BAD); FI
  241.  
  242.            IF get(link-4,ISP)!=04767
  243.            THEN IF get(link-2,ISP)!=04775
  244.             THEN error(A68LNK);
  245.             ELSE /*compute entry point of routine*/
  246.                  prints(" ? ");
  247.             FI
  248.            ELSE printf("%8t");
  249.                 valpr(name=shorten(link)+get(link-2,ISP),ISYM);
  250.             name=get(leng(name-2),ISP);
  251.             printf("%8t\""); limit=8;
  252.             REP word=get(leng(name),DSP); name += 2;
  253.                 lo=word&LOBYTE; hi=(word>>8)&LOBYTE;
  254.                 printc(lo); printc(hi);
  255.             PER lo ANDF hi ANDF limit-- DONE
  256.             printc('"');
  257.            FI
  258.            limit=4; i=6; printf("%24targs:%8t");
  259.            WHILE limit--
  260.            DO printf("%8t%o",get(frame+i,DSP)); i += 2; OD
  261.            printc(EOR);
  262.  
  263.            frame=dynam;
  264.         OD
  265.         errflg=0;
  266.         flushbuf();
  267.         break;
  268.  
  269.         /*set default c frame*/
  270.         /*print breakpoints*/
  271.         case 'b': case 'B':
  272.         printf("breakpoints\ncount%8tbkpt%24tcommand\n");
  273.         FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  274.         DO IF bkptr->flag
  275.            THEN printf("%-8.8d",bkptr->count);
  276.             psymoff(leng(bkptr->loc),ISYM,"%24t");
  277.             comptr=bkptr->comm;
  278.             WHILE *comptr DO printc(*comptr++); OD
  279.            FI
  280.         OD
  281.         break;
  282.  
  283.         default: error(BADMOD);
  284.     }
  285.  
  286. }
  287.  
  288. printmap(s,amap)
  289. STRING    s; MAP *amap;
  290. {
  291.     int file;
  292.     file=amap->ufd;
  293.     printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
  294.     printf("b1 = %-16Q",amap->b1);
  295.     printf("e1 = %-16Q",amap->e1);
  296.     printf("f1 = %-16Q",amap->f1);
  297.     printf("\nb2 = %-16Q",amap->b2);
  298.     printf("e2 = %-16Q",amap->e2);
  299.     printf("f2 = %-16Q",amap->f2);
  300.     printc(EOR);
  301. }
  302.  
  303. printfregs(longpr)
  304. {
  305.     REG i;
  306.     L_REAL f;
  307.  
  308.     printf("fpsr    %o\n", corhdr[0].fpsr);
  309.     FOR i=0; i<FRMAX; i++
  310.     DO    IF corhdr[0].fpsr&FD ORF longpr    /* long mode */
  311.         THEN    f = corhdr[0].Lfr[frnames[i]];
  312.         ELSE    f = corhdr[0].Sfr[frnames[i]];
  313.         FI
  314.         printf("fr%-8d%-32.18f\n", i, f);
  315.     OD
  316. }
  317.  
  318. printregs()
  319. {
  320.     REG REGPTR    p;
  321.     INT        v;
  322.  
  323.     FOR p=reglist; p < ®list[9]; p++
  324.     DO    printf("%s%8t%o%8t", p->rname, v=endhdr[p->roffs]);
  325.         valpr(v,(p->roffs==pc?ISYM:DSYM));
  326.         printc(EOR);
  327.     OD
  328.     printpc();
  329. }
  330.  
  331. getreg(regnam)
  332. {
  333.     REG REGPTR    p;
  334.     REG STRING    regptr;
  335.     CHAR        regnxt;
  336.     regnxt=readchar();
  337.     FOR p=reglist; p<®list[9]; p++
  338.     DO    regptr=p->rname;
  339.         IF (regnam == *regptr++) ANDF (regnxt == *regptr)
  340.         THEN    return(p->roffs);
  341.         FI
  342.     OD
  343.     lp--;
  344.     return(0);
  345. }
  346.  
  347. printpc()
  348. {
  349.     dot=endhdr[pc];
  350.     psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
  351.     printc(EOR);
  352. }
  353.  
  354. sigprint()
  355. {
  356.     prints(signals[signo]);
  357. }
  358.  
  359.