|
|
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 = "2.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: struct exec hdr; ! 27: register MAP *mp; ! 28: char *malloc(); ! 29: ! 30: fsym = getfile(symfil, 1); ! 31: mp = symmap; ! 32: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr || ! 33: swal(hdr.a_magic) != A_MAGIC) { ! 34: mp->f = mp->b = 0; ! 35: mp->e = MAXFILE; ! 36: mp->sp = DATASP; ! 37: mp->flag = MPINUSE; ! 38: mp++; ! 39: mp->flag = 0; ! 40: return; ! 41: } ! 42: magic = swal(hdr.a_magic); ! 43: entry = swal(hdr.a_entry); ! 44: mp->b = PGSIZE; ! 45: txtsize = swal(hdr.a_text)+sizeof(hdr); ! 46: mp->e = txtsize + mp->b; ! 47: mp->f = 0; ! 48: mp->sp = INSTSP; ! 49: mp->flag = MPINUSE; ! 50: mp++; ! 51: datbase = round((WORD)swal(hdr.a_text)+sizeof(hdr), (WORD)PGSIZE) + PGSIZE; ! 52: mp->b = datbase; ! 53: mp->e = datsize = datbase + swal(hdr.a_data); ! 54: mp->f = sizeof(hdr) + swal(hdr.a_text); ! 55: mp->sp = DATASP; ! 56: mp->flag = MPINUSE; ! 57: mp++; ! 58: mp->flag = 0; ! 59: syminit(&hdr); ! 60: } ! 61: ! 62: setcor() ! 63: { ! 64: register MAP *mp; ! 65: ! 66: fcor = getfile(corfil,2); ! 67: #if NOTDEF ! 68: if (fcor < 0 ! 69: || (mapimage() == 0 && mapcore() == 0)) { ! 70: #endif ! 71: /* not a core image */ ! 72: ! 73: mp = cormap; ! 74: mp->b = 0; ! 75: mp->e = MAXFILE; ! 76: mp->f = 0; ! 77: mp->sp = DATASP; ! 78: mp->flag = MPINUSE; ! 79: mp++; ! 80: mp->flag = 0; ! 81: return; ! 82: #if NOTDEF ! 83: } ! 84: #endif ! 85: } ! 86: ! 87: mapcore() ! 88: { ! 89: #if NOTDEF ! 90: struct user u; ! 91: register MAP *mp; ! 92: ! 93: lseek(fcor, (off_t)0, 0); ! 94: if (read(fcor, (char *)&u, sizeof(u)) != sizeof(u) ! 95: || badmagic(u.u_exdata.ux_mag)) ! 96: return (0); ! 97: if (magic && magic != u.u_exdata.ux_mag) ! 98: printf("%s: not from %s\n", corfil, symfil); ! 99: magic = u.u_exdata.ux_mag; ! 100: signo = u.u_arg[0]; ! 101: sigcode = u.u_code; ! 102: txtsize = ctob(u.u_tsize); ! 103: datsize = ctob(u.u_dsize); ! 104: stksize = ctob(u.u_ssize); ! 105: mp = cormap; ! 106: switch (magic) { ! 107: ! 108: case OMAGIC: ! 109: mp->b = 0; ! 110: mp->e = txtsize + datsize; ! 111: mp->f = ctob(UPAGES); ! 112: mp->sp = DATASP; ! 113: mp->flag = MPINUSE; ! 114: mp++; ! 115: mp->b = MAXSTOR - stksize; ! 116: mp->e = MAXSTOR; ! 117: mp->f = txtsize + datsize + ctob(UPAGES); ! 118: mp->sp = DATASP; ! 119: mp->flag = MPINUSE; ! 120: break; ! 121: ! 122: case NMAGIC: ! 123: case ZMAGIC: ! 124: mp->b = txtsize; ! 125: mp->e = mp->b + datsize; ! 126: mp->f = ctob(UPAGES); ! 127: mp->sp = DATASP; ! 128: mp->flag = MPINUSE; ! 129: mp++; ! 130: mp->b = MAXSTOR - stksize; ! 131: mp->e = MAXSTOR; ! 132: mp->f = datsize + ctob(UPAGES); ! 133: mp->sp = DATASP; ! 134: mp->flag = MPINUSE; ! 135: break; ! 136: } ! 137: mp++; ! 138: mp->b = 0; ! 139: mp->e = ctob(UPAGES); ! 140: mp->f = 0; ! 141: mp->sp = UBLKSP; ! 142: mp->flag = MPINUSE; ! 143: mp++; ! 144: mp->flag = 0; ! 145: rsnarf(); ! 146: return (1); ! 147: #endif ! 148: } ! 149: ! 150: cmdmap(itype, star) ! 151: register int star, itype; ! 152: { ! 153: register MAP *mp; ! 154: extern char lastc; ! 155: ! 156: if (itype & SYMF) ! 157: mp = symmap; ! 158: else ! 159: mp = cormap; ! 160: if (star) /* UGH */ ! 161: mp++; ! 162: if (expr(0)) ! 163: mp->b = expv; ! 164: if (expr(0)) ! 165: mp->e = expv; ! 166: if (expr(0)) ! 167: mp->f = expv; ! 168: mp->flag |= MPINUSE; ! 169: if (rdc()=='?' && (itype&SYMF) == 0) { ! 170: if (fcor) ! 171: close(fcor); ! 172: fcor=fsym; ! 173: corfil=symfil; ! 174: } else if (lastc == '/' && itype&SYMF) { ! 175: if (fsym) ! 176: close(fsym); ! 177: fsym=fcor; ! 178: symfil=corfil; ! 179: } else ! 180: reread(); ! 181: } ! 182: ! 183: create(f) ! 184: char *f; ! 185: { ! 186: register int fd; ! 187: ! 188: fd = creat(f, 0666); ! 189: if (fd < 0) ! 190: return (-1); ! 191: close(fd); ! 192: return (open(f, wtflag)); ! 193: } ! 194: ! 195: getfile(filnam, cnt) ! 196: char *filnam; ! 197: { ! 198: register int fsym; ! 199: ! 200: if (strcmp(filnam, "-") == 0) ! 201: return (-1); ! 202: fsym = open(filnam, wtflag); ! 203: if (fsym < 0 && xargc > cnt) { ! 204: if (wtflag) ! 205: fsym = create(filnam); ! 206: if (fsym < 0) ! 207: printf("cannot open `%s'\n", filnam); ! 208: } ! 209: return (fsym); ! 210: } ! 211: ! 212: setvar() ! 213: { ! 214: ! 215: var[varchk('b')] = datbase; ! 216: var[varchk('d')] = datsize; ! 217: var[varchk('e')] = entry; ! 218: var[varchk('m')] = magic; ! 219: var[varchk('s')] = stksize; ! 220: var[varchk('t')] = txtsize; ! 221: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.