|
|
1.1 ! root 1: /* ! 2: * access the files: ! 3: * read or write data from some address in some space ! 4: */ ! 5: ! 6: #include "defs.h" ! 7: #include "regs.h" ! 8: #include <sys/param.h> ! 9: ! 10: /* ! 11: * routines to get/put various types ! 12: */ ! 13: ! 14: TLONG ! 15: lget(addr, space) ! 16: ADDR addr; ! 17: int space; ! 18: { ! 19: TLONG x; ! 20: ! 21: if ((space & SPTYPE) == NOSP) ! 22: return (wtol(dot)); ! 23: if (fget(addr, space, (char *)&x, sizeof(x)) == 0) ! 24: return (0); ! 25: return (x); ! 26: } ! 27: ! 28: TSHORT ! 29: sget(addr, space) ! 30: ADDR addr; ! 31: int space; ! 32: { ! 33: TSHORT x; ! 34: ! 35: if ((space & SPTYPE) == NOSP) ! 36: return (wtos(dot)); ! 37: if (fget(addr, space, (char *)&x, sizeof(x)) == 0) ! 38: return (0); ! 39: return (x); ! 40: } ! 41: ! 42: TCHAR ! 43: cget(addr, space) ! 44: ADDR addr; ! 45: int space; ! 46: { ! 47: TCHAR x; ! 48: ! 49: if ((space & SPTYPE) == NOSP) ! 50: return (wtoc(dot)); ! 51: if (fget(addr, space, (char *)&x, sizeof(x)) == 0) ! 52: return (0); ! 53: return (x); ! 54: } ! 55: ! 56: TADDR ! 57: aget(addr, space) ! 58: ADDR addr; ! 59: int space; ! 60: { ! 61: TADDR x; ! 62: ! 63: if ((space & SPTYPE) == NOSP) ! 64: return (wtoa(dot)); ! 65: if (fget(addr, space, (char *)&x, sizeof(x)) == 0) ! 66: return (0); ! 67: return (x); ! 68: } ! 69: ! 70: lput(addr, space, v) ! 71: ADDR addr; ! 72: int space; ! 73: TLONG v; ! 74: { ! 75: ! 76: return (fput(addr, space, (char *)&v, sizeof(v))); ! 77: } ! 78: ! 79: sput(addr, space, v) ! 80: ADDR addr; ! 81: int space; ! 82: TSHORT v; ! 83: { ! 84: ! 85: return (fput(addr, space, (char *)&v, sizeof(v))); ! 86: } ! 87: ! 88: cput(addr, space, v) ! 89: ADDR addr; ! 90: int space; ! 91: TCHAR v; ! 92: { ! 93: ! 94: return (fput(addr, space, (char *)&v, sizeof(v))); ! 95: } ! 96: ! 97: aput(addr, space, v) ! 98: ADDR addr; ! 99: int space; ! 100: TADDR v; ! 101: { ! 102: ! 103: return (fput(addr, space, (char *)&v, sizeof(v))); ! 104: } ! 105: ! 106: /* ! 107: * the real io code ! 108: */ ! 109: ! 110: int ! 111: fget(addr, space, buf, size) ! 112: ADDR addr; ! 113: register int space; ! 114: char *buf; ! 115: int size; ! 116: { ! 117: int fd; ! 118: off_t off; ! 119: ADDR oa; ! 120: ADDR regaddr(); ! 121: off_t lseek(); ! 122: ! 123: if ((space & SPTYPE) == NOSP) { ! 124: memset(buf, 0, size); ! 125: memcpy(buf, (char *)&dot, size < sizeof(dot) ? sizeof(dot) : size); ! 126: return (1); ! 127: } ! 128: if (space & SYMF) ! 129: fd = fsym; ! 130: else ! 131: fd = fcor; ! 132: oa = addr; ! 133: if ((space & SPTYPE) == REGSP) { ! 134: if (space & SYMF) { ! 135: errflg = "registers in corefile only"; ! 136: return (0); ! 137: } ! 138: if ((addr = regaddr(addr)) == 0) ! 139: return (intrget(oa, buf, size)); ! 140: space &=~ SPTYPE; ! 141: space |= DATASP; ! 142: } ! 143: if (reloc(addr, space, &off) == 0) ! 144: return (0); ! 145: if (lseek(fd, off, 0) == -1 ! 146: || read(fd, buf, size) != size) { ! 147: if ((space & SPTYPE) == INSTSP) ! 148: errflg = "can't read text"; ! 149: else ! 150: errflg = "can't read data"; ! 151: return (0); ! 152: } ! 153: return (1); ! 154: } ! 155: ! 156: int ! 157: fput(addr, space, buf, size) ! 158: ADDR addr; ! 159: register int space; ! 160: char *buf; ! 161: int size; ! 162: { ! 163: int fd; ! 164: off_t off; ! 165: ADDR oa; ! 166: ADDR regaddr(); ! 167: off_t lseek(); ! 168: ! 169: if ((space & SPTYPE) == NOSP) ! 170: return (0); ! 171: if (wtflag == 0 ! 172: && !((space & SYMF) == 0 && pid)) ! 173: error("not in write mode"); ! 174: if (space & SYMF) ! 175: fd = fsym; ! 176: else ! 177: fd = fcor; ! 178: oa = addr; ! 179: if ((space & SPTYPE) == REGSP) { ! 180: if (space & SYMF) { ! 181: errflg = "registers in corefile only"; ! 182: return (0); ! 183: } ! 184: if ((addr = regaddr(addr)) == 0) ! 185: return (intrput(oa, buf, size)); ! 186: space &=~ SPTYPE; ! 187: space |= DATASP; ! 188: } ! 189: if (reloc(addr, space, &off) == 0) ! 190: return (0); ! 191: if (lseek(fd, off, 0) == -1 ! 192: || write(fd, buf, size) != size) { ! 193: if ((space & SPTYPE) == INSTSP) ! 194: errflg = "can't write text"; ! 195: else ! 196: errflg = "can't write data"; ! 197: return (0); ! 198: } ! 199: return (1); ! 200: } ! 201: ! 202: /* ! 203: * register address hacks ! 204: * if the register allegedly has an address (e.g. we're knee deep in ! 205: * stack frames), return that ! 206: * otherwise do fake io to our internal copies of registers ! 207: * awful ! 208: */ ! 209: ! 210: static ADDR ! 211: regaddr(reg) ! 212: register ADDR reg; ! 213: { ! 214: extern ADDR raddr[]; ! 215: ! 216: reg /= sizeof(TREG); ! 217: if (MINREG <= reg && reg <= MAXREG) ! 218: return (raddr[reg - MINREG]); ! 219: return (0); ! 220: } ! 221: ! 222: static int ! 223: intrget(reg, buf, size) ! 224: ADDR reg; ! 225: char *buf; ! 226: { ! 227: register char *p, *q; ! 228: register int n; ! 229: register int rnum; ! 230: TREG r; ! 231: extern int roffs[]; ! 232: ! 233: for (p = buf, n = size; n > 0; n--) ! 234: *p++ = 0; ! 235: rnum = reg / sizeof(TREG); ! 236: if (rnum < MINREG) ! 237: return (0); ! 238: p = buf; ! 239: while (rnum <= MAXREG && size > 0) { ! 240: r = rget(roffs[rnum - MINREG]); ! 241: for (q = (char *)&r, n = sizeof(TREG); n > 0; n--) ! 242: *p++ = *q++; ! 243: size -= sizeof(TREG); ! 244: rnum++; ! 245: } ! 246: return (size <= 0); ! 247: } ! 248: ! 249: static int ! 250: intrput(reg, buf, size) ! 251: ADDR reg; ! 252: char *buf; ! 253: { ! 254: register char *p, *q; ! 255: register int n; ! 256: register int rnum; ! 257: TREG r; ! 258: extern int roffs[]; ! 259: ! 260: rnum = reg / sizeof(TREG); ! 261: if (rnum < MINREG) ! 262: return (0); ! 263: p = buf; ! 264: while (rnum <= MAXREG && size > 0) { ! 265: r = rget(roffs[rnum - MINREG]); ! 266: for (q = (char *)&r, n = sizeof(TREG); n > 0 && size > 0; n--, size--) ! 267: *q++ = *p++; ! 268: rput(roffs[rnum - MINREG], r); ! 269: rnum++; ! 270: } ! 271: return (size <= 0); ! 272: } ! 273: ! 274: /* ! 275: * turn address to file offset ! 276: * returns nonzero if ok ! 277: */ ! 278: ! 279: ! 280: int ! 281: reloc(addr, space, offp) ! 282: ADDR addr; ! 283: register int space; ! 284: off_t *offp; ! 285: { ! 286: register struct map *mp; ! 287: ! 288: for (mp = (space & SYMF) ? symmap : cormap; mp->flag & MPINUSE; mp++) ! 289: if ((space & SPTYPE) == (mp->sp & SPTYPE) ! 290: && mp->b <= addr && addr < mp->e) { ! 291: addr += mp->f - mp->b; ! 292: if ((space & (SYMF|RAWADDR)) == 0) ! 293: if (kmap(&addr, space) == 0) ! 294: return (0); ! 295: *offp = addr; ! 296: return (1); ! 297: } ! 298: /* ! 299: * if we wanted instruction space and didn't find it, ! 300: * try data space now ! 301: */ ! 302: if ((space & SPTYPE) == INSTSP) { ! 303: space &=~ SPTYPE; ! 304: space |= DATASP; ! 305: for (mp = (space & SYMF) ? symmap : cormap; mp->flag & MPINUSE; mp++) ! 306: if ((space & SPTYPE) == (mp->sp & SPTYPE) ! 307: && mp->b <= addr && addr < mp->e) { ! 308: addr += mp->f - mp->b; ! 309: if ((space & (SYMF|RAWADDR)) == 0) ! 310: if (kmap(&addr, space) == 0) ! 311: return (0); ! 312: *offp = addr; ! 313: return (1); ! 314: } ! 315: } ! 316: if (space & SYMF) ! 317: errflg = "text address not found"; ! 318: else ! 319: errflg = "data address not found"; ! 320: return (0); ! 321: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.