|
|
1.1 ! root 1: /* ! 2: * adb - routines to read a.out+core at startup ! 3: * things in struct exec are in vax (!!) byte order ! 4: */ ! 5: #include "defs.h" ! 6: #include "space.h" ! 7: #include "map.h" ! 8: #include "a.out.h" ! 9: #include "machine.h" ! 10: ! 11: char *symfil = "a.out"; ! 12: char *corfil = "core"; ! 13: ! 14: MAP symmap[NMAP]; ! 15: MAP cormap[NMAP]; ! 16: ! 17: int fsym, fcor; ! 18: ! 19: static ADDR datbase; ! 20: ADDR txtsize, datsize, stksize; ! 21: static ADDR entry; ! 22: static int magic; ! 23: ! 24: setsym() ! 25: { ! 26: ADDR loc; ! 27: struct exec hdr; ! 28: register MAP *mp; ! 29: char *malloc(); ! 30: ! 31: fsym = getfile(symfil, 1); ! 32: mp = symmap; ! 33: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr || ! 34: badmagic(hdr.a_magic)) { ! 35: mp->f = mp->b = 0; ! 36: mp->e = MAXFILE; ! 37: mp->sp = DATASP; ! 38: mp->flag = MPINUSE; ! 39: mp++; ! 40: mp->flag = 0; ! 41: return; ! 42: } ! 43: magic = hdr.a_magic; ! 44: entry = hdr.a_entry; ! 45: loc = hdr.a_text+hdr.a_data; ! 46: switch (magic) { ! 47: ! 48: case A_MAGIC1: ! 49: txtsize = 0; ! 50: datbase = 0; ! 51: datsize = loc; ! 52: mp->b = 0+hdr.a_unused; ! 53: mp->e = loc+hdr.a_unused; ! 54: mp->f = sizeof(hdr); ! 55: mp->sp = DATASP; ! 56: mp->flag = MPINUSE; ! 57: break; ! 58: ! 59: case A_MAGIC2: ! 60: mp->b = 0+hdr.a_unused; ! 61: mp->e = txtsize = hdr.a_text; ! 62: mp->e += hdr.a_unused; ! 63: mp->f = sizeof(hdr); ! 64: mp->sp = INSTSP; ! 65: mp->flag = MPINUSE; ! 66: mp++; ! 67: mp->b = datbase = round((WORD)hdr.a_text, (WORD)RRND)+hdr.a_unused; ! 68: mp->e = datsize = datbase + hdr.a_data; ! 69: mp->e += hdr.a_unused; ! 70: mp->f = sizeof(hdr) + hdr.a_text; ! 71: mp->sp = DATASP; ! 72: mp->flag = MPINUSE; ! 73: break; ! 74: ! 75: case A_MAGIC3: ! 76: mp->b = 0+hdr.a_unused; ! 77: mp->e = txtsize = hdr.a_text; ! 78: mp->e += hdr.a_unused; ! 79: mp->f = sizeof(hdr); ! 80: mp->sp = INSTSP; ! 81: mp->flag = MPINUSE; ! 82: mp++; ! 83: mp->b = datbase = 0; ! 84: mp->b += hdr.a_unused; ! 85: mp->e = datsize = datbase + hdr.a_data; ! 86: mp->e += hdr.a_unused; ! 87: mp->f = sizeof(hdr) + hdr.a_text; ! 88: mp->sp = DATASP; ! 89: mp->flag = MPINUSE; ! 90: break; ! 91: } ! 92: mp++; ! 93: mp->flag = 0; ! 94: syminit(&hdr); ! 95: } ! 96: ! 97: setcor() ! 98: { ! 99: register MAP *mp; ! 100: ! 101: fcor = getfile(corfil,2); ! 102: if (fcor < 0 ! 103: || mapimage() == 0) { ! 104: /* not a core image */ ! 105: ! 106: mp = cormap; ! 107: mp->b = 0; ! 108: mp->e = MAXFILE; ! 109: mp->f = 0; ! 110: mp->sp = DATASP; ! 111: mp->flag = MPINUSE; ! 112: mp++; ! 113: mp->flag = 0; ! 114: return; ! 115: } ! 116: } ! 117: ! 118: mapimage() ! 119: { ! 120: char x; ! 121: register struct map *mp; ! 122: ! 123: /* cheap hack for now */ ! 124: lseek(fcor, (long)MAXSTOR, 0); ! 125: if (read(fcor, &x, 1) != 1) ! 126: return (0); ! 127: mp = cormap; ! 128: mp->b = 0; ! 129: mp->e = MAXSTOR+UBLKSIZ; ! 130: mp->f = 0; ! 131: mp->sp = DATASP; ! 132: mp->flag = MPINUSE; ! 133: mp++; ! 134: mp->b = 0; ! 135: mp->e = UBLKSIZ; ! 136: mp->f = MAXSTOR; ! 137: mp->sp = UBLKSP; ! 138: mp->flag = MPINUSE; ! 139: mp++; ! 140: mp->flag = 0; ! 141: rsnarf(); ! 142: return (1); ! 143: } ! 144: ! 145: mapcore() ! 146: { ! 147: #if NOTDEF ! 148: struct user u; ! 149: register MAP *mp; ! 150: ! 151: lseek(fcor, (off_t)0, 0); ! 152: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u) ! 153: || badmagic(u.u_exdata.ux_mag)) ! 154: return (0); ! 155: if (magic && magic != u.u_exdata.ux_mag) ! 156: printf("%s: not from %s\n", corfil, symfil); ! 157: magic = u.u_exdata.ux_mag; ! 158: signo = u.u_arg[0]; ! 159: sigcode = u.u_code; ! 160: txtsize = ctob(u.u_tsize); ! 161: datsize = ctob(u.u_dsize); ! 162: stksize = ctob(u.u_ssize); ! 163: mp = cormap; ! 164: switch (magic) { ! 165: ! 166: case OMAGIC: ! 167: mp->b = 0; ! 168: mp->e = txtsize + datsize; ! 169: mp->f = ctob(UPAGES); ! 170: mp->sp = DATASP; ! 171: mp->flag = MPINUSE; ! 172: mp++; ! 173: mp->b = MAXSTOR - stksize; ! 174: mp->e = MAXSTOR; ! 175: mp->f = txtsize + datsize + ctob(UPAGES); ! 176: mp->sp = DATASP; ! 177: mp->flag = MPINUSE; ! 178: break; ! 179: ! 180: case NMAGIC: ! 181: case ZMAGIC: ! 182: mp->b = txtsize; ! 183: mp->e = mp->b + datsize; ! 184: mp->f = ctob(UPAGES); ! 185: mp->sp = DATASP; ! 186: mp->flag = MPINUSE; ! 187: mp++; ! 188: mp->b = MAXSTOR - stksize; ! 189: mp->e = MAXSTOR; ! 190: mp->f = datsize + ctob(UPAGES); ! 191: mp->sp = DATASP; ! 192: mp->flag = MPINUSE; ! 193: break; ! 194: } ! 195: mp++; ! 196: mp->b = 0; ! 197: mp->e = ctob(UPAGES); ! 198: mp->f = 0; ! 199: mp->sp = UBLKSP; ! 200: mp->flag = MPINUSE; ! 201: mp++; ! 202: mp->flag = 0; ! 203: rsnarf(); ! 204: return (1); ! 205: #endif ! 206: } ! 207: ! 208: badmagic(num) ! 209: long num; ! 210: { ! 211: ! 212: switch (num) { ! 213: case A_MAGIC1: ! 214: case A_MAGIC2: ! 215: case A_MAGIC3: ! 216: return (0); ! 217: ! 218: default: ! 219: return (1); ! 220: } ! 221: } ! 222: ! 223: cmdmap(itype, star) ! 224: register int star, itype; ! 225: { ! 226: register MAP *mp; ! 227: extern char lastc; ! 228: ! 229: if (itype & SYMF) ! 230: mp = symmap; ! 231: else ! 232: mp = cormap; ! 233: if (star) /* UGH */ ! 234: mp++; ! 235: if (expr(0)) ! 236: mp->b = expv; ! 237: if (expr(0)) ! 238: mp->e = expv; ! 239: if (expr(0)) ! 240: mp->f = expv; ! 241: mp->flag |= MPINUSE; ! 242: if (rdc()=='?' && (itype&SYMF) == 0) { ! 243: if (fcor) ! 244: close(fcor); ! 245: fcor=fsym; ! 246: corfil=symfil; ! 247: } else if (lastc == '/' && itype&SYMF) { ! 248: if (fsym) ! 249: close(fsym); ! 250: fsym=fcor; ! 251: symfil=corfil; ! 252: } else ! 253: reread(); ! 254: } ! 255: ! 256: acreate(f) ! 257: char *f; ! 258: { ! 259: register int fd; ! 260: ! 261: return(create(f, wtflag, 0666)); ! 262: } ! 263: ! 264: getfile(filnam, cnt) ! 265: char *filnam; ! 266: { ! 267: register int fsym; ! 268: ! 269: if (strcmp(filnam, "-") == 0) ! 270: return (-1); ! 271: fsym = open(filnam, wtflag); ! 272: if (fsym < 0 && xargc > cnt) { ! 273: if (wtflag) ! 274: fsym = acreate(filnam); ! 275: if (fsym < 0) ! 276: printf("cannot open `%s'\n", filnam); ! 277: } ! 278: return (fsym); ! 279: } ! 280: ! 281: setvar() ! 282: { ! 283: ! 284: var[varchk('b')] = datbase; ! 285: var[varchk('d')] = datsize; ! 286: var[varchk('e')] = entry; ! 287: var[varchk('m')] = magic; ! 288: var[varchk('s')] = stksize; ! 289: var[varchk('t')] = txtsize; ! 290: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.