|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)rdwr.c 5.1 (Berkeley) 6/6/85";
9: #endif not lint
10: /*
11: * These routines are used to access the debuggee process from
12: * outside the "process" module.
13: *
14: * They invoke "pio" which eventually leads to a call to "ptrace".
15: * The system generates an I/O error when a ptrace fails, we catch
16: * that here and assume its due to a misguided address.
17: */
18:
19: #include "defs.h"
20: #include <errno.h>
21: #include "process.h"
22: #include "process.rep"
23:
24: # if (isvaxpx)
25: # include "pxinfo.h"
26: # endif
27:
28: typedef int INTFUNC();
29:
30: extern INTFUNC *onsyserr();
31:
32: LOCAL badaddr;
33: LOCAL rwerr();
34:
35: /*
36: * Read from the process' instruction area. For px, this is actually
37: * the data area.
38: */
39:
40: iread(buff, addr, nbytes)
41: char *buff;
42: ADDRESS addr;
43: int nbytes;
44: {
45: INTFUNC *f;
46:
47: f = onsyserr(EIO, &rwerr);
48: # if (isvaxpx)
49: badaddr = addr + ENDOFF;
50: pio(process, PREAD, DATASEG, buff, addr + ENDOFF, nbytes);
51: # else
52: badaddr = addr;
53: pio(process, PREAD, TEXTSEG, buff, addr, nbytes);
54: # endif
55: onsyserr(EIO, f);
56: }
57:
58: /*
59: * Write to the process' instruction area, usually in order to set
60: * or unset a breakpoint.
61: */
62:
63: iwrite(buff, addr, nbytes)
64: char *buff;
65: ADDRESS addr;
66: int nbytes;
67: {
68: INTFUNC *f;
69:
70: f = onsyserr(EIO, &rwerr);
71: # if (isvaxpx)
72: badaddr = addr + ENDOFF;
73: pio(process, PWRITE, DATASEG, buff, addr + ENDOFF, nbytes);
74: # else
75: badaddr = addr;
76: pio(process, PWRITE, TEXTSEG, buff, addr, nbytes);
77: # endif
78: onsyserr(EIO, f);
79: }
80:
81: /*
82: * Read for the process' data area.
83: */
84:
85: dread(buff, addr, nbytes)
86: char *buff;
87: ADDRESS addr;
88: int nbytes;
89: {
90: INTFUNC *f;
91:
92: f = onsyserr(EIO, &rwerr);
93: badaddr = addr;
94: pio(process, PREAD, DATASEG, buff, addr, nbytes);
95: onsyserr(EIO, f);
96: }
97:
98: /*
99: * Write to the process' data area.
100: */
101:
102: dwrite(buff, addr, nbytes)
103: char *buff;
104: ADDRESS addr;
105: int nbytes;
106: {
107: INTFUNC *f;
108:
109: f = onsyserr(EIO, &rwerr);
110: badaddr = addr;
111: pio(process, PWRITE, DATASEG, buff, addr, nbytes);
112: onsyserr(EIO, f);
113: }
114:
115: /*
116: * Error handler.
117: */
118:
119: LOCAL rwerr()
120: {
121: error("bad read/write process address 0x%x", badaddr);
122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.