BSD 4_1c_2 release
[unix-history] / usr / src / old / sdb / access.c
CommitLineData
e804469b 1static char sccsid[] = "@(#)access.c 4.2 8/17/82";
6e1e0fec
BJ
2#
3/*
4 *
5 * UNIX debugger
6 *
7 */
8
9#include "head.h"
10struct user u;
11
12
13MSG BADDAT;
14MSG BADTXT;
15MAP txtmap;
16MAP datmap;
17STRING errflg;
18int errno;
19
20INT pid;
21
22
23
24
25/* file handling and access routines */
26
27int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
28
29/* get data at loc using descriptor format d */
30long
31getval(loc, d, space)
32ADDR loc;
33char 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 */
42putval(loc, d, value)
43ADDR 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 */
52putreg(reg, d, value)
53ADDR 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
61put(adr,space,value)
62L_INT adr;
63{
64 access(WT,adr,space,value);
65}
66
67POS get(adr, space)
68L_INT adr;
69{
70 return(access(RD,adr,space,0));
71}
72
73
74access(mode,adr,space,value)
75L_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
119chkmap(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
136within(adr,lbd,ubd)
137POS adr, lbd, ubd;
138{
139 return(adr>=lbd && adr<ubd);
140}
141
142/* ------------ */
143POS chkget(n, space)
144L_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
157POS bchkget(n, space)
158L_INT n;
159{
160 return(chkget(n, space) & LOBYTE);
161}