|
|
1.1 root 1: static char sccsid[] = "@(#)setup.c 4.6 82/10/28";
2: /*
3: * adb - routines to read a.out+core at startup
4: */
5: #include "defs.h"
6: #include <sys/stat.h>
7:
8: off_t datbas; /* offset of the base of the data segment */
9: off_t stksiz; /* stack size in the core image */
10: INT sigcode; /* belongs in head.h */
11:
12: char *symfil = "a.out";
13: char *corfil = "core";
14:
15: setsym()
16: {
17: off_t loc;
18: struct exec hdr;
19: register struct nlist *sp;
20: int ssiz;
21: char *strtab;
22:
23: fsym = getfile(symfil, 1);
24: txtmap.ufd = fsym;
25: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr ||
26: N_BADMAG(hdr)) {
27: txtmap.e1 = MAXFILE;
28: return;
29: }
30: filhdr = hdr;
31: loc = filhdr.a_text+filhdr.a_data;
32: txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr);
33: txtmap.b1 = 0;
34: switch (filhdr.a_magic) {
35:
36: case OMAGIC:
37: txtmap.b1 = txtmap.e1 = 0;
38: txtmap.b2 = datbas = 0;
39: txtmap.e2 = loc;
40: break;
41:
42: case ZMAGIC:
43: case NMAGIC:
44: txtmap.e1 = filhdr.a_text;
45: txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ);
46: txtmap.e2 = datbas + filhdr.a_data;
47: txtmap.f2 += txtmap.e1;
48: }
49: loc = N_SYMOFF(filhdr);
50: symtab = (struct nlist *) malloc(filhdr.a_syms);
51: esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)];
52: if (symtab == NULL)
53: goto nospac;
54: lseek(fsym, loc, 0);
55: if (filhdr.a_syms == 0)
56: goto nosymt;
57: /* SHOULD SQUISH OUT STABS HERE!!! */
58: if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms)
59: goto readerr;
60: if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz))
61: goto oldfmt;
62: strtab = (char *) malloc(ssiz);
63: if (strtab == 0)
64: goto nospac;
65: *(int *)strtab = ssiz;
66: ssiz -= sizeof (ssiz);
67: if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz)
68: goto readerr;
69: for (sp = symtab; sp < esymtab; sp++)
70: if (sp->n_strx)
71: /* SHOULD PERFORM RANGE CHECK HERE */
72: sp->n_un.n_name = strtab + sp->n_un.n_strx;
73: nosymt:
74: if (INKERNEL(filhdr.a_entry)) {
75: txtmap.b1 += KERNOFF;
76: txtmap.e1 += KERNOFF;
77: txtmap.b2 += KERNOFF;
78: txtmap.e2 += KERNOFF;
79: }
80: return;
81: readerr:
82: printf("Error reading symbol|string table\n");
83: exit(1);
84: nospac:
85: printf("Not enough space for symbol|string table\n");
86: exit(1);
87: oldfmt:
88: printf("Old format a.out - no string table\n");
89: exit(1);
90: }
91:
92: setcor()
93: {
94:
95: fcor = datmap.ufd = getfile(corfil,2);
96: if (kernel && fcor != -1 && INKERNEL(filhdr.a_entry)) {
97: struct stat stb;
98:
99: kcore = 1;
100: fstat(fcor, &stb);
101: datmap.b1 = 0;
102: datmap.e1 = -1;
103: if (kernel == 0 && (stb.st_mode & S_IFREG))
104: datmap.b1 = 0x80000000;
105: lookup("_Sysmap");
106: sbr = cursym->n_value;
107: lookup("_Syssize");
108: slr = cursym->n_value;
109: printf("sbr %X slr %X\n", sbr, slr);
110: lookup("_masterpaddr");
111: physrw(fcor, cursym->n_value&0x7fffffff, &masterpcbb, 1);
112: masterpcbb = (masterpcbb&PG_PFNUM)*512;
113: getpcb();
114: return;
115: }
116: if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) ||
117: !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) {
118: datmap.e1 = MAXFILE;
119: return;
120: }
121: signo = u.u_arg[0];
122: sigcode = u.u_code;
123: filhdr.a_text = ctob(u.u_tsize);
124: filhdr.a_data = ctob(u.u_dsize);
125: stksiz = ctob(u.u_ssize);
126: switch (filhdr.a_magic) {
127:
128: case OMAGIC:
129: datmap.b1 = 0;
130: datmap.e1 = filhdr.a_text+filhdr.a_data;
131: datmap.f2 = ctob(UPAGES) + datmap.e1;
132: break;
133:
134: case NMAGIC:
135: case ZMAGIC:
136: datmap.b1 = round(filhdr.a_text, PAGSIZ);
137: datmap.e1 = datmap.b1 + filhdr.a_data;
138: datmap.f2 = ctob(UPAGES) + filhdr.a_data;
139: break;
140: }
141: datbas = datmap.b1;
142: datmap.f1 = ctob(UPAGES);
143: datmap.b2 = MAXSTOR - stksiz;
144: datmap.e2 = MAXSTOR;
145: if (filhdr.a_magic && u.u_exdata.ux_mag &&
146: filhdr.a_magic != u.u_exdata.ux_mag)
147: printf("corefile not from this program");
148: }
149:
150: getpcb()
151: {
152:
153: lseek(fcor, masterpcbb&~0x80000000, 0);
154: read(fcor, &pcb, sizeof (struct pcb));
155: pcb.pcb_p0lr &= ~AST_CLR;
156: printf("p0br %X p0lr %X p1br %X p1lr %X\n",
157: pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr);
158: }
159:
160: create(f)
161: char *f;
162: {
163: register int fd;
164:
165: fd = creat(f, 0644);
166: if (fd < 0)
167: return (-1);
168: close(fd);
169: return (open(f, wtflag));
170: }
171:
172: getfile(filnam, cnt)
173: char *filnam;
174: {
175: register int fsym;
176:
177: if (eqstr(filnam, "-"))
178: return (-1);
179: fsym = open(filnam, wtflag);
180: if (fsym < 0 && xargc > cnt) {
181: if (wtflag)
182: fsym = create(filnam);
183: if (fsym < 0)
184: printf("cannot open `%s'\n", filnam);
185: }
186: return (fsym);
187: }
188:
189: setvar()
190: {
191:
192: var[varchk('b')] = datbas;
193: var[varchk('d')] = filhdr.a_data;
194: var[varchk('e')] = filhdr.a_entry;
195: var[varchk('m')] = filhdr.a_magic;
196: var[varchk('s')] = stksiz;
197: var[varchk('t')] = filhdr.a_text;
198: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.