Annotation of coherent/d/bin/db/trace1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * A debugger.
                      3:  * Initialisation, command line parsing.
                      4:  */
                      5: #include <stdio.h>
                      6: #include <ctype.h>
                      7: #include <canon.h>
                      8: #include "trace.h"
                      9: #if NOUT
                     10: #include <n.out.h>
                     11: #else
                     12: #include <l.out.h>
                     13: #endif
                     14: #include <sys/proc.h>
                     15: #include <signal.h>
                     16: #include <sys/uproc.h>
                     17: 
                     18: main(argc, argv)
                     19: char **argv;
                     20: {
                     21:        initialise();
                     22:        setup(argc, argv);
                     23:        signal(SIGINT, &armsint);
                     24:        signal(SIGQUIT, SIG_IGN);
                     25:        process();
                     26: }
                     27: 
                     28: /*
                     29:  * Leave.
                     30:  */
                     31: leave()
                     32: {
                     33:        killc();
                     34:        exit(0);
                     35: }
                     36: 
                     37: /*
                     38:  * Initialise.
                     39:  */
                     40: initialise()
                     41: {
                     42:        register int i;
                     43: 
                     44:        for (i=0; i<NSEGM; i++)
                     45:                strcpy(&segform[i][0], "aw");
                     46:        strcpy(&segform[1][0], "ai");
                     47:        bptinit();
                     48: }
                     49: 
                     50: /*
                     51:  * Setup arguments.
                     52:  */
                     53: setup(argc, argv)
                     54: char **argv;
                     55: {
                     56:        register char *cp;
                     57:        register int c;
                     58:        register int t;
                     59:        register int u;
                     60:        register int tflag;
                     61: 
                     62:        t = '\0';
                     63:        tflag = 0;
                     64:        for (; argc>1; argc--, argv++) {
                     65:                cp = argv[1];
                     66:                if (*cp++ != '-')
                     67:                        break;
                     68:                while ((c=*cp++) != '\0') {
                     69:                        switch (c) {
                     70:                        case 'c':
                     71:                        case 'd':
                     72:                        case 'e':
                     73:                        case 'f':
                     74:                        case 'k':
                     75:                        case 'o':
                     76:                                if (t != '\0')
                     77:                                        usage();
                     78:                                t = c;
                     79:                                continue;
                     80:                        case 'h':
                     81:                                hflag = 1;
                     82:                                continue;
                     83:                        case 'r':
                     84:                                rflag = 1;
                     85:                                continue;
                     86:                        case 's':
                     87:                                sflag = 1;
                     88:                                continue;
                     89:                        case 't':
                     90:                                tflag = 1;
                     91:                                continue;
                     92:                        default:
                     93:                                usage();
                     94:                        }
                     95:                }
                     96:        }
                     97:        switch (t) {
                     98:        case '\0':
                     99:                switch (argc) {
                    100:                case 1:
                    101:                        setlout("l.out", 3);
                    102:                        setcore("core");
                    103:                        break;
                    104:                case 2:
                    105:                        setlout(argv[1], 3);
                    106:                        break;
                    107:                case 3:
                    108:                        setlout(argv[1], 3);
                    109:                        setcore(argv[2]);
                    110:                        break;
                    111:                default:
                    112:                        usage();
                    113:                }
                    114:                break;
                    115:        case 'c':
                    116:                switch (argc) {
                    117:                case 1:
                    118:                        setlout("l.out", 3);
                    119:                        setcore("core");
                    120:                        break;
                    121:                case 2:
                    122:                        setcore(argv[1]);
                    123:                        break;
                    124:                case 3:
                    125:                        setlout(argv[1], 3);
                    126:                        setcore(argv[2]);
                    127:                        break;
                    128:                default:
                    129:                        usage();
                    130:                }
                    131:                break;
                    132:        case 'd':
                    133:                switch (argc) {
                    134:                case 1:
                    135:                        setlout("/coherent", 3);
                    136:                        setdump("/dev/dump");
                    137:                        break;
                    138:                case 3:
                    139:                        setlout(argv[1], 3);
                    140:                        setdump(argv[2]);
                    141:                        break;
                    142:                default:
                    143:                        usage();
                    144:                }
                    145:                break;
                    146:        case 'e':
                    147:                if (argc < 2)
                    148:                        usage();
                    149:                setlout(argv[1], 3);
                    150:                if (startup(&argv[1], NULL, NULL, 0)==0 || shiftup()==0)
                    151:                        leave();
                    152:                break;
                    153:        case 'f':
                    154:                fflag = 1;
                    155:                switch (argc) {
                    156:                case 2:
                    157:                        setfile(argv[1]);
                    158:                        break;
                    159:                case 3:
                    160:                        setlout(argv[1], 1);
                    161:                        setfile(argv[2]);
                    162:                        break;
                    163:                default:
                    164:                        usage();
                    165:                }
                    166:                break;
                    167:        case 'k':
                    168:                switch (argc) {
                    169:                case 1:
                    170:                        setlout("/coherent", 1);
                    171:                        setkmem("/dev/mem");
                    172:                        break;
                    173:                case 2:
                    174:                        setkmem(argv[1]);
                    175:                        break;
                    176:                case 3:
                    177:                        setlout(argv[1], 1);
                    178:                        setkmem(argv[2]);
                    179:                        break;
                    180:                default:
                    181:                        usage();
                    182:                }
                    183:                break;
                    184:        case 'o':
                    185:                switch (argc) {
                    186:                case 1:
                    187:                        setlout("l.out", 3);
                    188:                        break;
                    189:                case 2:
                    190:                        setlout(argv[1], 3);
                    191:                        break;
                    192:                case 3:
                    193:                        setlout(argv[1], 1);
                    194:                        setlout(argv[2], 2);
                    195:                        break;
                    196:                default:
                    197:                        usage();
                    198:                }
                    199:        }
                    200:        if (tflag) {
                    201:                if ((u=open("/dev/tty", 2)) < 0)
                    202:                        panic("Cannot open /dev/tty");
                    203:                dup2(u, 0);
                    204:                dup2(u, 1);
                    205:                dup2(u, 2);
                    206:        }
                    207: }
                    208: 
                    209: /*
                    210:  * Generate a usage message.
                    211:  */
                    212: usage()
                    213: {
                    214:        panic("Usage: db [-cdefort] [object file] [auxiliary file]");
                    215: }
                    216: 
                    217: /*
                    218:  * Catch and flag interrupts.
                    219:  */
                    220: armsint()
                    221: {
                    222:        signal(SIGINT, &armsint);
                    223:        intflag++;
                    224: }
                    225: 
                    226: /*
                    227:  * Check for interrupts and clear flag.
                    228:  */
                    229: testint()
                    230: {
                    231:        register int n;
                    232: 
                    233:        if ((n=intflag) != 0)
                    234:                printe("Interrupt");
                    235:        intflag = 0;
                    236:        return (n);
                    237: }
                    238: 
                    239: /*
                    240:  * Assume the file, `np', is the name of an l.out.  If the bottom bit
                    241:  * of the flag is set, set up the symbol table.  If the next bit is set,
                    242:  * set up segmentation for the l.out.
                    243:  */
                    244: setlout(np, f)
                    245: char *np;
                    246: {
                    247:        struct ldheader ldh;
                    248: 
                    249:        lfp = openfil(np, (f&2) ? rflag : 1);
                    250:        if (fread(&ldh, sizeof(ldh), 1, lfp) != 1)
                    251:                panic("Cannot read object file");
                    252:        canlout(&ldh);
                    253:        if (ldh.l_magic != L_MAGIC)
                    254:                panic("Bad object file");
                    255:        objflag = 1;
                    256:        if ((f&1) != 0) {
                    257: #if NOUT
                    258:                sbase = ldh.l_tbase;
                    259: #else
                    260:                sbase = sizeof(ldh);
                    261: #endif
                    262:                sbase += ldh.l_ssize[L_SHRI] + ldh.l_ssize[L_PRVI];
                    263:                sbase += ldh.l_ssize[L_SHRD] + ldh.l_ssize[L_PRVD];
                    264:                snsym = ldh.l_ssize[L_SYM] / sizeof(struct ldsym);
                    265:                if (snsym != 0) {
                    266:                        sfp = lfp;
                    267:                        if (sflag == 0)
                    268:                                readsym(sfp);
                    269:                }
                    270:        }
                    271:        if ((f&2) != 0) {
                    272:                lfn = np;
                    273:                setaseg(&ldh);
                    274:        }
                    275: }
                    276: 
                    277: /*
                    278:  * Canonize an l.out header.
                    279:  */
                    280: canlout(ldp)
                    281: struct ldheader *ldp;
                    282: {
                    283:        register int i;
                    284: 
                    285: #if NOUT
                    286:        canshort( ldp->l_magic);
                    287:        canshort( ldp->l_flag);
                    288:        canshort( ldp->l_machine);
                    289:        canshort( ldp->l_tbase);
                    290:        canlong( ldp->l_entry);
                    291: #else
                    292:        canint( ldp->l_magic);
                    293:        canint( ldp->l_flag);
                    294:        canint( ldp->l_machine);
                    295:        canvaddr( ldp->l_entry);
                    296: #endif
                    297:        for (i=0; i<NLSEG; i++)
                    298: #if NOUT
                    299:                canlong( ldp->l_ssize[i]);
                    300: #else
                    301:                cansize( ldp->l_ssize[i]);
                    302: #endif
                    303: }
                    304: 
                    305: /*
                    306:  * Read all global symbols into memory.
                    307:  */
                    308: readsym(fp)
                    309: FILE *fp;
                    310: {
                    311:        register int n;
                    312:        register SYM *sp;
                    313:        struct ldsym lds;
                    314: 
                    315:        if ((ssymp=nalloc((int)snsym * sizeof(SYM))) == NULL)
                    316:                return;
                    317:        fseek(fp, (long)sbase, 0);
                    318:        for (n=snsym, sp=ssymp; n--; sp++) {
                    319:                if (fread(&lds, sizeof(lds), 1, fp) != 1) {
                    320:                        nfree(ssymp);
                    321:                        ssymp = NULL;
                    322:                        return;
                    323:                }
                    324: #if NOUT
                    325:                canshort( lds.ls_type);
                    326:                canlong( lds.ls_addr);
                    327: #else
                    328:                canint( lds.ls_type);
                    329:                canvaddr( lds.ls_addr);
                    330: #endif
                    331:                sp->s_hash = hash(&lds);
                    332:                sp->s_type = lds.ls_type;
                    333:                sp->s_sval = lds.ls_addr;
                    334:        }
                    335: }
                    336: 
                    337: /*
                    338:  * Hash a symbol name.
                    339:  */
                    340: hash(ldp)
                    341: struct ldsym *ldp;
                    342: {
                    343:        register int h, n;
                    344:        register char *cp;
                    345: 
                    346:        h = 0;
                    347:        n = CCSSIZE;
                    348:        cp = ldp->ls_id;
                    349:        do {
                    350:                if (*cp != '_')
                    351:                        h += *cp;
                    352:                if (*cp++ == '\0')
                    353:                        break;
                    354:        } while (--n);
                    355:        return (h&0377);
                    356: }
                    357: 
                    358: /*
                    359:  * Set up segmentation for a core dump.  The registers are also read.
                    360:  */
                    361: 
                    362: MAP *
                    363: smapc( next, start, length, foffs)
                    364: MAP    *next;
                    365: register tvaddr start;
                    366: fsize_t        length, foffs;
                    367: {
                    368:        return( setsmap( next, start, addr( size( start) + length) - start,
                    369:                        foffs, getf, putf, 1));
                    370: }
                    371: setcore(np)
                    372: char *np;
                    373: {
                    374:        register unsigned i;
                    375:        register MAP *mp;
                    376:        register char *cp;
                    377:        register char *lcp;
                    378:        register fsize_t siz;
                    379:        register fsize_t offt;
                    380:        char ucomm[10];
                    381:        SR usegs[NUSEG];
                    382: 
                    383:        cfp = openfil(np, rflag);
                    384:        fseek(cfp, (long)offset(uproc, u_comm[0]), 0);
                    385:        if ((cp=lfn)!=NULL && fread(ucomm, sizeof(ucomm), 1, cfp)==1) {
                    386:                lcp = cp;
                    387:                while (*cp) {
                    388:                        if (*cp++ == '/')
                    389:                                lcp = cp;
                    390:                }
                    391:                if (strncmp(lcp, ucomm, sizeof(ucomm)) != 0)
                    392:                        printr("Core different from object");
                    393:        }
                    394:        fseek(cfp, (long)offset(uproc, u_segl[0]), 0);
                    395:        if (fread(usegs, sizeof(usegs), 1, cfp) != 1)
                    396:                panic("Bad core file");
                    397:        USPACE = setsmap(NULL, (fsize_t)0, (fsize_t)UPASIZE, (fsize_t)0,
                    398:                        getf, putf, 1);
                    399:        mp = clrsmap(DSPACE, endpure);
                    400:        offt = usegs[0].sr_size;
                    401:        for (i=1; i<NUSEG; i++) {
                    402:                if (usegs[i].sr_segp == NULL)
                    403:                        continue;
                    404:                if ((~usegs[i].sr_flag) & (SRFDUMP|SRFPMAP))
                    405:                        continue;
                    406:                siz = usegs[i].sr_size;
                    407:                mp = smapc(mp, usegs[i].sr_base, siz, offt);
                    408:                offt += siz;
                    409:        }
                    410:        if (ISPACE == DSPACE)
                    411:                ISPACE = mp;
                    412:        DSPACE = mp;
                    413:        settrap();
                    414:        setregs();
                    415: }
                    416: 
                    417: /*
                    418:  * Find out fault type.
                    419:  */
                    420: settrap()
                    421: {
                    422:        int f;
                    423: 
                    424:        trapstr = "???";
                    425: #if PDP11
                    426:        add = 0724;                     /* old pdp11 cohos differs from src */
                    427: #else
                    428:        add = offset(uproc, u_signo);
                    429: #endif
                    430:        if (getb(2, (char *)&f, sizeof(f)) == 0) {
                    431:                printr("Cannot read fault type");
                    432:                return (0);
                    433:        }
                    434:        if (f<=0 || f>NSIG) {
                    435:                printr("Bad fault type");
                    436:                return (0);
                    437:        }
                    438:        trapstr = signame[f-1];
                    439:        return (f);
                    440: }
                    441: 
                    442: /*
                    443:  * Set up segmentation for an ordinary file.
                    444:  * This is really easy.
                    445:  */
                    446: setfile(np)
                    447: char *np;
                    448: {
                    449:        lfp = openfil(np, rflag);
                    450:        DSPACE = setsmap(NULL, (fsize_t)0, (fsize_t)LI, (fsize_t)0,
                    451:                getf, putf, 0);
                    452:        ISPACE = DSPACE;
                    453: }
                    454: 
                    455: /*
                    456:  * Open the given file.  If `rflag' is set, the file is opened for
                    457:  * read only.
                    458:  */
                    459: FILE *
                    460: openfil(np, rflag)
                    461: char *np;
                    462: {
                    463:        register FILE *fp;
                    464: 
                    465:        if (rflag) {
                    466:                if ((fp=fopen(np, "r")) != NULL)
                    467:                        return (fp);
                    468:        } else {
                    469:                if ((fp=fopen(np, "r+w")) != NULL)
                    470:                        return (fp);
                    471:                if ((fp=fopen(np, "r")) != NULL) {
                    472:                        printr("%s: opened read only", np);
                    473:                        return (fp);
                    474:                }
                    475:        }
                    476:        panic("Cannot open %s", np);
                    477: }
                    478: 
                    479: /*
                    480:  * Initialise an element of a segment map.
                    481:  */
                    482: MAP *
                    483: setsmap(next, base, siz, offt, getf, putf, segi)
                    484: MAP *next;
                    485: fsize_t base;
                    486: fsize_t siz;
                    487: fsize_t offt;
                    488: int (*getf)();
                    489: int (*putf)();
                    490: {
                    491:        register MAP *mp;
                    492: 
                    493:        mp = (MAP *)nalloc(sizeof(MAP));
                    494:        mp->m_next = next;
                    495:        mp->m_base = base;
                    496:        mp->m_bend = base+siz;
                    497:        mp->m_offt = offt;
                    498:        mp->m_getf = getf;
                    499:        mp->m_putf = putf;
                    500:        mp->m_segi = segi;
                    501:        return (mp);
                    502: }
                    503: 
                    504: /*
                    505:  * Clear a section of a segment map.
                    506:  */
                    507: MAP *
                    508: clrsmap(mp, np)
                    509: register MAP *mp;
                    510: register MAP *np;
                    511: {
                    512:        while (mp != np) {
                    513:                nfree(mp);
                    514:                mp = mp->m_next;
                    515:        }
                    516:        return (mp);
                    517: }
                    518: 
                    519: /*
                    520:  * Clear all maps.
                    521:  */
                    522: clramap()
                    523: {
                    524:        register int n;
                    525: 
                    526:        n = 0;
                    527:        if (segmapl[0] == segmapl[1])
                    528:                segmapl[n++] = NULL;
                    529:        while (n < NSEGM) {
                    530:                segmapl[n] = clrsmap(segmapl[n], NULL);
                    531:                n++;
                    532:        }
                    533: }
                    534: 

unix.superglobalmegacorp.com

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