xref: /csrg-svn/old/adb/adb.vax/access.c (revision 3777)
13753Sroot #
23753Sroot /*
33753Sroot  *
43753Sroot  *	UNIX debugger
53753Sroot  *
63753Sroot  */
73753Sroot 
8*3777Sroot #define dprintf if (0) printf
9*3777Sroot 
103753Sroot #include "defs.h"
11*3777Sroot static	char sccsid[] = "@(#)access.c 4.2 05/14/81";
123753Sroot 
133753Sroot MSG		ODDADR;
143753Sroot MSG		BADDAT;
153753Sroot MSG		BADTXT;
163753Sroot MAP		txtmap;
173753Sroot MAP		datmap;
183753Sroot INT		wtflag;
193753Sroot STRING		errflg;
203753Sroot INT		errno;
213753Sroot 
223753Sroot INT		pid;
233753Sroot 
243753Sroot /* file handling and access routines */
253753Sroot 
263753Sroot put(adr,space,value)
273753Sroot #ifndef EDDT
283753Sroot L_INT	adr;
293753Sroot {
303753Sroot 	access(WT,adr,space,value);
313753Sroot }
323753Sroot #else
333753Sroot 	L_INT *adr; {*adr=value;}
343753Sroot #endif
353753Sroot 
363753Sroot POS	get(adr, space)
373753Sroot #ifndef EDDT
383753Sroot L_INT		adr;
393753Sroot {
403753Sroot 	return(access(RD,adr,space,0));
413753Sroot }
423753Sroot #else
433753Sroot 	L_INT *adr; {return(*adr);}
443753Sroot #endif
453753Sroot 
463753Sroot POS	chkget(n, space)
473753Sroot L_INT		n;
483753Sroot {
493753Sroot #ifndef vax
503753Sroot 	REG INT		w;
513753Sroot #else
523753Sroot 	REG L_INT	w;
533753Sroot #endif
543753Sroot 
553753Sroot 	w = get(n, space);
563753Sroot 	chkerr();
573753Sroot 	return(w);
583753Sroot }
593753Sroot 
603753Sroot POS bchkget(n, space)
613753Sroot L_INT	n;
623753Sroot {
633753Sroot 	return(chkget(n, space) & LOBYTE);
643753Sroot }
653753Sroot 
663753Sroot #ifndef EDDT
673753Sroot access(mode,adr,space,value)
68*3777Sroot long	adr;
693753Sroot {
703753Sroot 	INT	pmode,rd,file;
713753Sroot 	ADDR	w;
723753Sroot 	rd = mode==RD;
733753Sroot 
743753Sroot 	IF space == NSP THEN return(0); FI
753753Sroot 
763753Sroot 	IF pid		/* tracing on? */
773753Sroot 	THEN
783753Sroot #ifndef vax
793753Sroot 		IF adr&01 ANDF !rd THEN error(ODDADR); FI
803753Sroot #endif
813753Sroot 	     pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
823753Sroot 	     w = ptrace(pmode, pid, adr, value);
833753Sroot #ifndef vax
843753Sroot 	     IF adr&01
853753Sroot 	     THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
863753Sroot 		  w = (w>>8)&LOBYTE | (w1<<8);
873753Sroot 	     FI
883753Sroot #endif
893753Sroot 	     IF errno
903753Sroot 	     THEN errflg = (space&DSP ? BADDAT : BADTXT);
913753Sroot 	     FI
923753Sroot 	     return(w);
933753Sroot 	FI
943753Sroot 	w = 0;
953753Sroot 	IF mode==WT ANDF wtflag==0
963753Sroot 	THEN	error("not in write mode");
973753Sroot 	FI
983753Sroot 	IF !chkmap(&adr,space)
993753Sroot 	THEN return(0);
1003753Sroot 	FI
1013753Sroot 	file=(space&DSP?datmap.ufd:txtmap.ufd);
102*3777Sroot 	IF kernel && space == DSP THEN
103*3777Sroot 	    int oadr = adr;
104*3777Sroot 	    int v;
105*3777Sroot 	    adr &= ~0x80000000;
106*3777Sroot 	    IF oadr&0x80000000 THEN		/* system space */
107*3777Sroot 		v = btop(adr);
108*3777Sroot 		dprintf("system addr %X, v %X\n", adr, v);
109*3777Sroot 		IF v >= slr THEN errflg="bad system space addr"; return (0); FI
110*3777Sroot 		adr = vtoa(file, adr);
111*3777Sroot 		IF adr == -1 THEN
112*3777Sroot 		    errflg="sys page table page not valid"; return (0); FI
113*3777Sroot 	    ELIF adr&0x40000000 THEN		/* p1 space */
114*3777Sroot 		v = btop(adr&~0x40000000);
115*3777Sroot 		dprintf("p1 addr %X, v %X, p1br %X p1lr %X\n", adr, v,
116*3777Sroot 		    pcb.pcb_p1br, pcb.pcb_p1lr);
117*3777Sroot 		IF v < pcb.pcb_p1lr THEN
118*3777Sroot 		    errflg="bad p1 space addr"; return (0); FI
119*3777Sroot 		adr = vtoa(file, pcb.pcb_p1br+v);
120*3777Sroot 		IF adr == -1 THEN
121*3777Sroot 		    errflg="p1 page table page not valid"; return (0); FI
122*3777Sroot 		goto get;
123*3777Sroot 	    ELSE				/* p0 space */
124*3777Sroot 		dprintf("p0 addr %X, v %X, p0br %X p0lr %X\n", adr,
125*3777Sroot 		   v, pcb.pcb_p0br, pcb.pcb_p0lr);
126*3777Sroot 		IF v >= pcb.pcb_p0lr THEN
127*3777Sroot 		    errflg="bad p0 space addr"; return (0); FI
128*3777Sroot 		adr = vtoa(file, pcb.pcb_p0br+v);
129*3777Sroot 		IF adr == -1 THEN
130*3777Sroot 		    errflg="p0 page table page not valid"; return (0); FI
131*3777Sroot get:
132*3777Sroot 		dprintf("addr for pt page %X\n", adr);
133*3777Sroot 		IF physrw(file, adr, &adr, 1) < 0 THEN
134*3777Sroot 		    errflg = "page tables botched"; return (0); FI
135*3777Sroot 		dprintf("user pte value %X\n", adr);
136*3777Sroot 		IF (adr & PG_V) == 0 &&
137*3777Sroot 		    ((adr & PG_FOD) || (adr & PG_PFNUM) == 0) THEN
138*3777Sroot 		    errflg = "user page not resident"; return (0);
139*3777Sroot 		FI
140*3777Sroot 		adr = ((adr & 0xfffff) << 9) | (oadr & 0x1ff);
141*3777Sroot 	    FI
1423753Sroot 	FI
143*3777Sroot 	IF physrw(file, adr, &w, rd) < 0 THEN
144*3777Sroot 	    errflg=(space&DSP?BADDAT:BADTXT);
145*3777Sroot 	FI
1463753Sroot 	return(w);
1473753Sroot }
1483753Sroot #endif
1493753Sroot 
150*3777Sroot physrw(file, adr, aw, rd)
151*3777Sroot int *aw;
152*3777Sroot {
153*3777Sroot 
154*3777Sroot 	dprintf("physrw(%X) %s to %X\n", adr, rd ? "read" : "write", aw);
155*3777Sroot 	IF longseek(file,adr)==0 ORF
156*3777Sroot 	   (rd ? read(file,aw,sizeof(int)) : write(file,aw,sizeof(int))) < 1
157*3777Sroot 	THEN	 return (-1);
158*3777Sroot 	FI
159*3777Sroot 	return (0);
160*3777Sroot }
161*3777Sroot 
162*3777Sroot vtoa(file, va)
163*3777Sroot unsigned long va;
164*3777Sroot {
165*3777Sroot 	struct pte pte;
166*3777Sroot 
167*3777Sroot 	physrw(file, ((long)(sbr + btop(va&0x7fffffff)))&~0x80000000, &pte, 1);
168*3777Sroot 	dprintf("vtoa got pte %X\n", pte);
169*3777Sroot 	if (pte.pg_v || (pte.pg_fod == 0 && pte.pg_pfnum))
170*3777Sroot 		return (ptob(pte.pg_pfnum) + (va & PGOFSET));
171*3777Sroot 	errflg = "page not resident";
172*3777Sroot 	return (-1);
173*3777Sroot }
174*3777Sroot 
1753753Sroot chkmap(adr,space)
1763753Sroot 	REG L_INT	*adr;
1773753Sroot 	REG INT		space;
1783753Sroot {
1793753Sroot 	REG MAPPTR amap;
1803753Sroot 	amap=((space&DSP?&datmap:&txtmap));
1813753Sroot 	IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
1823753Sroot 	THEN IF within(*adr,amap->b2,amap->e2)
1833753Sroot 	     THEN *adr += (amap->f2)-(amap->b2);
1843753Sroot 	     ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
1853753Sroot 	     FI
1863753Sroot 	ELSE *adr += (amap->f1)-(amap->b1);
1873753Sroot 	FI
1883753Sroot 	return(1);
1893753Sroot }
1903753Sroot 
1913753Sroot within(adr,lbd,ubd)
1923753Sroot POS	adr, lbd, ubd;
1933753Sroot {
1943753Sroot 	return(adr>=lbd && adr<ubd);
1953753Sroot }
1963753Sroot 
1973753Sroot longseek(f, a)
1983753Sroot L_INT a;
1993753Sroot {
2003753Sroot 	return(lseek(f,a,0) != -1);
2013753Sroot }
202