1 static char sccsid[] = "@(#)access.c 4.2 08/17/82";
2 #
3 /*
4 *
5 * UNIX debugger
6 *
7 */
8
9 #include "head.h"
10 struct user u;
11
12
13 MSG BADDAT;
14 MSG BADTXT;
15 MAP txtmap;
16 MAP datmap;
17 STRING errflg;
18 int errno;
19
20 INT pid;
21
22
23
24
25 /* file handling and access routines */
26
27 int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
28
29 /* get data at loc using descriptor format d */
30 long
getval(loc,d,space)31 getval(loc, d, space)
32 ADDR loc;
33 char d; {
34 register int val;
35
36 val = get(loc, space);
37 val &= dmask[dtol(d)];
38 return(val);
39 }
40
41 /* put value at loc using descriptor format d */
putval(loc,d,value)42 putval(loc, d, value)
43 ADDR loc; char d; long value; {
44 register long val;
45
46 val = get(loc, DSP);
47 val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
48 put(loc, DSP, val);
49 }
50
51 /* put value in named register using descriptor format d */
putreg(reg,d,value)52 putreg(reg, d, value)
53 ADDR reg; char d; long value; {
54 register long val;
55
56 val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
57 val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
58 *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
59 }
60
put(adr,space,value)61 put(adr,space,value)
62 L_INT adr;
63 {
64 access(WT,adr,space,value);
65 }
66
get(adr,space)67 POS get(adr, space)
68 L_INT adr;
69 {
70 return(access(RD,adr,space,0));
71 }
72
73
access(mode,adr,space,value)74 access(mode,adr,space,value)
75 L_INT adr;
76 {
77 INT pmode,rd,file;
78 ADDR w;
79 if (debug)
80 printf("access(mode=%d,adr=%d,space=%d,value=%d) with pid %d\n",
81 mode, adr, space, value, pid);
82 rd = mode==RD;
83
84 IF space == NSP THEN return(0); FI
85
86 IF pid /* tracing on? */
87 THEN
88 #ifndef vax
89 IF adr&01 ANDF !rd THEN error(ODDADR); FI
90 #endif
91 pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
92 w = ptrace(pmode, pid, adr, value);
93 if (debug)
94 printf("ptrace(%d,%d,%d,%d) = %d with error=%d\n",
95 pmode, pid, adr, value, w, errno);
96 #ifndef vax
97 IF adr&01
98 THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
99 w = (w>>8)&LOBYTE | (w1<<8);
100 FI
101 #endif
102 IF errno
103 THEN errflg = (space&DSP ? BADDAT : BADTXT);
104 FI
105 return(w);
106 FI
107 w = 0;
108 IF !chkmap(&adr,space)
109 THEN return(0);
110 FI
111 file=(space&DSP?datmap.ufd:txtmap.ufd);
112 if (longseek(file,adr)==0 ||
113 (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1)
114 errflg=(space&DSP?BADDAT:BADTXT);
115 return(w);
116
117 }
118
chkmap(adr,space)119 chkmap(adr,space)
120 REG L_INT *adr;
121 REG INT space;
122 {
123 REG MAPPTR amap;
124 amap=((space&DSP?&datmap:&txtmap));
125 IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
126 THEN if (within(*adr,amap->b2,amap->e2))
127 *adr += (amap->f2)-(amap->b2);
128 else {
129 errflg=(space&DSP?BADDAT:BADTXT); return(0);
130 }
131 ELSE *adr += (amap->f1)-(amap->b1);
132 FI
133 return(1);
134 }
135
within(adr,lbd,ubd)136 within(adr,lbd,ubd)
137 POS adr, lbd, ubd;
138 {
139 return(adr>=lbd && adr<ubd);
140 }
141
142 /* ------------ */
chkget(n,space)143 POS chkget(n, space)
144 L_INT n;
145 {
146 #ifndef vax
147 REG INT w;
148 #else
149 REG L_INT w;
150 #endif
151
152 w = get(n, space);
153 chkerr();
154 return(w);
155 }
156
bchkget(n,space)157 POS bchkget(n, space)
158 L_INT n;
159 {
160 return(chkget(n, space) & LOBYTE);
161 }
162