|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)coredump.c 5.6 (Berkeley) 6/29/90";
22: #endif /* not lint */
23:
24: /*
25: * Deal with the core dump anachronism.
26: */
27:
28: #include "defs.h"
29: #include "coredump.h"
30: #include "machine.h"
31: #include "object.h"
32: #include "main.h"
33: #include <a.out.h>
34:
35: #ifndef public
36: #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s))
37:
38: #include "machine.h"
39: #endif
40:
41: typedef struct {
42: Address begin;
43: Address end;
44: Address seekaddr;
45: } Map;
46:
47: private Map datamap, stkmap;
48: private File objfile;
49: private struct exec hdr;
50:
51: public coredump_getkerinfo ()
52: {
53: Symbol s;
54:
55: s = lookup(identname("Sysmap", true));
56: if (s == nil) {
57: panic("can't find 'Sysmap'");
58: }
59: sbr = (struct pte *) (s->symvalue.offset);
60: s = lookup(identname("Syssize", true));
61: if (s == nil) {
62: panic("can't find 'Syssize'");
63: }
64: slr = (integer) (s->symvalue.offset);
65: printf("sbr %lx slr %lx\n", sbr, slr);
66: s = lookup(identname("masterpaddr", true));
67: if (s == nil) {
68: panic("can't find 'masterpaddr'");
69: }
70: fseek(
71: corefile,
72: datamap.seekaddr + s->symvalue.offset&0x7fffffff - datamap.begin,
73: 0
74: );
75: get(corefile, masterpcbb);
76: masterpcbb = (masterpcbb&PG_PFNUM)*NBPG;
77: getpcb();
78: }
79:
80: /*
81: * Read the user area information from the core dump.
82: */
83:
84: public coredump_xreadin(mask, reg, signo)
85: int *mask;
86: Word reg[];
87: short *signo;
88: {
89: register struct user *up;
90: register Word *savreg;
91: union {
92: struct user u;
93: char dummy[ctob(UPAGES)];
94: } ustruct;
95: Symbol s;
96:
97: objfile = fopen(objname, "r");
98: if (objfile == nil) {
99: fatal("can't read \"%s\"", objname);
100: }
101: get(objfile, hdr);
102: if (vaddrs) {
103: datamap.begin = 0;
104: datamap.end = 0xffffffff;
105: stkmap.begin = 0xffffffff;
106: stkmap.end = 0xffffffff;
107: } else {
108: up = &(ustruct.u);
109: fread(up, ctob(UPAGES), 1, corefile);
110: # if vax || tahoe
111: savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
112: # else ifdef mc68000
113: savreg = (Word *) (
114: &ustruct.dummy[ctob(UPAGES) - 10] - (NREG * sizeof(Word))
115: );
116: # endif
117: # ifdef IRIS
118: *mask = savreg[RPS];
119: # else
120: *mask = savreg[PS];
121: # endif
122: copyregs(savreg, reg);
123: *signo = up->u_sig;
124: datamap.seekaddr = ctob(UPAGES);
125: stkmap.begin = USRSTACK - ctob(up->u_ssize);
126: stkmap.end = USRSTACK;
127: stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
128: switch (hdr.a_magic) {
129: case OMAGIC:
130: datamap.begin = CODESTART;
131: datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize);
132: break;
133:
134: case NMAGIC:
135: case ZMAGIC:
136: datamap.begin = (Address)
137: ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART;
138: datamap.end = datamap.begin + ctob(up->u_dsize);
139: break;
140:
141: default:
142: fatal("bad magic number 0x%x", hdr.a_magic);
143: }
144: #ifdef UXMAG
145: /*
146: * Core dump not from this object file?
147: */
148: if (hdr.a_magic != 0 and up->u_exdata.ux_mag != 0 and
149: hdr.a_magic != up->u_exdata.ux_mag) {
150: warning("core dump ignored");
151: coredump = false;
152: fclose(corefile);
153: fclose(objfile);
154: start(nil, nil, nil);
155: }
156: #endif
157: }
158: }
159:
160: public coredump_close()
161: {
162: fclose(objfile);
163: }
164:
165: public coredump_readtext(buff, addr, nbytes)
166: char *buff;
167: Address addr;
168: int nbytes;
169: {
170: if (hdr.a_magic == OMAGIC or vaddrs) {
171: coredump_readdata(buff, addr, nbytes);
172: } else {
173: fseek(objfile, N_TXTOFF(hdr) + addr - CODESTART, 0);
174: fread(buff, nbytes, sizeof(Byte), objfile);
175: }
176: }
177:
178: public coredump_readdata(buff, addr, nbytes)
179: char *buff;
180: Address addr;
181: int nbytes;
182: {
183: Address a;
184:
185: a = addr;
186: if (a < datamap.begin) {
187: if (hdr.a_magic == OMAGIC) {
188: error("[data address 0x%x too low (lb = 0x%x)]", a, datamap.begin);
189: } else {
190: coredump_readtext(buff, a, nbytes);
191: }
192: } else if (a > stkmap.end) {
193: error("data address 0x%x too high (ub = 0x%x)", a, stkmap.end);
194: } else {
195: if (vaddrs) {
196: vreadfromfile(corefile, a, buff, nbytes);
197: } else {
198: readfromfile(corefile, a, buff, nbytes);
199: }
200: }
201: }
202:
203: /*
204: * Read a block of data from a memory image, mapping virtual addresses.
205: * Have to watch out for page boundaries.
206: */
207:
208: private vreadfromfile (corefile, v, buff, nbytes)
209: File corefile;
210: Address v;
211: char *buff;
212: integer nbytes;
213: {
214: Address a;
215: integer i, remainder, pagesize;
216: char *bufp;
217:
218: a = v;
219: pagesize = (integer) ptob(1);
220: remainder = pagesize - (a mod pagesize);
221: if (remainder >= nbytes) {
222: readfromfile(corefile, vmap(a), buff, nbytes);
223: } else {
224: readfromfile(corefile, vmap(a), buff, remainder);
225: a += remainder;
226: i = nbytes - remainder;
227: bufp = buff + remainder;
228: while (i > pagesize) {
229: readfromfile(corefile, vmap(a), bufp, pagesize);
230: a += pagesize;
231: bufp += pagesize;
232: i -= pagesize;
233: }
234: readfromfile(corefile, vmap(a), bufp, i);
235: }
236: }
237:
238: private readfromfile (f, a, buff, nbytes)
239: File f;
240: Address a;
241: char *buff;
242: integer nbytes;
243: {
244: integer fileaddr;
245:
246: if (a < stkmap.begin) {
247: fileaddr = datamap.seekaddr + a - datamap.begin;
248: } else {
249: fileaddr = stkmap.seekaddr + a - stkmap.begin;
250: }
251: fseek(f, fileaddr, 0);
252: fread(buff, nbytes, sizeof(Byte), f);
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.