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