Annotation of coherent/d/bin/db/trace4.c, revision 1.1

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

unix.superglobalmegacorp.com

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