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