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

1.1       root        1: /*
                      2:  * File:       dcore.c
                      3:  *
                      4:  * Purpose:    Display contents of core file intelligibly.
                      5:  *
                      6:  * $Log:       dcore.c,v $
                      7:  * Revision 1.1  93/04/16  07:01:38  bin
                      8:  * Initial revision
                      9:  * 
                     10:  */
                     11: 
                     12: /*
                     13:  * ----------------------------------------------------------------------
                     14:  * Includes.
                     15:  */
                     16: #include <stdio.h>
                     17: #include <sys/core.h>
                     18: #include <sys/reg.h>
                     19: #include <sys/uproc.h>
                     20: 
                     21: /*
                     22:  * ----------------------------------------------------------------------
                     23:  * Definitions.
                     24:  *     Constants.
                     25:  *     Macros with argument lists.
                     26:  *     Typedefs.
                     27:  *     Enums.
                     28:  */
                     29: #define DEFAULT_CORE_NAME      "core"
                     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 int tflag;      /* "-t" option says text segment was dumped */
                     55: static char * coreName = DEFAULT_CORE_NAME;
                     56: static FILE * fp;
                     57: static struct ch_info chInfo;
                     58: static char *segName[NUSEG] = {
                     59:        "USER", "TEXT", "DATA", "STACK"
                     60: };
                     61: static struct seg_info segInfo[NUSEG];
                     62: 
                     63: /*
                     64:  * ----------------------------------------------------------------------
                     65:  * Code.
                     66:  */
                     67: 
                     68: void
                     69: usage()
                     70: {
                     71:        fprintf(stderr, "Usage: %s [-t] [corefile]\n", cmd);
                     72:        exit(1);
                     73: }
                     74: 
                     75: /*
                     76:  * Given text name and vital stats for a segment, do a hex dump.
                     77:  */
                     78: void
                     79: dumpseg(name, infop)
                     80: char *name;
                     81: struct seg_info *infop;
                     82: {
                     83:        /* use the fact that segment size is a multiple of NBPC */
                     84:        unsigned char coredata[DSIZE];
                     85:        unsigned char savedata[DSIZE];
                     86:        int segOffset;
                     87:        int i;
                     88:        /*
                     89:         * sameState:
                     90:         * -1   just starting; don't look for matching display lines
                     91:         *  0   current line does not match previous line
                     92:         *  1   current line matches previous line
                     93:         *  2   current line matches previous 2 or more lines
                     94:         */
                     95:        int sameState = -1;
                     96:        int doPrint, match;
                     97: 
                     98:        /* make sure we can seek to start of segment */
                     99:        if (fseek(fp, infop->si_offset, 0) < 0) {
                    100:                fprintf(stderr, "Can't seek to %s segment!\n", name);
                    101:                exit(1);
                    102:        }
                    103: 
                    104:        printf("\nContents of %s segment:\n", name);
                    105:        for (segOffset = 0; segOffset < infop->si_size; segOffset += DSIZE) {
                    106:                int readLen = DSIZE;
                    107:                int remains = infop->si_size - segOffset;
                    108: 
                    109:                if (readLen > remains)
                    110:                        readLen = remains;
                    111: 
                    112:                if (fread(coredata, readLen, 1, fp) !=1) {
                    113:                        fprintf(stderr, "Can't read core data.\n");
                    114:                        exit(1);
                    115:                }
                    116: 
                    117:                /* always display last line of segment */
                    118:                if (remains <= DSIZE)
                    119:                        match = 1;
                    120:                else
                    121:                        match = memcmp(coredata, savedata, DSIZE);
                    122: 
                    123:                switch(sameState) {
                    124:                case -1:
                    125:                        sameState = 0;
                    126:                        doPrint = 1;
                    127:                        break;
                    128:                case 0:
                    129:                        if (match) {
                    130:                                doPrint = 1;
                    131:                        } else {
                    132:                                sameState = 1;
                    133:                                doPrint = 0;
                    134:                        }
                    135:                        break;
                    136:                case 1:
                    137:                        if (match) {
                    138:                                doPrint = 1;
                    139:                                sameState = 0;
                    140:                        } else {
                    141:                                sameState = 2;
                    142:                                doPrint = 0;
                    143:                                printf("   *\n");
                    144:                        }
                    145:                        break;
                    146:                case 2:
                    147:                        if (match) {
                    148:                                doPrint = 1;
                    149:                                sameState = 0;
                    150:                        } else {
                    151:                                doPrint = 0;
                    152:                        }
                    153:                        break;
                    154:                }
                    155:                if (doPrint) {
                    156:                        printf("%06X", segOffset);
                    157:                        for (i = 0; i < readLen; i++)
                    158:                                printf(" %02X", coredata[i]);
                    159:                        printf("\n");
                    160:                }
                    161:                memcpy(savedata, coredata, DSIZE);
                    162:        }
                    163: }
                    164: 
                    165: /*
                    166:  * Once the file has been opened and magic number checked, this function
                    167:  * does the work.
                    168:  *
                    169:  * Globals used: fp, chInfo.
                    170:  */
                    171: void
                    172: dcore()
                    173: {
                    174:        long offset;
                    175:        static struct uproc uProc;
                    176:        static int regs[SS+1];
                    177:        int i;
                    178:        int base, size;
                    179: 
                    180:        /* display uproc version number */
                    181:        offset = chInfo.ch_info_len + chInfo.ch_uproc_offset;
                    182:        if (fseek(fp, offset, 0) < 0) {
                    183:                fprintf(stderr, "Can't seek to uproc.\n");
                    184:                exit(1);
                    185:        }
                    186:        if (fread(&uProc, sizeof(uProc), 1, fp) !=1) {
                    187:                fprintf(stderr, "Can't read uproc.\n");
                    188:                exit(1);
                    189:        }
                    190:        printf("uproc version = 0x%04x\n", uProc.u_version);
                    191: 
                    192:        /* display register set */
                    193:        offset = chInfo.ch_info_len + ((int)(uProc.u_regl) & (NBPC-1));
                    194:        if (fseek(fp, offset, 0) < 0) {
                    195:                fprintf(stderr, "Can't seek to register set.\n");
                    196:                exit(1);
                    197:        }
                    198:        if (fread(regs, sizeof(regs), 1, fp) !=1) {
                    199:                fprintf(stderr, "Can't read register set.\n");
                    200:                exit(1);
                    201:        }
                    202: 
                    203:        printf("\neax=%08X\tebx=%08X\tecx=%08X\tedx=%08X\n",
                    204:          regs[EAX], regs[EBX], regs[ECX], regs[EDX]);
                    205:        printf("esi=%08X\tedi=%08X\tebp=%08X\tesp=%08X\n",
                    206:          regs[ESI], regs[EDI], regs[EBP], regs[ESP]);
                    207:        printf("eip=%08X\tuesp=%08X\tefl=%08X\n",
                    208:          regs[EIP], regs[UESP], regs[EFL]);
                    209:        printf("\ncs=%04X\tds=%04X\tes=%04X\tss=%04X\tfs=%04X\tgs=%04X\n",
                    210:          regs[CS]&0xffff, regs[DS]&0xffff, regs[ES]&0xffff,
                    211:          regs[SS]&0xffff, regs[FS]&0xffff, regs[GS]&0xffff);
                    212:        printf("\nerr #%d \tcmd=%s\n", regs[ERR], uProc.u_comm);
                    213: 
                    214:        /* display segment sizes */
                    215:        printf("\nSegment\tBase\t\tSize\n");
                    216:        offset = chInfo.ch_info_len;
                    217:        for (i = 0; i < NUSEG; i++) {
                    218:                base = (int)(uProc.u_segl[i].sr_base);
                    219:                size = uProc.u_segl[i].sr_size;
                    220:                if (i == SISTACK)
                    221:                        base -= size;
                    222:                printf("%s\t%08x\t%08x\n", segName[i], base, size);
                    223:                segInfo[i].si_offset = offset;
                    224:                segInfo[i].si_base = base;
                    225:                segInfo[i].si_size = size;
                    226: 
                    227:                /* text is in core file only if "-t" specified */
                    228:                if (tflag || i != SISTEXT)
                    229:                        offset += size;
                    230:        }
                    231: 
                    232:        /* dump segments */
                    233:        for (i = 0; i < NUSEG; i++) {
                    234:                if (!tflag && i == SISTEXT)
                    235:                        continue;
                    236:                dumpseg(segName[i], segInfo + i);
                    237:        }
                    238: }
                    239: 
                    240: main(argc, argv)
                    241: int argc;
                    242: char *argv[];
                    243: {
                    244:        int argn;
                    245: 
                    246:        /* command line housekeeping */
                    247:        cmd = argv[0];
                    248:        for (argn = 1; argn < argc; argn++) {
                    249:                if (argv[argn][0] == '-') {
                    250:                        switch(argv[argn][1]) {
                    251:                        case 't':
                    252:                                tflag = 1;
                    253:                                break;
                    254:                        default:
                    255:                                usage();
                    256:                        }
                    257:                } else {
                    258:                        coreName = argv[argn];
                    259:                        /* this should be the last argument */
                    260:                        if (argn < argc - 1)
                    261:                                usage();
                    262:                }
                    263:        }
                    264: 
                    265:        /* try to open the core file for reading */
                    266:        if ((fp = fopen(coreName, "r")) == NULL) {
                    267:                fprintf(stderr, "Can't open %s for reading.\n", coreName);
                    268:                exit(1);
                    269:        }
                    270: 
                    271:        /* simple test for core file format */
                    272:        if (fread(&chInfo, sizeof(chInfo), 1, fp) !=1) {
                    273:                fprintf(stderr, "Can't read core header.\n");
                    274:                exit(1);
                    275:        }
                    276: 
                    277:        if (chInfo.ch_magic != CORE_MAGIC) {
                    278:                fprintf(stderr, "Not a core file.\n");
                    279:                exit(1);
                    280:        }
                    281:        printf("Core file: %s  ", coreName);
                    282: 
                    283:        /* call a function to do the work */
                    284:        dcore();
                    285: 
                    286:        /* cleanup */
                    287:        fclose(fp);
                    288:        exit(0);
                    289: }

unix.superglobalmegacorp.com

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