|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.