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