xref: /csrg-svn/old/sdb/access.c (revision 1327)
1*1327Sbill static	char sccsid[] = "@(#)access.c 4.1 10/09/80";
2*1327Sbill #
3*1327Sbill /*
4*1327Sbill  *
5*1327Sbill  *	UNIX debugger
6*1327Sbill  *
7*1327Sbill  */
8*1327Sbill 
9*1327Sbill #include "head.h"
10*1327Sbill struct user u;
11*1327Sbill 
12*1327Sbill 
13*1327Sbill MSG		BADDAT;
14*1327Sbill MSG		BADTXT;
15*1327Sbill MAP		txtmap;
16*1327Sbill MAP		datmap;
17*1327Sbill STRING		errflg;
18*1327Sbill int		errno;
19*1327Sbill 
20*1327Sbill INT		pid;
21*1327Sbill 
22*1327Sbill 
23*1327Sbill 
24*1327Sbill 
25*1327Sbill /* file handling and access routines */
26*1327Sbill 
27*1327Sbill int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
28*1327Sbill 
29*1327Sbill /* get data at loc using descriptor format d */
30*1327Sbill long
31*1327Sbill getval(loc, d, space)
32*1327Sbill ADDR loc;
33*1327Sbill char d; {
34*1327Sbill 	register int val;
35*1327Sbill 
36*1327Sbill 	val = get(loc, space);
37*1327Sbill 	val &= dmask[dtol(d)];
38*1327Sbill 	return(val);
39*1327Sbill }
40*1327Sbill 
41*1327Sbill /* put value at loc using descriptor format d */
42*1327Sbill putval(loc, d, value)
43*1327Sbill ADDR loc; char d; long value; {
44*1327Sbill 	register long val;
45*1327Sbill 
46*1327Sbill 	val = get(loc, DSP);
47*1327Sbill 	val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
48*1327Sbill 	put(loc, DSP, val);
49*1327Sbill }
50*1327Sbill 
51*1327Sbill /* put value in named register using descriptor format d */
52*1327Sbill putreg(reg, d, value)
53*1327Sbill ADDR reg; char d; long value; {
54*1327Sbill 	register long val;
55*1327Sbill 
56*1327Sbill 	val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
57*1327Sbill 	val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
58*1327Sbill 	*(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
59*1327Sbill }
60*1327Sbill 
61*1327Sbill put(adr,space,value)
62*1327Sbill L_INT	adr;
63*1327Sbill {
64*1327Sbill 	access(WT,adr,space,value);
65*1327Sbill }
66*1327Sbill 
67*1327Sbill POS	get(adr, space)
68*1327Sbill L_INT		adr;
69*1327Sbill {
70*1327Sbill 	return(access(RD,adr,space,0));
71*1327Sbill }
72*1327Sbill 
73*1327Sbill 
74*1327Sbill access(mode,adr,space,value)
75*1327Sbill L_INT	adr;
76*1327Sbill {
77*1327Sbill 	INT	pmode,rd,file;
78*1327Sbill 	ADDR	w;
79*1327Sbill 	if (debug)
80*1327Sbill 		printf("access(mode=%d,adr=%d,space=%d,value=%d) with pid %d\n",
81*1327Sbill 			mode, adr, space, value, pid);
82*1327Sbill 	rd = mode==RD;
83*1327Sbill 
84*1327Sbill 	IF space == NSP THEN return(0); FI
85*1327Sbill 
86*1327Sbill 	IF pid		/* tracing on? */
87*1327Sbill 	THEN
88*1327Sbill #ifndef vax
89*1327Sbill 		IF adr&01 ANDF !rd THEN error(ODDADR); FI
90*1327Sbill #endif
91*1327Sbill 	     pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
92*1327Sbill 	     w = ptrace(pmode, pid, adr, value);
93*1327Sbill 	     if (debug)
94*1327Sbill 		printf("ptrace(%d,%d,%d,%d) = %d with error=%d\n",
95*1327Sbill 			pmode, pid, adr, value, w, errno);
96*1327Sbill #ifndef vax
97*1327Sbill 	     IF adr&01
98*1327Sbill 	     THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
99*1327Sbill 		  w = (w>>8)&LOBYTE | (w1<<8);
100*1327Sbill 	     FI
101*1327Sbill #endif
102*1327Sbill 	     IF errno
103*1327Sbill 	     THEN errflg = (space&DSP ? BADDAT : BADTXT);
104*1327Sbill 	     FI
105*1327Sbill 	     return(w);
106*1327Sbill 	FI
107*1327Sbill 	w = 0;
108*1327Sbill 	IF !chkmap(&adr,space)
109*1327Sbill 	THEN return(0);
110*1327Sbill 	FI
111*1327Sbill 	file=(space&DSP?datmap.ufd:txtmap.ufd);
112*1327Sbill 	if (longseek(file,adr)==0 ||
113*1327Sbill 	   (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1)
114*1327Sbill 		errflg=(space&DSP?BADDAT:BADTXT);
115*1327Sbill 	return(w);
116*1327Sbill 
117*1327Sbill }
118*1327Sbill 
119*1327Sbill chkmap(adr,space)
120*1327Sbill 	REG L_INT	*adr;
121*1327Sbill 	REG INT		space;
122*1327Sbill {
123*1327Sbill 	REG MAPPTR amap;
124*1327Sbill 	amap=((space&DSP?&datmap:&txtmap));
125*1327Sbill 	IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
126*1327Sbill 	THEN if (within(*adr,amap->b2,amap->e2))
127*1327Sbill 		*adr += (amap->f2)-(amap->b2);
128*1327Sbill 	     else {
129*1327Sbill 		errflg=(space&DSP?BADDAT:BADTXT); return(0);
130*1327Sbill 	     }
131*1327Sbill 	ELSE *adr += (amap->f1)-(amap->b1);
132*1327Sbill 	FI
133*1327Sbill 	return(1);
134*1327Sbill }
135*1327Sbill 
136*1327Sbill within(adr,lbd,ubd)
137*1327Sbill POS	adr, lbd, ubd;
138*1327Sbill {
139*1327Sbill 	return(adr>=lbd && adr<ubd);
140*1327Sbill }
141*1327Sbill 
142*1327Sbill /* ------------ */
143*1327Sbill POS	chkget(n, space)
144*1327Sbill L_INT		n;
145*1327Sbill {
146*1327Sbill #ifndef vax
147*1327Sbill 	REG INT		w;
148*1327Sbill #else
149*1327Sbill 	REG L_INT	w;
150*1327Sbill #endif
151*1327Sbill 
152*1327Sbill 	w = get(n, space);
153*1327Sbill 	chkerr();
154*1327Sbill 	return(w);
155*1327Sbill }
156*1327Sbill 
157*1327Sbill POS bchkget(n, space)
158*1327Sbill L_INT	n;
159*1327Sbill {
160*1327Sbill 	return(chkget(n, space) & LOBYTE);
161*1327Sbill }
162