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