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