|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)setup.c 5.3 (Berkeley) 6/25/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_sig; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.