|
|
1.1 ! root 1: /* ! 2: * adb - routines to read a.out+core at startup ! 3: * stuff in here is pretty vax dependent ! 4: */ ! 5: #include "defs.h" ! 6: #include "machine.h" ! 7: #include <a.out.h> ! 8: #include <sys/types.h> ! 9: #include <sys/dir.h> ! 10: #include <sys/user.h> ! 11: #include <sys/proc.h> ! 12: #include <sys/pioctl.h> ! 13: #include "base.h" ! 14: ! 15: char *symfil = "a.out"; ! 16: char *corfil = "core"; ! 17: ! 18: MAP symmap[NMAP]; ! 19: MAP cormap[NMAP]; ! 20: ! 21: int fsym, fcor; ! 22: ! 23: static ADDR datbase; ! 24: ADDR txtsize, datsize, stksize; ! 25: static ADDR entry; ! 26: static int magic; ! 27: ! 28: setsym() ! 29: { ! 30: ADDR loc; ! 31: struct exec hdr; ! 32: register struct nlist *sp; ! 33: int ssiz; ! 34: register char *strtab; ! 35: register MAP *mp; ! 36: char *malloc(); ! 37: ! 38: fsym = getfile(symfil, 1); ! 39: mp = symmap; ! 40: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr || ! 41: badmagic(hdr.a_magic)) { ! 42: mp->f = mp->b = 0; ! 43: mp->e = MAXFILE; ! 44: mp->sp = DATASP; ! 45: mp->flag = MPINUSE; ! 46: mp++; ! 47: mp->flag = 0; ! 48: return; ! 49: } ! 50: magic = hdr.a_magic; ! 51: entry = hdr.a_entry; ! 52: loc = hdr.a_text+hdr.a_data; ! 53: switch (magic) { ! 54: ! 55: case OMAGIC: ! 56: txtsize = 0; ! 57: datbase = 0; ! 58: datsize = loc; ! 59: mp->b = 0; ! 60: mp->e = loc; ! 61: mp->f = N_TXTOFF(hdr); ! 62: mp->sp = DATASP; ! 63: mp->flag = MPINUSE; ! 64: break; ! 65: ! 66: case ZMAGIC: ! 67: case NMAGIC: ! 68: mp->b = 0; ! 69: mp->e = txtsize = hdr.a_text; ! 70: mp->f = N_TXTOFF(hdr); ! 71: mp->sp = INSTSP; ! 72: mp->flag = MPINUSE; ! 73: mp++; ! 74: mp->b = datbase = round((WORD)hdr.a_text, (WORD)PAGSIZ); ! 75: mp->e = datsize = datbase + hdr.a_data; ! 76: mp->f = N_TXTOFF(hdr) + hdr.a_text; ! 77: mp->sp = DATASP; ! 78: mp->flag = MPINUSE; ! 79: break; ! 80: } ! 81: loc = N_SYMOFF(hdr); ! 82: symtab = (struct nlist *) malloc(hdr.a_syms); ! 83: esymtab = &symtab[hdr.a_syms / sizeof (struct nlist)]; ! 84: if (symtab == NULL) { ! 85: printf("no space for symbol table\n"); ! 86: goto nosymt; ! 87: } ! 88: lseek(fsym, (off_t)loc, 0); ! 89: if (hdr.a_syms == 0) ! 90: goto nosymt; ! 91: if (read(fsym, symtab, hdr.a_syms) != hdr.a_syms ! 92: || read(fsym, (char *)&ssiz, sizeof(ssiz)) != sizeof(ssiz)) { ! 93: printf("error reading string table\n"); ! 94: goto nosymt; ! 95: } ! 96: strtab = (char *) malloc(ssiz); ! 97: if (strtab == 0) { ! 98: printf("no space for string table\n"); ! 99: goto nosymt; ! 100: } ! 101: *(int *)strtab = ssiz; ! 102: ssiz -= sizeof (ssiz); ! 103: if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz) { ! 104: printf("error reading symbol table\n"); ! 105: goto nosymt; ! 106: } ! 107: for (sp = symtab; sp < esymtab; sp++) ! 108: if (sp->n_un.n_strx) ! 109: /* SHOULD PERFORM RANGE CHECK HERE */ ! 110: sp->n_un.n_name = strtab + sp->n_un.n_strx; ! 111: nosymt: ! 112: if (INKERNEL(entry)) { ! 113: symmap[0].b += KERNOFF; ! 114: symmap[1].b += KERNOFF; ! 115: symmap[0].e += KERNOFF; ! 116: symmap[1].e += KERNOFF; ! 117: } ! 118: mp++; ! 119: mp->flag = 0; ! 120: } ! 121: ! 122: setcor() ! 123: { ! 124: register MAP *mp; ! 125: ! 126: fcor = getfile(corfil,2); ! 127: if (fcor < 0 ! 128: || (mapimage() == 0 && mapcore() == 0)) { ! 129: /* not a core image */ ! 130: mp = cormap; ! 131: mp->b = 0; ! 132: mp->e = MAXFILE; ! 133: mp->f = 0; ! 134: mp->sp = DATASP; ! 135: mp->flag = MPINUSE; ! 136: mp++; ! 137: mp->flag = 0; ! 138: return; ! 139: } ! 140: } ! 141: ! 142: /* ! 143: * set up maps for a direct process image (/proc) ! 144: */ ! 145: ! 146: int ! 147: mapimage() ! 148: { ! 149: struct user u; ! 150: struct proc p; ! 151: register MAP *mp; ! 152: ! 153: if (ioctl(fcor, PIOCGETPR, &p) < 0) ! 154: return (0); /* not /proc */ ! 155: lseek(fcor, (off_t)UBASE, 0); ! 156: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u) ! 157: || badmagic(u.u_exdata.ux_mag)) { ! 158: printf("%s: can't read user block\n", corfil); ! 159: return (0); ! 160: } ! 161: if (p.p_stat != SSTOP) ! 162: signo = 0; /* running */ ! 163: else ! 164: signo = p.p_cursig; ! 165: sigcode = u.u_code; ! 166: txtsize = ctob(u.u_tsize); ! 167: datsize = ctob(u.u_dsize); ! 168: stksize = ctob(u.u_ssize); ! 169: #if NOTDEF /* no ID separation on VAX */ ! 170: if (magic == IMAGIC) ! 171: datbase = 0; ! 172: else ! 173: #endif ! 174: datbase = txtsize; ! 175: mp = cormap; ! 176: if (txtsize) { ! 177: mp->b = 0; ! 178: mp->e = txtsize; ! 179: mp->f = TXTBASE; ! 180: mp->flag = MPINUSE; ! 181: #if NOTDEF /* no ID separation on VAX */ ! 182: if (magic == IMAGIC) ! 183: mp->sp = INSTSP; ! 184: else ! 185: #endif ! 186: mp->sp = DATASP; ! 187: mp++; ! 188: } ! 189: mp->b = txtsize; ! 190: mp->e = mp->b + datsize; ! 191: mp->f = DATBASE + mp->b; ! 192: mp->sp = DATASP; ! 193: mp->flag = MPINUSE; ! 194: mp++; ! 195: mp->b = MAXSTOR - stksize; ! 196: mp->e = MAXSTOR + ctob(UPAGES); ! 197: mp->f = DATBASE + mp->b; ! 198: mp->sp = DATASP; ! 199: mp->flag = MPINUSE; ! 200: mp++; ! 201: mp->b = 0; ! 202: mp->e = ctob(UPAGES); ! 203: mp->f = UBASE; ! 204: mp->sp = UBLKSP; ! 205: mp->flag = MPINUSE; ! 206: mp++; ! 207: mp->flag = 0; ! 208: rsnarf(); ! 209: return (1); ! 210: } ! 211: ! 212: mapcore() ! 213: { ! 214: struct user u; ! 215: register MAP *mp; ! 216: ! 217: lseek(fcor, (off_t)0, 0); ! 218: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u) ! 219: || badmagic(u.u_exdata.ux_mag)) ! 220: return (0); ! 221: if (magic && magic != u.u_exdata.ux_mag) ! 222: printf("%s: not from %s\n", corfil, symfil); ! 223: magic = u.u_exdata.ux_mag; ! 224: signo = u.u_arg[0]; ! 225: sigcode = u.u_code; ! 226: txtsize = ctob(u.u_tsize); ! 227: datsize = ctob(u.u_dsize); ! 228: stksize = ctob(u.u_ssize); ! 229: mp = cormap; ! 230: switch (magic) { ! 231: ! 232: case OMAGIC: ! 233: mp->b = 0; ! 234: mp->e = txtsize + datsize; ! 235: mp->f = ctob(UPAGES); ! 236: mp->sp = DATASP; ! 237: mp->flag = MPINUSE; ! 238: mp++; ! 239: mp->b = MAXSTOR - stksize; ! 240: mp->e = MAXSTOR; ! 241: mp->f = txtsize + datsize + ctob(UPAGES); ! 242: mp->sp = DATASP; ! 243: mp->flag = MPINUSE; ! 244: break; ! 245: ! 246: case NMAGIC: ! 247: case ZMAGIC: ! 248: mp->b = txtsize; ! 249: mp->e = mp->b + datsize; ! 250: mp->f = ctob(UPAGES); ! 251: mp->sp = DATASP; ! 252: mp->flag = MPINUSE; ! 253: mp++; ! 254: mp->b = MAXSTOR - stksize; ! 255: mp->e = MAXSTOR; ! 256: mp->f = datsize + ctob(UPAGES); ! 257: mp->sp = DATASP; ! 258: mp->flag = MPINUSE; ! 259: break; ! 260: } ! 261: mp++; ! 262: mp->b = 0; ! 263: mp->e = ctob(UPAGES); ! 264: mp->f = 0; ! 265: mp->sp = UBLKSP; ! 266: mp->flag = MPINUSE; ! 267: mp++; ! 268: mp->flag = 0; ! 269: rsnarf(); ! 270: return (1); ! 271: } ! 272: ! 273: badmagic(num) ! 274: int num; ! 275: { ! 276: ! 277: switch (num) { ! 278: case OMAGIC: ! 279: case NMAGIC: ! 280: case ZMAGIC: ! 281: return (0); ! 282: ! 283: default: ! 284: return (1); ! 285: } ! 286: } ! 287: ! 288: cmdmap(itype, star) ! 289: register int star, itype; ! 290: { ! 291: register MAP *mp; ! 292: extern char lastc; ! 293: ! 294: if (itype & SYMF) ! 295: mp = symmap; ! 296: else ! 297: mp = cormap; ! 298: if (star) /* UGH */ ! 299: mp++; ! 300: if (expr(0)) ! 301: mp->b = expv; ! 302: if (expr(0)) ! 303: mp->e = expv; ! 304: if (expr(0)) ! 305: mp->f = expv; ! 306: mp->flag |= MPINUSE; ! 307: if (rdc()=='?' && (itype&SYMF) == 0) { ! 308: if (fcor) ! 309: close(fcor); ! 310: fcor=fsym; ! 311: } else if (lastc == '/' && itype&SYMF) { ! 312: if (fsym) ! 313: close(fsym); ! 314: fsym=fcor; ! 315: } else ! 316: reread(); ! 317: } ! 318: ! 319: create(f) ! 320: char *f; ! 321: { ! 322: register int fd; ! 323: ! 324: fd = creat(f, 0666); ! 325: if (fd < 0) ! 326: return (-1); ! 327: close(fd); ! 328: return (open(f, wtflag)); ! 329: } ! 330: ! 331: getfile(filnam, cnt) ! 332: char *filnam; ! 333: { ! 334: register int fsym; ! 335: ! 336: if (strcmp(filnam, "-") == 0) ! 337: return (-1); ! 338: fsym = open(filnam, wtflag); ! 339: if (fsym < 0 && xargc > cnt) { ! 340: if (wtflag) ! 341: fsym = create(filnam); ! 342: if (fsym < 0) ! 343: printf("cannot open `%s'\n", filnam); ! 344: } ! 345: return (fsym); ! 346: } ! 347: ! 348: setvar() ! 349: { ! 350: ! 351: var[varchk('b')] = datbase; ! 352: var[varchk('d')] = datsize; ! 353: var[varchk('e')] = entry; ! 354: var[varchk('m')] = magic; ! 355: var[varchk('s')] = stksize; ! 356: var[varchk('t')] = txtsize; ! 357: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.