|
|
1.1 root 1: /*
2: * adb - routines to read a.out+core at startup
3: * stuff in here is pretty vax dependent
4: */
5: #include <a.out.h>
6: #include <sys/types.h>
7: #include <sys/dir.h>
8: #include <sys/user.h>
9: #include <sys/param.h>
10: #include "defs.h"
11: #include "space.h"
12: #include "map.h"
13: #include "machine.h"
14: #include "base.h"
15:
16: char *symfil = "a.out";
17: char *corfil = "core";
18:
19: MAP symmap[NMAP];
20: MAP cormap[NMAP];
21:
22: int fsym, fcor;
23:
24: static ADDR datbase;
25: ADDR txtsize, datsize, stksize;
26: static ADDR entry;
27: static int magic;
28:
29: setsym()
30: {
31: ADDR loc;
32: struct exec hdr;
33: register MAP *mp;
34: char *malloc();
35:
36: fsym = getfile(symfil, 1);
37: mp = symmap;
38: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr ||
39: badmagic((int)hdr.a_magic)) {
40: mp->f = mp->b = 0;
41: mp->e = MAXFILE;
42: mp->sp = DATASP;
43: mp->flag = MPINUSE;
44: mp++;
45: mp->flag = 0;
46: return;
47: }
48: magic = hdr.a_magic;
49: entry = hdr.a_entry;
50: loc = hdr.a_text+hdr.a_data;
51: switch (magic) {
52:
53: case OMAGIC:
54: txtsize = 0;
55: datbase = 0;
56: datsize = loc;
57: mp->b = entry;
58: mp->e = mp->b + loc;
59: mp->f = N_TXTOFF(hdr);
60: mp->sp = DATASP;
61: mp->flag = MPINUSE;
62: break;
63:
64: case ZMAGIC:
65: case NMAGIC:
66: txtsize = hdr.a_text;
67: mp->b = N_PAGSIZ(hdr);
68: mp->e = hdr.a_text + mp->b;
69: mp->f = N_TXTOFF(hdr);
70: mp->sp = INSTSP;
71: mp->flag = MPINUSE;
72: mp++;
73: mp->b = datbase = round((WORD)(hdr.a_text + N_PAGSIZ(hdr)),
74: (WORD)N_SEGSIZ(hdr));
75: mp->e = datsize = datbase + hdr.a_data;
76: mp->f = N_TXTOFF(hdr) + hdr.a_text;
77: mp->sp = DATASP;
78: mp->flag = MPINUSE;
79: break;
80: }
81: mp++;
82: mp->flag = 0;
83: syminit(&hdr);
84: }
85:
86: setcor()
87: {
88: register MAP *mp;
89:
90: fcor = getfile(corfil,2);
91: if (fcor < 0
92: || (mapimage() == 0 && mapcore() == 0)) {
93: /* not a core image */
94: mp = cormap;
95: mp->b = 0;
96: mp->e = MAXFILE;
97: mp->f = 0;
98: mp->sp = DATASP;
99: mp->flag = MPINUSE;
100: mp++;
101: mp->flag = 0;
102: return;
103: }
104: }
105:
106: /*
107: * set up maps for a direct process image (/proc)
108: */
109:
110: #define UOFF(x) (ADDR)(&((struct user *)0)->x)
111:
112: int
113: mapimage()
114: {
115: register MAP *mp;
116:
117: if (trcimage() == 0)
118: return (0);
119: sigcode = trcunab(UOFF(u_code));
120: txtsize = ctob(trcunab(UOFF(u_tsize)));
121: datsize = ctob(trcunab(UOFF(u_dsize)));
122: stksize = ctob(trcunab(UOFF(u_ssize)));
123: #if NOTDEF /* no ID separation on VAX */
124: if (magic == IMAGIC)
125: datbase = 0;
126: else
127: #endif
128: datbase = txtsize;
129: mp = cormap;
130: if (txtsize) {
131: mp->b = ctob(1);
132: mp->e = mp->b + txtsize;
133: mp->f = TXTBASE + mp->b;
134: mp->flag = MPINUSE;
135: #if NOTDEF /* no ID separation on VAX */
136: if (magic == IMAGIC)
137: mp->sp = INSTSP;
138: else
139: #endif
140: mp->sp = DATASP;
141: mp++;
142: }
143: mp->b = ctob(stoc(ctos(btoc(txtsize) + 1)));
144: mp->e = mp->b + datsize;
145: mp->f = DATBASE + mp->b;
146: mp->sp = DATASP;
147: mp->flag = MPINUSE;
148: mp++;
149: mp->b = MAXSTOR - stksize;
150: mp->e = MAXSTOR;
151: mp->f = DATBASE + mp->b;
152: mp->sp = DATASP;
153: mp->flag = MPINUSE;
154: mp++;
155: mp->b = 0;
156: mp->e = ctob(UPAGES);
157: mp->f = UBASE;
158: mp->sp = UBLKSP;
159: mp->flag = MPINUSE;
160: mp++;
161: mp->flag = 0;
162: rsnarf();
163: return (1);
164: }
165:
166: mapcore()
167: {
168: struct user u;
169: register MAP *mp;
170:
171: lseek(fcor, (off_t)0, 0);
172: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u)
173: || badmagic(u.u_exdata.ux_mag))
174: return (0);
175: if (magic && magic != u.u_exdata.ux_mag)
176: printf("%s: not from %s\n", corfil, symfil);
177: magic = u.u_exdata.ux_mag;
178: signo = u.u_arg[0];
179: sigcode = u.u_code;
180: txtsize = ctob(u.u_tsize);
181: datsize = ctob(u.u_dsize);
182: stksize = ctob(u.u_ssize);
183: mp = cormap;
184: switch (magic) {
185:
186: case OMAGIC:
187: mp->b = ctob(1);
188: mp->e = mp->b + txtsize + datsize;
189: mp->f = ctob(UPAGES);
190: mp->sp = DATASP;
191: mp->flag = MPINUSE;
192: mp++;
193: mp->b = MAXSTOR - stksize;
194: mp->e = MAXSTOR;
195: mp->f = txtsize + datsize + ctob(UPAGES);
196: mp->sp = DATASP;
197: mp->flag = MPINUSE;
198: break;
199:
200: case NMAGIC:
201: case ZMAGIC:
202: mp->b = ctob(stoc(ctos(u.u_tsize + 1)));
203: mp->e = mp->b + datsize;
204: mp->f = ctob(UPAGES);
205: mp->sp = DATASP;
206: mp->flag = MPINUSE;
207: mp++;
208: mp->b = MAXSTOR - stksize;
209: mp->e = MAXSTOR;
210: mp->f = datsize + ctob(UPAGES);
211: mp->sp = DATASP;
212: mp->flag = MPINUSE;
213: break;
214: }
215: mp++;
216: mp->b = 0;
217: mp->e = ctob(UPAGES);
218: mp->f = 0;
219: mp->sp = UBLKSP;
220: mp->flag = MPINUSE;
221: mp++;
222: mp->flag = 0;
223: rsnarf();
224: return (1);
225: }
226:
227: badmagic(num)
228: int num;
229: {
230:
231: switch (num) {
232: case OMAGIC:
233: case NMAGIC:
234: case ZMAGIC:
235: return (0);
236:
237: default:
238: return (1);
239: }
240: }
241:
242: cmdmap(itype, star)
243: register int star, itype;
244: {
245: register MAP *mp;
246: extern char lastc;
247:
248: if (itype & SYMF)
249: mp = symmap;
250: else
251: mp = cormap;
252: if (star) /* UGH */
253: mp++;
254: if (expr(0))
255: mp->b = expv;
256: if (expr(0))
257: mp->e = expv;
258: if (expr(0))
259: mp->f = expv;
260: mp->flag |= MPINUSE;
261: if (rdc()=='?' && (itype&SYMF) == 0) {
262: if (fcor)
263: close(fcor);
264: fcor=fsym;
265: corfil=symfil;
266: } else if (lastc == '/' && itype&SYMF) {
267: if (fsym)
268: close(fsym);
269: fsym=fcor;
270: symfil=corfil;
271: } else
272: reread();
273: }
274:
275: create(f)
276: char *f;
277: {
278: register int fd;
279:
280: fd = creat(f, 0666);
281: if (fd < 0)
282: return (-1);
283: close(fd);
284: return (open(f, wtflag));
285: }
286:
287: getfile(filnam, cnt)
288: char *filnam;
289: {
290: register int fsym;
291:
292: if (strcmp(filnam, "-") == 0)
293: return (-1);
294: fsym = open(filnam, wtflag);
295: if (fsym < 0 && xargc > cnt) {
296: if (wtflag)
297: fsym = create(filnam);
298: if (fsym < 0)
299: printf("cannot open `%s'\n", filnam);
300: }
301: return (fsym);
302: }
303:
304: setvar()
305: {
306:
307: var[varchk('b')] = datbase;
308: var[varchk('d')] = datsize;
309: var[varchk('e')] = entry;
310: var[varchk('m')] = magic;
311: var[varchk('s')] = stksize;
312: var[varchk('t')] = txtsize;
313: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.