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