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