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