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