Commit | Line | Data |
---|---|---|
6094e621 | 1 | static char sccsid[] = "@(#)setup.c 4.6 82/10/28"; |
af975fa6 BJ |
2 | /* |
3 | * adb - routines to read a.out+core at startup | |
4 | */ | |
5 | #include "defs.h" | |
6094e621 | 6 | #include <sys/stat.h> |
af975fa6 BJ |
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); | |
52bff713 | 96 | if (kernel && fcor != -1 && INKERNEL(filhdr.a_entry)) { |
af975fa6 BJ |
97 | struct stat stb; |
98 | ||
128eca8b | 99 | kcore = 1; |
af975fa6 BJ |
100 | fstat(fcor, &stb); |
101 | datmap.b1 = 0; | |
102 | datmap.e1 = -1; | |
6d4468aa BJ |
103 | if (kernel == 0 && (stb.st_mode & S_IFREG)) |
104 | datmap.b1 = 0x80000000; | |
6eadceb1 BJ |
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); | |
52bff713 | 110 | lookup("_masterpaddr"); |
6eadceb1 | 111 | physrw(fcor, cursym->n_value&0x7fffffff, &masterpcbb, 1); |
52bff713 | 112 | masterpcbb = (masterpcbb&PG_PFNUM)*512; |
6eadceb1 | 113 | getpcb(); |
af975fa6 BJ |
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 | ||
6eadceb1 BJ |
150 | getpcb() |
151 | { | |
128eca8b | 152 | |
6eadceb1 BJ |
153 | lseek(fcor, masterpcbb&~0x80000000, 0); |
154 | read(fcor, &pcb, sizeof (struct pcb)); | |
128eca8b | 155 | pcb.pcb_p0lr &= ~AST_CLR; |
6eadceb1 BJ |
156 | printf("p0br %X p0lr %X p1br %X p1lr %X\n", |
157 | pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr); | |
6eadceb1 BJ |
158 | } |
159 | ||
af975fa6 BJ |
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 | } |