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