xref: /csrg-svn/old/adb/adb.vax/access.c (revision 3753)
1 #
2 /*
3  *
4  *	UNIX debugger
5  *
6  */
7 
8 #include "defs.h"
9 static	char sccsid[] = "@(#)access.c 4.1 05/14/81";
10 
11 MSG		ODDADR;
12 MSG		BADDAT;
13 MSG		BADTXT;
14 MAP		txtmap;
15 MAP		datmap;
16 INT		wtflag;
17 STRING		errflg;
18 INT		errno;
19 
20 INT		pid;
21 
22 /* file handling and access routines */
23 
24 put(adr,space,value)
25 #ifndef EDDT
26 L_INT	adr;
27 {
28 	access(WT,adr,space,value);
29 }
30 #else
31 	L_INT *adr; {*adr=value;}
32 #endif
33 
34 POS	get(adr, space)
35 #ifndef EDDT
36 L_INT		adr;
37 {
38 	return(access(RD,adr,space,0));
39 }
40 #else
41 	L_INT *adr; {return(*adr);}
42 #endif
43 
44 POS	chkget(n, space)
45 L_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 
58 POS bchkget(n, space)
59 L_INT	n;
60 {
61 	return(chkget(n, space) & LOBYTE);
62 }
63 
64 #ifndef EDDT
65 access(mode,adr,space,value)
66 L_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 
109 chkmap(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 
125 within(adr,lbd,ubd)
126 POS	adr, lbd, ubd;
127 {
128 	return(adr>=lbd && adr<ubd);
129 }
130 
131 longseek(f, a)
132 L_INT a;
133 {
134 	return(lseek(f,a,0) != -1);
135 }
136