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