BSD 4 release
[unix-history] / usr / src / cmd / adb / access.c
CommitLineData
5c1cc62c
BJ
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9static char sccsid[] = "%Z%%M% %I% %G%";
10
11MSG ODDADR;
12MSG BADDAT;
13MSG BADTXT;
14MAP txtmap;
15MAP datmap;
16INT wtflag;
17STRING errflg;
18INT errno;
19
20INT pid;
21
22/* file handling and access routines */
23
24put(adr,space,value)
25#ifndef EDDT
26L_INT adr;
27{
28 access(WT,adr,space,value);
29}
30#else
31 L_INT *adr; {*adr=value;}
32#endif
33
34POS get(adr, space)
35#ifndef EDDT
36L_INT adr;
37{
38 return(access(RD,adr,space,0));
39}
40#else
41 L_INT *adr; {return(*adr);}
42#endif
43
44POS chkget(n, space)
45L_INT n;
46{
47#ifndef vax
48 REG INT w;
49#else
50 REG L_INT w;
51#endif
52
53 w = get(n, space);
54 chkerr();
55 return(w);
56}
57
58POS bchkget(n, space)
59L_INT n;
60{
61 return(chkget(n, space) & LOBYTE);
62}
63
64#ifndef EDDT
65access(mode,adr,space,value)
66L_INT adr;
67{
68 INT pmode,rd,file;
69 ADDR w;
70 rd = mode==RD;
71
72 IF space == NSP THEN return(0); FI
73
74 IF pid /* tracing on? */
75 THEN
76#ifndef vax
77 IF adr&01 ANDF !rd THEN error(ODDADR); FI
78#endif
79 pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
80 w = ptrace(pmode, pid, adr, value);
81#ifndef vax
82 IF adr&01
83 THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
84 w = (w>>8)&LOBYTE | (w1<<8);
85 FI
86#endif
87 IF errno
88 THEN errflg = (space&DSP ? BADDAT : BADTXT);
89 FI
90 return(w);
91 FI
92 w = 0;
93 IF mode==WT ANDF wtflag==0
94 THEN error("not in write mode");
95 FI
96 IF !chkmap(&adr,space)
97 THEN return(0);
98 FI
99 file=(space&DSP?datmap.ufd:txtmap.ufd);
100 IF longseek(file,adr)==0 ORF
101 (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1
102 THEN errflg=(space&DSP?BADDAT:BADTXT);
103 FI
104 return(w);
105
106}
107#endif
108
109chkmap(adr,space)
110 REG L_INT *adr;
111 REG INT space;
112{
113 REG MAPPTR amap;
114 amap=((space&DSP?&datmap:&txtmap));
115 IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
116 THEN IF within(*adr,amap->b2,amap->e2)
117 THEN *adr += (amap->f2)-(amap->b2);
118 ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
119 FI
120 ELSE *adr += (amap->f1)-(amap->b1);
121 FI
122 return(1);
123}
124
125within(adr,lbd,ubd)
126POS adr, lbd, ubd;
127{
128 return(adr>=lbd && adr<ubd);
129}
130
131longseek(f, a)
132L_INT a;
133{
134 return(lseek(f,a,0) != -1);
135}