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