Annotation of coherent/b/kernel/tools/dlout.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * File:       dlout.c
                      3:  *
                      4:  * Purpose:    Display contents of l.out file intelligibly.
                      5:  *
                      6:  * $Log:       dlout.c,v $
                      7:  * Revision 1.1  93/04/16  07:01:40  bin
                      8:  * Initial revision
                      9:  * 
                     10:  */
                     11: 
                     12: /*
                     13:  * ----------------------------------------------------------------------
                     14:  * Includes.
                     15:  */
                     16: #include <canon.h>
                     17: #include <l.out.h>
                     18: #include <stdio.h>
                     19: #include <sys/reg.h>
                     20: #include <sys/uproc.h>
                     21: 
                     22: /*
                     23:  * ----------------------------------------------------------------------
                     24:  * Definitions.
                     25:  *     Constants.
                     26:  *     Macros with argument lists.
                     27:  *     Typedefs.
                     28:  *     Enums.
                     29:  */
                     30: #define DSIZE                  16
                     31: 
                     32: struct seg_info {
                     33:        int si_base;
                     34:        int si_size;
                     35:        long si_offset;
                     36: };
                     37: 
                     38: /*
                     39:  * ----------------------------------------------------------------------
                     40:  * Functions.
                     41:  *     Import Functions.
                     42:  *     Export Functions.
                     43:  *     Local Functions.
                     44:  */
                     45: 
                     46: /*
                     47:  * ----------------------------------------------------------------------
                     48:  * Global Data.
                     49:  *     Import Variables.
                     50:  *     Export Variables.
                     51:  *     Local Variables.
                     52:  */
                     53: static char * cmd;
                     54: static struct ldheader ldHead;
                     55: static char * loutName = NULL;
                     56: static FILE * fp;
                     57: static char *segName[NUSEG] = {
                     58:        "USER", "TEXT", "DATA", "STACK"
                     59: };
                     60: static struct seg_info segInfo[NUSEG];
                     61: 
                     62: /*
                     63:  * ----------------------------------------------------------------------
                     64:  * Code.
                     65:  */
                     66: 
                     67: void
                     68: usage()
                     69: {
                     70:        fprintf(stderr, "Usage: %s l.out-file\n", cmd);
                     71:        exit(1);
                     72: }
                     73: 
                     74: /*
                     75:  * Given text name and vital stats for a segment, do a hex dump.
                     76:  */
                     77: void
                     78: dumpseg(name, infop)
                     79: char *name;
                     80: struct seg_info *infop;
                     81: {
                     82:        unsigned char coredata[DSIZE];
                     83:        unsigned char savedata[DSIZE];
                     84:        int segOffset;
                     85:        int i;
                     86:        /*
                     87:         * sameState:
                     88:         * -1   just starting; don't look for matching display lines
                     89:         *  0   current line does not match previous line
                     90:         *  1   current line matches previous line
                     91:         *  2   current line matches previous 2 or more lines
                     92:         */
                     93:        int sameState = -1;
                     94:        int doPrint, match;
                     95: 
                     96:        /* make sure we can seek to start of segment */
                     97:        if (fseek(fp, infop->si_offset, 0) < 0) {
                     98:                fprintf(stderr, "Can't seek to %s segment!\n", name);
                     99:                exit(1);
                    100:        }
                    101: 
                    102:        printf("\nContents of %s segment:\n", name);
                    103:        for (segOffset = 0; segOffset < infop->si_size; segOffset += DSIZE) {
                    104:                int readLen = DSIZE;
                    105:                int remains = infop->si_size - segOffset;
                    106: 
                    107:                if (readLen > remains)
                    108:                        readLen = remains;
                    109: 
                    110:                if (fread(coredata, readLen, 1, fp) !=1) {
                    111:                        fprintf(stderr, "Can't read core data.\n");
                    112:                        exit(1);
                    113:                }
                    114: 
                    115:                /* always display last line of segment */
                    116:                if (remains <= DSIZE)
                    117:                        match = 1;
                    118:                else
                    119:                        match = memcmp(coredata, savedata, DSIZE);
                    120: 
                    121:                switch(sameState) {
                    122:                case -1:
                    123:                        sameState = 0;
                    124:                        doPrint = 1;
                    125:                        break;
                    126:                case 0:
                    127:                        if (match) {
                    128:                                doPrint = 1;
                    129:                        } else {
                    130:                                sameState = 1;
                    131:                                doPrint = 0;
                    132:                        }
                    133:                        break;
                    134:                case 1:
                    135:                        if (match) {
                    136:                                doPrint = 1;
                    137:                                sameState = 0;
                    138:                        } else {
                    139:                                sameState = 2;
                    140:                                doPrint = 0;
                    141:                                printf("   *\n");
                    142:                        }
                    143:                        break;
                    144:                case 2:
                    145:                        if (match) {
                    146:                                doPrint = 1;
                    147:                                sameState = 0;
                    148:                        } else {
                    149:                                doPrint = 0;
                    150:                        }
                    151:                        break;
                    152:                }
                    153:                if (doPrint) {
                    154:                        printf("%06X", segOffset);
                    155:                        for (i = 0; i < readLen; i++)
                    156:                                printf(" %02X", coredata[i]);
                    157:                        printf("\n");
                    158:                }
                    159:                memcpy(savedata, coredata, DSIZE);
                    160:        }
                    161: }
                    162: 
                    163: /*
                    164:  * Once the file has been opened and magic number checked, this function
                    165:  * does the work.
                    166:  *
                    167:  * Globals used: fp, chInfo.
                    168:  */
                    169: void
                    170: dlout()
                    171: {
                    172:        int i;
                    173:        unsigned int shrds;     /* size of shared data */
                    174: 
                    175:        /* canonicalize where necessary */
                    176:        canint(ldHead.l_machine);
                    177:        if (ldHead.l_machine!=M_8086) {
                    178:                fprintf(stderr, "Wrong machine.\n");
                    179:                exit(1);
                    180:        }
                    181: 
                    182:        for (i=0; i<NXSEG; i++) {
                    183:                cansize(ldHead.l_ssize[i]);
                    184:        }       
                    185:        canint(ldHead.l_flag);
                    186:        canvaddr(ldHead.l_entry);
                    187: 
                    188:        /* display shared/unshared */
                    189:        if (ldHead.l_flag & LF_SHR)
                    190:                printf("shared executable\n");
                    191:        else
                    192:                printf("nonshared executable\n");
                    193: 
                    194: 
                    195:        /* display entry point */
                    196:        printf("entry point = %04X\n", ldHead.l_entry);
                    197: 
                    198:        /* fetch segment data */
                    199:        segInfo[SISTEXT].si_offset = sizeof(struct ldheader);
                    200:        segInfo[SISTEXT].si_base = NBPS;
                    201:        segInfo[SISTEXT].si_size = ldHead.l_ssize[L_SHRI];
                    202: 
                    203:        segInfo[SIPDATA].si_offset = sizeof(struct ldheader) +
                    204:                segInfo[SISTEXT].si_size;
                    205:        segInfo[SIPDATA].si_base = 0;
                    206:        segInfo[SIPDATA].si_size = ldHead.l_ssize[L_SHRD] +
                    207:                ldHead.l_ssize[L_PRVD];
                    208:        if (ldHead.l_flag & LF_SHR) {
                    209:                shrds = ldHead.l_ssize[L_SHRD];
                    210:                printf("shrds =  %04X\n", shrds);
                    211:        }
                    212: 
                    213:        segInfo[SIBSS].si_offset = 0;
                    214:        segInfo[SIBSS].si_base = segInfo[SIPDATA].si_size;
                    215:        segInfo[SIBSS].si_size = ldHead.l_ssize[L_BSSD];
                    216: 
                    217:        /* display segment sizes */
                    218:        printf("\nSegment\tBase\t\tSize\n");
                    219:        for (i = 0; i < NUSEG; i++) {
                    220:                if (i != SISTEXT && i != SIPDATA)
                    221:                        continue;
                    222:                printf("%s\t%08x\t%08x\n",
                    223:                  segName[i], segInfo[i].si_base, segInfo[i].si_size);
                    224:        }
                    225: 
                    226:        /* dump segments */
                    227:        for (i = 0; i < NUSEG; i++) {
                    228:                if (i != SISTEXT && i != SIPDATA)
                    229:                        continue;
                    230:                dumpseg(segName[i], segInfo + i);
                    231:        }
                    232: #if 0
                    233:        long offset;
                    234:        static struct uproc uProc;
                    235:        static int regs[SS+1];
                    236:        int i;
                    237:        int base, size;
                    238: 
                    239:        /* display uproc version number */
                    240:        offset = chInfo.ch_info_len + chInfo.ch_uproc_offset;
                    241:        if (fseek(fp, offset, 0) < 0) {
                    242:                fprintf(stderr, "Can't seek to uproc.\n");
                    243:                exit(1);
                    244:        }
                    245:        if (fread(&uProc, sizeof(uProc), 1, fp) !=1) {
                    246:                fprintf(stderr, "Can't read uproc.\n");
                    247:                exit(1);
                    248:        }
                    249:        printf("uproc version = 0x%04x\n", uProc.u_version);
                    250: 
                    251: #endif
                    252: }
                    253: 
                    254: main(argc, argv)
                    255: int argc;
                    256: char *argv[];
                    257: {
                    258: 
                    259:        /* command line housekeeping */
                    260:        cmd = argv[0];
                    261:        if (argc != 2)
                    262:                usage();
                    263:        loutName = argv[1];
                    264: 
                    265:        /* try to open the l.out file for reading */
                    266:        if ((fp = fopen(loutName, "r")) == NULL) {
                    267:                fprintf(stderr, "Can't open %s for reading.\n", loutName);
                    268:                exit(1);
                    269:        }
                    270: 
                    271:        /* simple test for l.out file format */
                    272:        if (fread(&ldHead, sizeof(ldHead), 1, fp) !=1) {
                    273:                fprintf(stderr, "Can't read l.out header\n");
                    274:                exit(1);
                    275:        }
                    276: 
                    277:        if (ldHead.l_magic != L_MAGIC) {
                    278:                fprintf(stderr, "Not a l.out file.\n");
                    279:                exit(1);
                    280:        }
                    281:        printf("L.out file: %s\n", loutName);
                    282: 
                    283:        /* call a function to do the work */
                    284:        dlout();
                    285: 
                    286:        /* cleanup */
                    287:        fclose(fp);
                    288:        exit(0);
                    289: }
                    290: 
                    291: long
                    292: _canl(n)
                    293: int n;
                    294: {
                    295:        return (n<<16)|((n>>16)&0xffff);
                    296: }

unix.superglobalmegacorp.com

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