1 /*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)setup.c 5.5 (Berkeley) 04/04/91";
10 #endif /* not lint */
11
12 /*
13 * adb - routines to read a.out and core files at startup
14 */
15
16 #include "defs.h"
17 #include <sys/file.h>
18
19 static struct exec filhdr;
20
21 off_t lseek();
22 char *malloc();
23
24 /* NB. the following works only with letter (alpha) variables */
25 #define setavar(name, value) (var[(name) - 'a' + 10] = (value))
26
setsym()27 setsym()
28 {
29 register struct nlist *sp;
30 int strsize;
31 char *strtab;
32 off_t loc, dbase;
33
34 txtmap.ufd = symfile.fd = getfile(1);
35 if (read(symfile.fd, (char *)&filhdr, sizeof(filhdr)) != sizeof(filhdr) ||
36 N_BADMAG(filhdr)) {
37 bzero((char *)&filhdr, sizeof(filhdr));
38 txtmap.m1.e = -(addr_t)1;
39 return;
40 }
41 loc = filhdr.a_text + filhdr.a_data;
42 txtmap.m1.f = txtmap.m2.f = N_TXTOFF(filhdr);
43 switch ((int)filhdr.a_magic) {
44
45 case OMAGIC:
46 /* text map 1 is empty; map 2 goes from 0 to loc */
47 txtmap.m2.b = dbase = 0;
48 txtmap.m2.e = loc;
49 break;
50
51 case ZMAGIC:
52 case NMAGIC:
53 /* text map 1 maps text segment, map 2 maps data */
54 txtmap.m1.e = filhdr.a_text;
55 txtmap.m2.b = dbase = roundup(filhdr.a_text, CLBYTES);
56 txtmap.m2.e = dbase + filhdr.a_data;
57 txtmap.m2.f += txtmap.m1.e;
58 break;
59 }
60
61 /* save data segment base in variable b */
62 setavar('b', dbase);
63
64 if (filhdr.a_syms != 0) {
65 loc = N_SYMOFF(filhdr);
66 symtab = (struct nlist *)malloc((u_int)filhdr.a_syms);
67 if (symtab == NULL)
68 goto nospace;
69 esymtab = &symtab[filhdr.a_syms / sizeof(struct nlist)];
70 (void) lseek(symfile.fd, loc, L_SET);
71
72 #define rd(a, n) \
73 if (read(symfile.fd, (char *)(a), (int)(n)) != (n)) \
74 goto readerr
75
76 rd(symtab, filhdr.a_syms);
77 rd(&strsize, sizeof(strsize));
78 /*
79 * offsets in the string table are relative to the offset
80 * of the number we just read; we adjust for it here.
81 */
82 strsize -= sizeof(strsize);
83 if ((strtab = malloc((u_int)strsize)) == NULL)
84 goto nospace;
85 rd(strtab, strsize);
86 for (sp = symtab; sp < esymtab; sp++) {
87 if (sp->n_un.n_strx == 0)
88 continue;
89 sp->n_un.n_strx -= sizeof(strsize);
90 if ((u_long)sp->n_un.n_strx >= strsize) {
91 adbprintf("bad string index %D in symtab\n",
92 (expr_t)sp->n_un.n_strx);
93 sp->n_un.n_name = "";
94 } else
95 sp->n_un.n_name = strtab + sp->n_un.n_strx;
96 }
97 #undef rd
98 }
99 if (INKERNEL(filhdr.a_entry)) {
100 txtmap.m1.b += KERNTEXTOFF;
101 txtmap.m1.e += KERNTEXTOFF;
102 txtmap.m2.b += KERNTEXTOFF;
103 txtmap.m2.e += KERNTEXTOFF;
104 }
105 return;
106
107 readerr:
108 prints("Error reading symbol|string table (old format a.out?)\n");
109 exit(1);
110 /* NOTREACHED */
111
112 nospace:
113 prints("Not enough space for symbol|string table\n");
114 exit(1);
115 /* NOTREACHED */
116 }
117
setcore()118 setcore()
119 {
120 off_t stacksize;
121
122 datmap.m1.e = -(addr_t)1;
123 if ((datmap.ufd = corefile.fd = getfile(2)) < 0)
124 goto ret;
125 if (kernel && INKERNEL(filhdr.a_entry) && getkcore()) {
126 kcore = 1;
127 goto ret;
128 }
129 if (read(corefile.fd, (char *)&u, ctob(UPAGES)) != ctob(UPAGES) ||
130 !udot()) {
131 adbprintf("not core file = %s\n", corefile.name);
132 goto ret;
133 }
134 signo = u.u_sig;
135 sigcode = u.u_code;
136 filhdr.a_text = ctob(u.u_tsize);
137 filhdr.a_data = ctob(u.u_dsize);
138 stacksize = ctob(u.u_ssize);
139 switch ((int)filhdr.a_magic) {
140
141 case OMAGIC:
142 datmap.m1.b = 0;
143 datmap.m1.e = filhdr.a_text + filhdr.a_data;
144 datmap.m2.f = ctob(UPAGES) + datmap.m1.e;
145 break;
146
147 case NMAGIC:
148 case ZMAGIC:
149 datmap.m1.b = roundup(filhdr.a_text, CLBYTES);
150 datmap.m1.e = datmap.m1.b + filhdr.a_data;
151 datmap.m2.f = ctob(UPAGES) + filhdr.a_data;
152 break;
153 }
154 /* save (possibly new) data segment base, and save stack size */
155 setavar('b', datmap.m1.b);
156 setavar('s', stacksize);
157 datmap.m1.f = ctob(UPAGES);
158 datmap.m2.b = KERNBASE - ctob(UPAGES) - stacksize;
159 datmap.m2.e = KERNBASE - ctob(UPAGES);
160 ret:
161 u.u_ar0 = (int *)((caddr_t)&u + ctob(UPAGES)); /* XXX */
162 setavar('d', filhdr.a_data);
163 setavar('e', filhdr.a_entry);
164 setavar('m', filhdr.a_magic);
165 setavar('t', filhdr.a_text);
166 }
167