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