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