Annotation of coherent/b/bin/db_400/trace4.c, revision 1.1.1.1

1.1       root        1: /* $Header: /src386/bin/db/RCS/trace4.c,v 1.2 93/03/11 07:46:10 bin Exp Locker: bin $
                      2:  *
                      3:  *     The information contained herein is a trade secret of Mark Williams
                      4:  *     Company, and  is confidential information.  It is provided  under a
                      5:  *     license agreement,  and may be  copied or disclosed  only under the
                      6:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      7:  *     material without the express written authorization of Mark Williams
                      8:  *     Company or persuant to the license agreement is unlawful.
                      9:  *
                     10:  *     COHERENT Version 2.3.35
                     11:  *     Copyright (c) 1982, 1983, 1984.
                     12:  *     An unpublished work by Mark Williams Company, Chicago.
                     13:  *     All rights reserved.
                     14:  *
                     15:  * Command analyser.
                     16:  */
                     17: 
                     18: #include <stdio.h>
                     19: #include <l.out.h>
                     20: #include "trace.h"
                     21: 
                     22: /*
                     23:  * Execute a command.
                     24:  * Return true if more commands may be read.
                     25:  */
                     26: command(vp)
                     27: register VAL *vp;
                     28: {
                     29:        register int c;
                     30:        register int n;
                     31: 
                     32:        switch (c=getn()) {
                     33:        case '=':
                     34:                if (newline() == 0)
                     35:                        break;
                     36:                printx("%lo\n", rvalue(vp, (long)dot));
                     37:                return 1;
                     38:        case '?':
                     39:                if (newline() == 0)
                     40:                        break;
                     41:                if (errrstr != NULL)
                     42:                        printx("%s\n", errrstr);
                     43:                return 1;
                     44:        case 'a':
                     45:                if (newline() == 0)
                     46:                        break;
                     47:                putaddr(vsegno(vp, -1), lvalue(vp, (long)dot), I);
                     48:                putx('\n');
                     49:                return 1;
                     50:        case 'b':
                     51:                if (objflag == 0)
                     52:                        break;
                     53:                if ((c=getn()) != 'r') {
                     54:                        ungetn(c);
                     55:                        c = 'b';
                     56:                }
                     57:                getline("i+.:a\ni+.?i\n:x");
                     58:                n = setubpt(c, (caddr_t)lvalue(vp, (long)dot), miscbuf);
                     59:                if (n == 0)
                     60:                        printe("Cannot set breakpoint");
                     61:                return 1;
                     62:        case 'c':
                     63:                if (newline() == 0)
                     64:                        break;
                     65:                else
                     66:                        c = '\n';
                     67:                if (excflag == 0)
                     68:                        break;
                     69:                if (nvalue(vp) == 0)
                     70:                        setpc((caddr_t)lvalue(vp, (long)0));
                     71:                sinmode = SNULL;
                     72:                return 0;
                     73:        case 'd':
                     74:                if (objflag == 0)
                     75:                        break;
                     76:                if ((c=getn())!='r' && c!='s') {
                     77:                        ungetn(c);
                     78:                        c = 'b';
                     79:                }
                     80:                if (newline() == 0)
                     81:                        break;
                     82:                if (delubpt(c, (caddr_t)lvalue(vp, (long)dot)) == 0)
                     83:                        printe("Cannot delete breakpoint");
                     84:                return 1;
                     85:        case 'e':
                     86:                if (nvalue(vp) == 0) {
                     87:                        setpc((caddr_t)lvalue(vp, (long)0));
                     88:                }
                     89:                getline("");
                     90:                return(runfile());
                     91:        case 'f':
                     92:                if (newline() == 0)
                     93:                        break;
                     94:                printx("%s\n", trapstr!=NULL ? trapstr : "No fault");
                     95:                return 1;
                     96:        case 'k':
                     97:                if (excflag == 0)
                     98:                        break;
                     99:                if (newline() == 0)
                    100:                        break;
                    101:                if (nvalue(vp) != 0) {
                    102:                        printe("No signal specified");
                    103:                        return 1;
                    104:                }
                    105:                printr("Cannot send %d", (int)rvalue(vp, (long)0));
                    106:                return 1;
                    107:        case 'm':
                    108:                if (newline() == 0)
                    109:                        break;
                    110:                dispmap();
                    111:                return 1;
                    112:        case 'o':
                    113:                if (newline() == 0)
                    114:                        break;
                    115:                cantype = rvalue(vp, (long)0);
                    116:                return 1;
                    117:        case 'p':
                    118:                if (newline() == 0)
                    119:                        break;
                    120:                dispbpt();
                    121:                return 1;
                    122:        case 'q':
                    123:                if (newline() == 0)
                    124:                        break;
                    125:                if (rvalue(vp, (long)1))
                    126:                        leave();
                    127:                return 1;
                    128:        case 'r':
                    129:                if (newline() == 0)
                    130:                        break;
                    131:                else
                    132:                        c = '\n';
                    133:                if (regflag == 0)
                    134:                        break;
                    135:                dispreg();
                    136:                return 1;
                    137:        case 's':
                    138:                if (excflag == 0)
                    139:                        break;
                    140:                if (nvalue(vp) == 0)
                    141:                        setpc((caddr_t)lvalue(vp, (long)0));
                    142:                sindecr = rvalue(&vp[1], (long)1);
                    143:                sinmode = SCONT;
                    144:                if ((c=getn()) != 'c') {
                    145:                        sinmode = SSTEP;
                    146:                        ungetn(c);
                    147:                }
                    148:                getline("i+.?i");
                    149:                sinp = savecom(sinp, miscbuf);
                    150:                return 0;
                    151:        case 't':
                    152:                if (newline() == 0)
                    153:                        break;
                    154:                else
                    155:                        c = '\n';
                    156:                if (regflag == 0)
                    157:                        break;
                    158:                dispsbt((int)rvalue(vp, (long)0));
                    159:                return 1;
                    160:        case 'x':
                    161:                if (newline() == 0)
                    162:                        break;
                    163:                if (rvalue(vp, (long)1)) {
                    164:                        sincmod = sinmode;
                    165:                        sinmode = SNULL;
                    166:                        addfilp(stdin);
                    167:                }
                    168:                return 1;
                    169:        }
                    170:        printe("Illegal command");
                    171:        while (c != '\n')
                    172:                c = getn();
                    173:        return 1;
                    174: }
                    175: 
                    176: /*
                    177:  * If the next character is a newline, return 1, else 0.
                    178:  */
                    179: newline()
                    180: {
                    181:        return (getn()=='\n');
                    182: }
                    183: 
                    184: /*
                    185:  * Given a pointer to an allocated buffer and a pointer to a
                    186:  * command string, copy the command string in the allocated
                    187:  * buffer.  If the allocated buffer hasn't been allocated,
                    188:  * allocate it.
                    189:  */
                    190: savecom(bp, sp)
                    191: register char *bp;
                    192: register char *sp;
                    193: {
                    194:        register char *cp;
                    195: 
                    196:        if (bp == NULL)
                    197:                bp = nalloc(COMSIZE);
                    198:        cp = bp;
                    199:        while (*sp) {
                    200:                if (cp >= &bp[COMSIZE-1])
                    201:                        break;
                    202:                *cp++ = *sp++;
                    203:        }
                    204:        *cp++ = '\0';
                    205:        return (bp);
                    206: }
                    207: 
                    208: /*
                    209:  * Initialize breakpoint table.
                    210:  */
                    211: bptinit()
                    212: {
                    213:        register BPT *bp;
                    214:        register int n;
                    215: 
                    216:        for (n=NBPT, bp=bpt; --n; bp++) {
                    217:                bp->b_flag = 0;
                    218:                bp->b_bcom = NULL;
                    219:                bp->b_rcom = NULL;
                    220:        }
                    221: }
                    222: 
                    223: /*
                    224:  * Set a breakpoint (user callable).  If the type is 'b', a regular
                    225:  * breakpoint.  If it is 'r', a return breakpoint.
                    226:  */
                    227: setubpt(t, a, cp)
                    228: caddr_t a;
                    229: char *cp;
                    230: {
                    231:        register unsigned n;
                    232:        caddr_t pc;
                    233:        caddr_t fp;
                    234: 
                    235:        if (t == 'b')
                    236:                n = setibpt(BBPT, a, (caddr_t)0, cp);
                    237:        else {
                    238:                setretf(&pc, &fp);
                    239:                n = setibpt(BRET, pc, fp, cp);
                    240:        }
                    241:        return (n);
                    242: }
                    243: 
                    244: /*
                    245:  * Set a breakpoint (internal routine).
                    246:  */
                    247: setibpt(f, a, fp, cp)
                    248: caddr_t a;
                    249: caddr_t fp;
                    250: char *cp;
                    251: {
                    252:        register BPT *bp;
                    253:        register int n;
                    254:        int w;
                    255: 
                    256:        /* make sure "a" is a valid text address (value fetched is ignored) */
                    257:        add = (long)a;
                    258:        if(getb(ISEG, &w, sizeof(w)) == 0)
                    259:                return 0;
                    260: 
                    261:        /* look for existing breakpoint at same address */
                    262:        for (n=NBPT, bp=&bpt[0]; --n; bp++) {
                    263:                if (bp->b_flag && bp->b_badd==a)
                    264:                        goto out;
                    265:        }
                    266: 
                    267:        /* look for unused breakpoint */
                    268:        for (n=NBPT, bp=&bpt[0]; --n; bp++) {
                    269:                if (bp->b_flag == 0)
                    270:                        goto out;
                    271:        }
                    272: 
                    273:        return 0;
                    274: out:
                    275:        if (f!=BBPT && (bp->b_flag&f)!=0)
                    276:                return 0;
                    277:        bp->b_flag |= f;
                    278:        bp->b_badd = a;
                    279:        switch (f) {
                    280:        case BBPT:
                    281:                bp->b_bcom = savecom(bp->b_bcom, cp);
                    282:                break;
                    283:        case BRET:
                    284: fprintf(stderr, "case BRET\n");
                    285:                bp->b_rfpt = fp;
                    286:                bp->b_rcom = savecom(bp->b_rcom, cp);
                    287:                break;
                    288:        case BSIN:
                    289:                bp->b_sfpt = fp;
                    290:                break;
                    291:        }
                    292:        return 1;
                    293: }
                    294: 
                    295: /*
                    296:  * Delete a breakpoint.  (user callable)
                    297:  * If `r' is set, it is a return breakpoint.
                    298:  */
                    299: delubpt(t, a)
                    300: caddr_t a;
                    301: {
                    302:        register int f;
                    303: 
                    304:        switch (t) {
                    305:        case 'b':
                    306:                f = BBPT;
                    307:                break;
                    308:        case 'r':
                    309:                f = BRET;
                    310:                break;
                    311:        case 's':
                    312:                f = BSIN;
                    313:                break;
                    314:        }
                    315:        return (delibpt(f, a));
                    316: }
                    317: 
                    318: /*
                    319:  * Delete a breakpoint.  (internal routine)
                    320:  */
                    321: delibpt(f, a)
                    322: register int f;
                    323: caddr_t a;
                    324: {
                    325:        register BPT *bp;
                    326:        register int n;
                    327: 
                    328:        for (n=NBPT, bp=&bpt[0]; --n; bp++) {
                    329:                if ((bp->b_flag&f)==0 || bp->b_badd!=a)
                    330:                        continue;
                    331:                bp->b_flag &= ~f;
                    332:                return 1;
                    333:        }
                    334:        return 0;
                    335: }
                    336: 
                    337: /*
                    338:  * Display breakpoints.
                    339:  */
                    340: dispbpt()
                    341: {
                    342:        register BPT *bp;
                    343:        register int n;
                    344: 
                    345:        for (n=NBPT, bp=&bpt[0]; --n; bp++) {
                    346:                if (testint())
                    347:                        return;
                    348:                if ((bp->b_flag&BBPT) != 0)
                    349:                        putlbpt(' ', bp->b_badd, bp->b_bcom);
                    350:                if (testint())
                    351:                        return;
                    352:                if ((bp->b_flag&BRET) != 0)
                    353:                        putlbpt('r', bp->b_badd, bp->b_rcom);
                    354:                if (testint())
                    355:                        return;
                    356:                if ((bp->b_flag&BSIN) != 0)
                    357:                        putlbpt('s', bp->b_badd, "");
                    358:        }
                    359: }
                    360: 
                    361: /*
                    362:  * Print out a breakpoint address, type and command.
                    363:  */
                    364: putlbpt(t, a, cp)
                    365: caddr_t        a;
                    366: register char *cp;
                    367: {
                    368:        register int c;
                    369: 
                    370:        printx(DAFMT, (long)a);
                    371:        printx("%c (", t);
                    372:        putaddr(1, (long)a, I);
                    373:        printx(") ");
                    374:        while ((c=*cp++) != '\0') {
                    375:                if (c == '\n') {
                    376:                        printx("\\n");
                    377:                        continue;
                    378:                }
                    379:                if (c == '\\') {
                    380:                        printx("\\\\");
                    381:                        continue;
                    382:                }
                    383:                putx(c);
                    384:        }
                    385:        putx('\n');
                    386: }
                    387: 
                    388: /*
                    389:  * Print out segmentation map.
                    390:  */
                    391: dispmap()
                    392: {
                    393:        register MAP *mp;
                    394:        register int n;
                    395: 
                    396:        for (n=0; n<NSEGM; n++) {
                    397:                if ((mp=segmapl[n]) == NULL)
                    398:                        continue;
                    399:                printx("%s", segname[n]);
                    400:                while (n<NSEGM-1 && segmapl[n+1]==mp)
                    401:                        printx(" == %s", segname[++n]);
                    402:                printx("\n");
                    403:                for (; mp!=NULL; mp=mp->m_next) {
                    404:                        printx("[");
                    405:                        putmadd(mp->m_base);
                    406:                        printx(", ");
                    407:                        putmadd(mp->m_bend);
                    408:                        printx("] => ");
                    409:                        putmadd(mp->m_offt);
                    410:                        printx(" (%d)\n", mp->m_segi);
                    411:                        if (testint())
                    412:                                return;
                    413:                }
                    414:        }
                    415: }
                    416: 
                    417: /*
                    418:  * Print out a long address for segmentation map.
                    419:  */
                    420: putmadd(l)
                    421: off_t l;
                    422: {
                    423:        register int c, n;
                    424: 
                    425:        if (l!=MLI && l!=LI) {
                    426:                printx(VAFMT, l);
                    427:                return;
                    428:        }
                    429:        c = l==MLI ? '-' : '+';
                    430:        n = VAWID;
                    431:        while (n--)
                    432:                putchar(c);
                    433: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.