Annotation of 43BSDTahoe/ucb/dbx/coredump.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)coredump.c 5.3 (Berkeley) 1/12/88";
                      9: #endif not lint
                     10: 
                     11: static char rcsid[] = "$Header: coredump.c,v 1.4 87/04/15 03:25:22 donn Exp $";
                     12: 
                     13: /*
                     14:  * Deal with the core dump anachronism.
                     15:  */
                     16: 
                     17: #include "defs.h"
                     18: #include "coredump.h"
                     19: #include "machine.h"
                     20: #include "object.h"
                     21: #include "main.h"
                     22: #include <a.out.h>
                     23: 
                     24: #ifndef public
                     25: #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s))
                     26: 
                     27: #include "machine.h"
                     28: #endif
                     29: 
                     30: typedef struct {
                     31:     Address begin;
                     32:     Address end;
                     33:     Address seekaddr;
                     34: } Map;
                     35: 
                     36: private Map datamap, stkmap;
                     37: private File objfile;
                     38: private struct exec hdr;
                     39: 
                     40: public coredump_getkerinfo ()
                     41: {
                     42:     Symbol s;
                     43: 
                     44:     s = lookup(identname("Sysmap", true));
                     45:     if (s == nil) {
                     46:        panic("can't find 'Sysmap'");
                     47:     }
                     48:     sbr = (struct pte *) (s->symvalue.offset);
                     49:     s = lookup(identname("Syssize", true));
                     50:     if (s == nil) {
                     51:        panic("can't find 'Syssize'");
                     52:     }
                     53:     slr = (integer) (s->symvalue.offset);
                     54:     printf("sbr %lx slr %lx\n", sbr, slr);
                     55:     s = lookup(identname("masterpaddr", true));
                     56:     if (s == nil) {
                     57:        panic("can't find 'masterpaddr'");
                     58:     }
                     59:     fseek(
                     60:        corefile,
                     61:        datamap.seekaddr + s->symvalue.offset&0x7fffffff - datamap.begin,
                     62:        0
                     63:     );
                     64:     get(corefile, masterpcbb);
                     65:     masterpcbb = (masterpcbb&PG_PFNUM)*NBPG;
                     66:     getpcb();
                     67: }
                     68: 
                     69: /*
                     70:  * Read the user area information from the core dump.
                     71:  */
                     72: 
                     73: public coredump_xreadin(mask, reg, signo)
                     74: int *mask;
                     75: Word reg[];
                     76: short *signo;
                     77: {
                     78:     register struct user *up;
                     79:     register Word *savreg;
                     80:     union {
                     81:        struct user u;
                     82:        char dummy[ctob(UPAGES)];
                     83:     } ustruct;
                     84:     Symbol s;
                     85: 
                     86:     objfile = fopen(objname, "r");
                     87:     if (objfile == nil) {
                     88:        fatal("can't read \"%s\"", objname);
                     89:     }
                     90:     get(objfile, hdr);
                     91:     if (vaddrs) {
                     92:        datamap.begin = 0;
                     93:        datamap.end = 0xffffffff;
                     94:        stkmap.begin = 0xffffffff;
                     95:        stkmap.end = 0xffffffff;
                     96:     } else {
                     97:        up = &(ustruct.u);
                     98:        fread(up, ctob(UPAGES), 1, corefile);
                     99: #      if vax || tahoe
                    100:            savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
                    101: #      else ifdef mc68000
                    102:            savreg = (Word *) (
                    103:                &ustruct.dummy[ctob(UPAGES) - 10] - (NREG * sizeof(Word))
                    104:            );
                    105: #      endif
                    106: #       ifdef IRIS
                    107:            *mask = savreg[RPS];
                    108: #       else
                    109:            *mask = savreg[PS];
                    110: #       endif
                    111:        copyregs(savreg, reg);
                    112:        *signo = up->u_arg[0];
                    113:        datamap.seekaddr = ctob(UPAGES);
                    114:        stkmap.begin = USRSTACK - ctob(up->u_ssize);
                    115:        stkmap.end = USRSTACK;
                    116:        stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
                    117:        switch (hdr.a_magic) {
                    118:            case OMAGIC:
                    119:                datamap.begin = CODESTART;
                    120:                datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize);
                    121:                break;
                    122: 
                    123:            case NMAGIC:
                    124:            case ZMAGIC:
                    125:                datamap.begin = (Address)
                    126:                    ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART;
                    127:                datamap.end = datamap.begin + ctob(up->u_dsize);
                    128:                break;
                    129: 
                    130:            default:
                    131:                fatal("bad magic number 0x%x", hdr.a_magic);
                    132:        }
                    133: #ifdef UXMAG
                    134:        /*
                    135:         * Core dump not from this object file?
                    136:         */
                    137:        if (hdr.a_magic != 0 and up->u_exdata.ux_mag  != 0 and
                    138:          hdr.a_magic != up->u_exdata.ux_mag) {
                    139:            warning("core dump ignored");
                    140:            coredump = false;
                    141:            fclose(corefile);
                    142:            fclose(objfile);
                    143:            start(nil, nil, nil);
                    144:        }
                    145: #endif
                    146:     }
                    147: }
                    148: 
                    149: public coredump_close()
                    150: {
                    151:     fclose(objfile);
                    152: }
                    153: 
                    154: public coredump_readtext(buff, addr, nbytes)
                    155: char *buff;
                    156: Address addr;
                    157: int nbytes;
                    158: {
                    159:     if (hdr.a_magic == OMAGIC or vaddrs) {
                    160:        coredump_readdata(buff, addr, nbytes);
                    161:     } else {
                    162:        fseek(objfile, N_TXTOFF(hdr) + addr - CODESTART, 0);
                    163:        fread(buff, nbytes, sizeof(Byte), objfile);
                    164:     }
                    165: }
                    166: 
                    167: public coredump_readdata(buff, addr, nbytes)
                    168: char *buff;
                    169: Address addr;
                    170: int nbytes;
                    171: {
                    172:     Address a;
                    173: 
                    174:     a = addr;
                    175:     if (a < datamap.begin) {
                    176:        if (hdr.a_magic == OMAGIC) {
                    177:            error("[data address 0x%x too low (lb = 0x%x)]", a, datamap.begin);
                    178:        } else {
                    179:            coredump_readtext(buff, a, nbytes);
                    180:        }
                    181:     } else if (a > stkmap.end) {
                    182:        error("data address 0x%x too high (ub = 0x%x)", a, stkmap.end);
                    183:     } else {
                    184:        if (vaddrs) {
                    185:            vreadfromfile(corefile, a, buff, nbytes);
                    186:        } else {
                    187:            readfromfile(corefile, a, buff, nbytes);
                    188:        }
                    189:     }
                    190: }
                    191: 
                    192: /*
                    193:  * Read a block of data from a memory image, mapping virtual addresses.
                    194:  * Have to watch out for page boundaries.
                    195:  */
                    196: 
                    197: private vreadfromfile (corefile, v, buff, nbytes)
                    198: File corefile;
                    199: Address v;
                    200: char *buff;
                    201: integer nbytes;
                    202: {
                    203:     Address a;
                    204:     integer i, remainder, pagesize;
                    205:     char *bufp;
                    206: 
                    207:     a = v;
                    208:     pagesize = (integer) ptob(1);
                    209:     remainder = pagesize - (a mod pagesize);
                    210:     if (remainder >= nbytes) {
                    211:        readfromfile(corefile, vmap(a), buff, nbytes);
                    212:     } else {
                    213:        readfromfile(corefile, vmap(a), buff, remainder);
                    214:        a += remainder;
                    215:        i = nbytes - remainder;
                    216:        bufp = buff + remainder;
                    217:        while (i > pagesize) {
                    218:            readfromfile(corefile, vmap(a), bufp, pagesize);
                    219:            a += pagesize;
                    220:            bufp += pagesize;
                    221:            i -= pagesize;
                    222:        }
                    223:        readfromfile(corefile, vmap(a), bufp, i);
                    224:     }
                    225: }
                    226: 
                    227: private readfromfile (f, a, buff, nbytes)
                    228: File f;
                    229: Address a;
                    230: char *buff;
                    231: integer nbytes;
                    232: {
                    233:     integer fileaddr;
                    234: 
                    235:     if (a < stkmap.begin) {
                    236:        fileaddr = datamap.seekaddr + a - datamap.begin;
                    237:     } else {
                    238:        fileaddr = stkmap.seekaddr + a - stkmap.begin;
                    239:     }
                    240:     fseek(f, fileaddr, 0);
                    241:     fread(buff, nbytes, sizeof(Byte), f);
                    242: }

unix.superglobalmegacorp.com

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