xref: /original-bsd/old/adb/common_source/setup.c (revision 698bcc85)
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 
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 
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