|
|
1.1 ! root 1: static char sccsid[] = "@(#)setup.c 4.6 82/10/28"; ! 2: /* ! 3: * adb - routines to read a.out+core at startup ! 4: */ ! 5: #include "defs.h" ! 6: #include <sys/stat.h> ! 7: ! 8: off_t datbas; /* offset of the base of the data segment */ ! 9: off_t stksiz; /* stack size in the core image */ ! 10: INT sigcode; /* belongs in head.h */ ! 11: ! 12: char *symfil = "a.out"; ! 13: char *corfil = "core"; ! 14: ! 15: setsym() ! 16: { ! 17: off_t loc; ! 18: struct exec hdr; ! 19: register struct nlist *sp; ! 20: int ssiz; ! 21: char *strtab; ! 22: ! 23: fsym = getfile(symfil, 1); ! 24: txtmap.ufd = fsym; ! 25: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr || ! 26: N_BADMAG(hdr)) { ! 27: txtmap.e1 = MAXFILE; ! 28: return; ! 29: } ! 30: filhdr = hdr; ! 31: loc = filhdr.a_text+filhdr.a_data; ! 32: txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr); ! 33: txtmap.b1 = 0; ! 34: switch (filhdr.a_magic) { ! 35: ! 36: case OMAGIC: ! 37: txtmap.b1 = txtmap.e1 = 0; ! 38: txtmap.b2 = datbas = 0; ! 39: txtmap.e2 = loc; ! 40: break; ! 41: ! 42: case ZMAGIC: ! 43: case NMAGIC: ! 44: txtmap.e1 = filhdr.a_text; ! 45: txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ); ! 46: txtmap.e2 = datbas + filhdr.a_data; ! 47: txtmap.f2 += txtmap.e1; ! 48: } ! 49: loc = N_SYMOFF(filhdr); ! 50: symtab = (struct nlist *) malloc(filhdr.a_syms); ! 51: esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)]; ! 52: if (symtab == NULL) ! 53: goto nospac; ! 54: lseek(fsym, loc, 0); ! 55: if (filhdr.a_syms == 0) ! 56: goto nosymt; ! 57: /* SHOULD SQUISH OUT STABS HERE!!! */ ! 58: if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms) ! 59: goto readerr; ! 60: if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz)) ! 61: goto oldfmt; ! 62: strtab = (char *) malloc(ssiz); ! 63: if (strtab == 0) ! 64: goto nospac; ! 65: *(int *)strtab = ssiz; ! 66: ssiz -= sizeof (ssiz); ! 67: if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz) ! 68: goto readerr; ! 69: for (sp = symtab; sp < esymtab; sp++) ! 70: if (sp->n_strx) ! 71: /* SHOULD PERFORM RANGE CHECK HERE */ ! 72: sp->n_un.n_name = strtab + sp->n_un.n_strx; ! 73: nosymt: ! 74: if (INKERNEL(filhdr.a_entry)) { ! 75: txtmap.b1 += KERNOFF; ! 76: txtmap.e1 += KERNOFF; ! 77: txtmap.b2 += KERNOFF; ! 78: txtmap.e2 += KERNOFF; ! 79: } ! 80: return; ! 81: readerr: ! 82: printf("Error reading symbol|string table\n"); ! 83: exit(1); ! 84: nospac: ! 85: printf("Not enough space for symbol|string table\n"); ! 86: exit(1); ! 87: oldfmt: ! 88: printf("Old format a.out - no string table\n"); ! 89: exit(1); ! 90: } ! 91: ! 92: setcor() ! 93: { ! 94: ! 95: fcor = datmap.ufd = getfile(corfil,2); ! 96: if (kernel && fcor != -1 && INKERNEL(filhdr.a_entry)) { ! 97: struct stat stb; ! 98: ! 99: kcore = 1; ! 100: fstat(fcor, &stb); ! 101: datmap.b1 = 0; ! 102: datmap.e1 = -1; ! 103: if (kernel == 0 && (stb.st_mode & S_IFREG)) ! 104: datmap.b1 = 0x80000000; ! 105: lookup("_Sysmap"); ! 106: sbr = cursym->n_value; ! 107: lookup("_Syssize"); ! 108: slr = cursym->n_value; ! 109: printf("sbr %X slr %X\n", sbr, slr); ! 110: lookup("_masterpaddr"); ! 111: physrw(fcor, cursym->n_value&0x7fffffff, &masterpcbb, 1); ! 112: masterpcbb = (masterpcbb&PG_PFNUM)*512; ! 113: getpcb(); ! 114: return; ! 115: } ! 116: if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) || ! 117: !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) { ! 118: datmap.e1 = MAXFILE; ! 119: return; ! 120: } ! 121: signo = u.u_arg[0]; ! 122: sigcode = u.u_code; ! 123: filhdr.a_text = ctob(u.u_tsize); ! 124: filhdr.a_data = ctob(u.u_dsize); ! 125: stksiz = ctob(u.u_ssize); ! 126: switch (filhdr.a_magic) { ! 127: ! 128: case OMAGIC: ! 129: datmap.b1 = 0; ! 130: datmap.e1 = filhdr.a_text+filhdr.a_data; ! 131: datmap.f2 = ctob(UPAGES) + datmap.e1; ! 132: break; ! 133: ! 134: case NMAGIC: ! 135: case ZMAGIC: ! 136: datmap.b1 = round(filhdr.a_text, PAGSIZ); ! 137: datmap.e1 = datmap.b1 + filhdr.a_data; ! 138: datmap.f2 = ctob(UPAGES) + filhdr.a_data; ! 139: break; ! 140: } ! 141: datbas = datmap.b1; ! 142: datmap.f1 = ctob(UPAGES); ! 143: datmap.b2 = MAXSTOR - stksiz; ! 144: datmap.e2 = MAXSTOR; ! 145: if (filhdr.a_magic && u.u_exdata.ux_mag && ! 146: filhdr.a_magic != u.u_exdata.ux_mag) ! 147: printf("corefile not from this program"); ! 148: } ! 149: ! 150: getpcb() ! 151: { ! 152: ! 153: lseek(fcor, masterpcbb&~0x80000000, 0); ! 154: read(fcor, &pcb, sizeof (struct pcb)); ! 155: pcb.pcb_p0lr &= ~AST_CLR; ! 156: printf("p0br %X p0lr %X p1br %X p1lr %X\n", ! 157: pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr); ! 158: } ! 159: ! 160: create(f) ! 161: char *f; ! 162: { ! 163: register int fd; ! 164: ! 165: fd = creat(f, 0644); ! 166: if (fd < 0) ! 167: return (-1); ! 168: close(fd); ! 169: return (open(f, wtflag)); ! 170: } ! 171: ! 172: getfile(filnam, cnt) ! 173: char *filnam; ! 174: { ! 175: register int fsym; ! 176: ! 177: if (eqstr(filnam, "-")) ! 178: return (-1); ! 179: fsym = open(filnam, wtflag); ! 180: if (fsym < 0 && xargc > cnt) { ! 181: if (wtflag) ! 182: fsym = create(filnam); ! 183: if (fsym < 0) ! 184: printf("cannot open `%s'\n", filnam); ! 185: } ! 186: return (fsym); ! 187: } ! 188: ! 189: setvar() ! 190: { ! 191: ! 192: var[varchk('b')] = datbas; ! 193: var[varchk('d')] = filhdr.a_data; ! 194: var[varchk('e')] = filhdr.a_entry; ! 195: var[varchk('m')] = filhdr.a_magic; ! 196: var[varchk('s')] = stksiz; ! 197: var[varchk('t')] = filhdr.a_text; ! 198: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.