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