Research V7 development
[unix-history] / usr / src / cmd / adb / access.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG ODDADR;
12MSG BADDAT;
13MSG BADTXT;
14MAP txtmap;
15MAP datmap;
16INT wtflag;
17STRING errflg;
18INT errno;
19
20INT pid;
21
22
23
24
25/* file handling and access routines */
26
27put(adr,space,value)
28L_INT adr;
29{
30 access(WT,adr,space,value);
31}
32
33POS get(adr, space)
34L_INT adr;
35{
36 return(access(RD,adr,space,0));
37}
38
39POS chkget(n, space)
40L_INT n;
41{
42 REG INT w;
43
44 w = get(n, space);
45 chkerr();
46 return(w);
47}
48
49access(mode,adr,space,value)
50L_INT adr;
51{
52 INT w, w1, pmode, rd, file;
53 rd = mode==RD;
54
55 IF space == NSP THEN return(0); FI
56
57 IF pid /* tracing on? */
58 THEN IF (adr&01) ANDF !rd THEN error(ODDADR); FI
59 pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
60 w = ptrace(pmode, pid, shorten(adr&~01), value);
61 IF adr&01
62 THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
63 w = (w>>8)&LOBYTE | (w1<<8);
64 FI
65 IF errno
66 THEN errflg = (space&DSP ? BADDAT : BADTXT);
67 FI
68 return(w);
69 FI
70 w = 0;
71 IF mode==WT ANDF wtflag==0
72 THEN error("not in write mode");
73 FI
74 IF !chkmap(&adr,space)
75 THEN return(0);
76 FI
77 file=(space&DSP?datmap.ufd:txtmap.ufd);
78 IF longseek(file,adr)==0 ORF
79 (rd ? read(file,&w,2) : write(file,&value,2)) < 1
80 THEN errflg=(space&DSP?BADDAT:BADTXT);
81 FI
82 return(w);
83
84}
85
86chkmap(adr,space)
87 REG L_INT *adr;
88 REG INT space;
89{
90 REG MAPPTR amap;
91 amap=((space&DSP?&datmap:&txtmap));
92 IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
93 THEN IF within(*adr,amap->b2,amap->e2)
94 THEN *adr += (amap->f2)-(amap->b2);
95 ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
96 FI
97 ELSE *adr += (amap->f1)-(amap->b1);
98 FI
99 return(1);
100}
101
102within(adr,lbd,ubd)
103L_INT adr, lbd, ubd;
104{
105 return(adr>=lbd && adr<ubd);
106}