xref: /csrg-svn/old/dbx/coredump.c (revision 9661)
1*9661Slinton /* Copyright (c) 1982 Regents of the University of California */
2*9661Slinton 
3*9661Slinton static char sccsid[] = "@(#)@(#)coredump.c 1.1 12/15/82";
4*9661Slinton 
5*9661Slinton /*
6*9661Slinton  * Deal with the core dump anachronism.
7*9661Slinton  *
8*9661Slinton  * If I understood this code, I'd try to make it readable.
9*9661Slinton  */
10*9661Slinton 
11*9661Slinton #include "defs.h"
12*9661Slinton #include "coredump.h"
13*9661Slinton #include "machine.h"
14*9661Slinton #include "object.h"
15*9661Slinton #include "main.h"
16*9661Slinton #include <sys/param.h>
17*9661Slinton #include <sys/dir.h>
18*9661Slinton #include <sys/psl.h>
19*9661Slinton #include <sys/pte.h>
20*9661Slinton #include <sys/user.h>
21*9661Slinton #include <sys/vm.h>
22*9661Slinton #include <sys/reg.h>
23*9661Slinton #include <a.out.h>
24*9661Slinton 
25*9661Slinton #ifndef public
26*9661Slinton #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s))
27*9661Slinton 
28*9661Slinton #include "machine.h"
29*9661Slinton #endif
30*9661Slinton 
31*9661Slinton #define MAXSTKADDR (0x80000000 - ctob(UPAGES))	/* highest stack address */
32*9661Slinton 
33*9661Slinton typedef struct {
34*9661Slinton     Address begin;
35*9661Slinton     Address end;
36*9661Slinton     Address seekaddr;
37*9661Slinton } Map;
38*9661Slinton 
39*9661Slinton private Map datamap, stkmap;
40*9661Slinton private File objfile;
41*9661Slinton private struct exec hdr;
42*9661Slinton 
43*9661Slinton /*
44*9661Slinton  * Read the user area information from the core dump.
45*9661Slinton  */
46*9661Slinton 
47*9661Slinton public coredump_xreadin(mask, reg, signo)
48*9661Slinton int *mask;
49*9661Slinton Word reg[];
50*9661Slinton int *signo;
51*9661Slinton {
52*9661Slinton     register struct user *up;
53*9661Slinton     register Word *savreg;
54*9661Slinton     union {
55*9661Slinton 	struct user u;
56*9661Slinton 	char dummy[ctob(UPAGES)];
57*9661Slinton     } ustruct;
58*9661Slinton 
59*9661Slinton     objfile = fopen(objname, "r");
60*9661Slinton     if (objfile == nil) {
61*9661Slinton 	fatal("can't read \"%s\"", objname);
62*9661Slinton     }
63*9661Slinton     get(objfile, hdr);
64*9661Slinton     up = &(ustruct.u);
65*9661Slinton     fread(up, ctob(UPAGES), 1, corefile);
66*9661Slinton     savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
67*9661Slinton     *mask = savreg[PS];
68*9661Slinton     reg[0] = savreg[R0];
69*9661Slinton     reg[1] = savreg[R1];
70*9661Slinton     reg[2] = savreg[R2];
71*9661Slinton     reg[3] = savreg[R3];
72*9661Slinton     reg[4] = savreg[R4];
73*9661Slinton     reg[5] = savreg[R5];
74*9661Slinton     reg[6] = savreg[R6];
75*9661Slinton     reg[7] = savreg[R7];
76*9661Slinton     reg[8] = savreg[R8];
77*9661Slinton     reg[9] = savreg[R9];
78*9661Slinton     reg[10] = savreg[R10];
79*9661Slinton     reg[11] = savreg[R11];
80*9661Slinton     reg[ARGP] = savreg[AP];
81*9661Slinton     reg[FRP] = savreg[FP];
82*9661Slinton     reg[STKP] = savreg[SP];
83*9661Slinton     reg[PROGCTR] = savreg[PC];
84*9661Slinton     *signo = up->u_arg[0];
85*9661Slinton     datamap.seekaddr = ctob(UPAGES);
86*9661Slinton     stkmap.begin = MAXSTKADDR - ctob(up->u_ssize);
87*9661Slinton     stkmap.end = MAXSTKADDR;
88*9661Slinton     stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
89*9661Slinton     switch (hdr.a_magic) {
90*9661Slinton 	case OMAGIC:
91*9661Slinton 	    datamap.begin = 0;
92*9661Slinton 	    datamap.end = ctob(up->u_tsize) + ctob(up->u_dsize);
93*9661Slinton 	    break;
94*9661Slinton 
95*9661Slinton 	case NMAGIC:
96*9661Slinton 	case ZMAGIC:
97*9661Slinton 	    datamap.begin = (Address) ptob(btop(ctob(up->u_tsize) - 1) + 1);
98*9661Slinton 	    datamap.end = datamap.begin + ctob(up->u_dsize);
99*9661Slinton 	    break;
100*9661Slinton 
101*9661Slinton 	default:
102*9661Slinton 	    fatal("bad magic number 0x%x", hdr.a_magic);
103*9661Slinton     }
104*9661Slinton     /*
105*9661Slinton      * Core dump not from this object file?
106*9661Slinton      */
107*9661Slinton     if (hdr.a_magic != 0 and up->u_exdata.ux_mag  != 0 and
108*9661Slinton       hdr.a_magic != up->u_exdata.ux_mag) {
109*9661Slinton 	warning("core dump ignored");
110*9661Slinton 	coredump = false;
111*9661Slinton 	fclose(coredump);
112*9661Slinton 	fclose(objfile);
113*9661Slinton 	start(nil, nil, nil);
114*9661Slinton     }
115*9661Slinton }
116*9661Slinton 
117*9661Slinton public coredump_close()
118*9661Slinton {
119*9661Slinton     fclose(objfile);
120*9661Slinton }
121*9661Slinton 
122*9661Slinton public coredump_readtext(buff, addr, nbytes)
123*9661Slinton char *buff;
124*9661Slinton Address addr;
125*9661Slinton int nbytes;
126*9661Slinton {
127*9661Slinton     if (hdr.a_magic == OMAGIC) {
128*9661Slinton 	coredump_readdata(buff, addr, nbytes);
129*9661Slinton     } else {
130*9661Slinton 	fseek(objfile, N_TXTOFF(hdr) + addr, 0);
131*9661Slinton 	fread(buff, nbytes, sizeof(Byte), objfile);
132*9661Slinton     }
133*9661Slinton }
134*9661Slinton 
135*9661Slinton public coredump_readdata(buff, addr, nbytes)
136*9661Slinton char *buff;
137*9661Slinton Address addr;
138*9661Slinton int nbytes;
139*9661Slinton {
140*9661Slinton     if (addr < datamap.begin) {
141*9661Slinton 	error("data address 0x%x too low (lb = 0x%x)", addr, datamap.begin);
142*9661Slinton     } else if (addr > stkmap.end) {
143*9661Slinton 	error("data address 0x%x too high (ub = 0x%x)", addr, stkmap.end);
144*9661Slinton     } else if (addr < stkmap.begin) {
145*9661Slinton 	fseek(corefile, datamap.seekaddr + addr - datamap.begin, 0);
146*9661Slinton 	fread(buff, nbytes, sizeof(Byte), corefile);
147*9661Slinton     } else {
148*9661Slinton 	fseek(corefile, stkmap.seekaddr + addr - stkmap.begin, 0);
149*9661Slinton 	fread(buff, nbytes, sizeof(Byte), corefile);
150*9661Slinton     }
151*9661Slinton }
152