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