|
|
1.1 root 1: /*
2: * adb - routines to read a.out+core at startup
3: * this for cray; very simple, but some hooks left for later
4: */
5: #include "defs.h"
6: /*
7: * beware!
8: */
9: #undef wtoa
10: #undef atow
11: #undef wtoc
12: #undef ctow
13: #include "space.h"
14: #include "map.h"
15: #include "machine.h"
16: #include <sys/param.h>
17: #include <sys/types.h>
18: #include <sys/sysmacros.h>
19: #include <sys/ucomm.h>
20: #include <sys/signal.h>
21: #include <sys/dir.h>
22: #include <sys/proc.h>
23: #include <sys/user.h>
24:
25: char *symfil = "a.out";
26: char *corfil = "core";
27:
28: MAP symmap[NMAP];
29: MAP cormap[NMAP];
30:
31: int fsym, fcor;
32:
33: static ADDR datbase;
34: ADDR txtsize, datsize, stksize;
35: static ADDR entry;
36: static int magic;
37:
38: setsym()
39: {
40: ADDR loc;
41: struct exec hdr;
42: register MAP *mp;
43: char *malloc();
44:
45: fsym = getfile(symfil, 1);
46: mp = symmap;
47: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr ||
48: badmagic((int)hdr.a_magic)) {
49: mp->f = mp->b = 0;
50: mp->e = MAXFILE;
51: mp->sp = DATASP;
52: mp->flag = MPINUSE;
53: mp++;
54: mp->flag = 0;
55: hksyminit(symfil, 0);
56: return;
57: }
58: magic = hdr.a_magic;
59: entry = patoba(hdr.a_entry);
60: loc = watoba(hdr.a_text+hdr.a_data);
61: switch (magic) {
62: case A_MAGIC1: /* only 407 files on cray! */
63: txtsize = 0;
64: datbase = 0;
65: datsize = loc;
66: mp->b = 0;
67: mp->e = loc;
68: mp->f = sizeof(hdr);
69: mp->sp = DATASP;
70: mp->flag = MPINUSE;
71: break;
72: }
73: mp++;
74: mp->flag = 0;
75: hksyminit(symfil, 1);
76: }
77:
78: setcor()
79: {
80: register MAP *mp;
81:
82: fcor = getfile(corfil,2);
83: if (fcor < 0
84: || (mapimage() == 0 && mapcore() == 0)) {
85: /* not a core image */
86:
87: mp = cormap;
88: mp->b = 0;
89: mp->e = MAXFILE;
90: mp->f = 0;
91: mp->sp = DATASP;
92: mp->flag = MPINUSE;
93: mp++;
94: mp->flag = 0;
95: return;
96: }
97: }
98:
99: /*
100: * set up maps for a direct process image (ptrace)
101: */
102:
103: #define UOFF(x) ((int)&((struct user *)0)->x)
104:
105: int
106: mapimage()
107: {
108: register MAP *mp;
109:
110: if (trcimage() == 0)
111: return (0);
112: txtsize = 0; /* sigh */
113: datsize = MAXFILE; /* sigh again */
114: #if NOTDEF /* no ID separation */
115: if (magic == IMAGIC)
116: datbase = 0;
117: else
118: #endif
119: datbase = txtsize;
120: mp = cormap;
121: if (txtsize) {
122: mp->b = 0;
123: mp->e = txtsize;
124: mp->f = 0;
125: mp->flag = MPINUSE;
126: #if NOTDEF /* no ID separation */
127: if (magic == IMAGIC)
128: mp->sp = INSTSP;
129: else
130: #endif
131: mp->sp = DATASP;
132: mp++;
133: }
134: mp->b = txtsize;
135: mp->e = mp->b + datsize;
136: mp->f = mp->b;
137: mp->sp = DATASP;
138: mp->flag = MPINUSE;
139: mp++;
140: mp->b = 0;
141: mp->e = ctob(USIZE);
142: mp->f = 0;
143: mp->sp = UBLKSP;
144: mp->flag = MPINUSE;
145: mp++;
146: mp->flag = 0;
147: rsnarf();
148: return (1);
149: }
150:
151: /*
152: * assume single-tasked image
153: * hack validity check: do first few entries in ascii offsets look good?
154: * better checks invited
155: */
156:
157: mapcore()
158: {
159: struct ucomm uc;
160: char *p;
161: struct user u;
162: register MAP *mp;
163:
164: lseek(fcor, (off_t)0, 0);
165: if (read(fcor, (char *)&uc, sizeof(uc)) != sizeof(uc))
166: return (0);
167: p = (char *)&uc.uc_ascii[0];
168: if (p[0] != 'U' && p[0] != 'u')
169: return (0);
170: p = (char *)&uc.uc_ascii[2];
171: if (p[0] != 'U' && p[0] != 'u')
172: return (0);
173: p = (char *)&uc.uc_ascii[4]; /* i tell you three times */
174: if (p[0] != 'U' && p[0] != 'u')
175: return (0);
176: lseek(fcor, (off_t)ctob(UCSIZE), 0);
177: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u))
178: return (0);
179: datsize = watoba(uc.uc_dsize);
180: mp = cormap;
181: mp->b = 0;
182: mp->e = datsize;
183: mp->f = ctob(USIZE)+ctob(UCSIZE);
184: mp->sp = DATASP;
185: mp->flag = MPINUSE;
186: mp++;
187: mp->b = 0;
188: mp->e = ctob(USIZE);
189: mp->f = ctob(UCSIZE);
190: mp->sp = UBLKSP;
191: mp->flag = MPINUSE;
192: mp++;
193: mp->flag = 0;
194: rsnarf();
195: return (1);
196: }
197:
198: badmagic(num)
199: int num;
200: {
201:
202: switch (num) {
203: case A_MAGIC1:
204: return (0);
205:
206: default:
207: return (1);
208: }
209: }
210:
211: cmdmap(itype, star)
212: register int star, itype;
213: {
214: register MAP *mp;
215: extern char lastc;
216:
217: if (itype & SYMF)
218: mp = symmap;
219: else
220: mp = cormap;
221: if (star) /* UGH */
222: mp++;
223: if (expr(0))
224: mp->b = expv;
225: if (expr(0))
226: mp->e = expv;
227: if (expr(0))
228: mp->f = expv;
229: mp->flag |= MPINUSE;
230: if (rdc()=='?' && (itype&SYMF) == 0) {
231: if (fcor)
232: close(fcor);
233: fcor=fsym;
234: corfil=symfil;
235: } else if (lastc == '/' && itype&SYMF) {
236: if (fsym)
237: close(fsym);
238: fsym=fcor;
239: symfil=corfil;
240: } else
241: reread();
242: }
243:
244: create(f)
245: char *f;
246: {
247: register int fd;
248:
249: fd = creat(f, 0666);
250: if (fd < 0)
251: return (-1);
252: close(fd);
253: return (open(f, wtflag));
254: }
255:
256: getfile(filnam, cnt)
257: char *filnam;
258: {
259: register int fsym;
260:
261: if (strcmp(filnam, "-") == 0)
262: return (-1);
263: fsym = open(filnam, wtflag);
264: if (fsym < 0 && xargc > cnt) {
265: if (wtflag)
266: fsym = create(filnam);
267: if (fsym < 0)
268: printf("cannot open `%s'\n", filnam);
269: }
270: return (fsym);
271: }
272:
273: setvar()
274: {
275:
276: var[varchk('b')] = datbase;
277: var[varchk('d')] = datsize;
278: var[varchk('e')] = entry;
279: var[varchk('m')] = magic;
280: var[varchk('s')] = stksize;
281: var[varchk('t')] = txtsize;
282: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.