xref: /csrg-svn/old/sdb/access.c (revision 7773)
1*7773Srrh static	char sccsid[] = "@(#)access.c 4.2 08/17/82";
21327Sbill #
31327Sbill /*
41327Sbill  *
51327Sbill  *	UNIX debugger
61327Sbill  *
71327Sbill  */
81327Sbill 
91327Sbill #include "head.h"
101327Sbill struct user u;
111327Sbill 
121327Sbill 
131327Sbill MSG		BADDAT;
141327Sbill MSG		BADTXT;
151327Sbill MAP		txtmap;
161327Sbill MAP		datmap;
171327Sbill STRING		errflg;
181327Sbill int		errno;
191327Sbill 
201327Sbill INT		pid;
211327Sbill 
221327Sbill 
231327Sbill 
241327Sbill 
251327Sbill /* file handling and access routines */
261327Sbill 
271327Sbill int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
281327Sbill 
291327Sbill /* get data at loc using descriptor format d */
301327Sbill long
getval(loc,d,space)311327Sbill getval(loc, d, space)
321327Sbill ADDR loc;
331327Sbill char d; {
341327Sbill 	register int val;
351327Sbill 
361327Sbill 	val = get(loc, space);
371327Sbill 	val &= dmask[dtol(d)];
381327Sbill 	return(val);
391327Sbill }
401327Sbill 
411327Sbill /* put value at loc using descriptor format d */
putval(loc,d,value)421327Sbill putval(loc, d, value)
431327Sbill ADDR loc; char d; long value; {
441327Sbill 	register long val;
451327Sbill 
461327Sbill 	val = get(loc, DSP);
471327Sbill 	val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
481327Sbill 	put(loc, DSP, val);
491327Sbill }
501327Sbill 
511327Sbill /* put value in named register using descriptor format d */
putreg(reg,d,value)521327Sbill putreg(reg, d, value)
531327Sbill ADDR reg; char d; long value; {
541327Sbill 	register long val;
551327Sbill 
561327Sbill 	val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
571327Sbill 	val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
581327Sbill 	*(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
591327Sbill }
601327Sbill 
put(adr,space,value)611327Sbill put(adr,space,value)
621327Sbill L_INT	adr;
631327Sbill {
641327Sbill 	access(WT,adr,space,value);
651327Sbill }
661327Sbill 
get(adr,space)671327Sbill POS	get(adr, space)
681327Sbill L_INT		adr;
691327Sbill {
701327Sbill 	return(access(RD,adr,space,0));
711327Sbill }
721327Sbill 
731327Sbill 
access(mode,adr,space,value)741327Sbill access(mode,adr,space,value)
751327Sbill L_INT	adr;
761327Sbill {
771327Sbill 	INT	pmode,rd,file;
781327Sbill 	ADDR	w;
791327Sbill 	if (debug)
801327Sbill 		printf("access(mode=%d,adr=%d,space=%d,value=%d) with pid %d\n",
811327Sbill 			mode, adr, space, value, pid);
821327Sbill 	rd = mode==RD;
831327Sbill 
841327Sbill 	IF space == NSP THEN return(0); FI
851327Sbill 
861327Sbill 	IF pid		/* tracing on? */
871327Sbill 	THEN
881327Sbill #ifndef vax
891327Sbill 		IF adr&01 ANDF !rd THEN error(ODDADR); FI
901327Sbill #endif
911327Sbill 	     pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
921327Sbill 	     w = ptrace(pmode, pid, adr, value);
931327Sbill 	     if (debug)
941327Sbill 		printf("ptrace(%d,%d,%d,%d) = %d with error=%d\n",
951327Sbill 			pmode, pid, adr, value, w, errno);
961327Sbill #ifndef vax
971327Sbill 	     IF adr&01
981327Sbill 	     THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
991327Sbill 		  w = (w>>8)&LOBYTE | (w1<<8);
1001327Sbill 	     FI
1011327Sbill #endif
1021327Sbill 	     IF errno
1031327Sbill 	     THEN errflg = (space&DSP ? BADDAT : BADTXT);
1041327Sbill 	     FI
1051327Sbill 	     return(w);
1061327Sbill 	FI
1071327Sbill 	w = 0;
1081327Sbill 	IF !chkmap(&adr,space)
1091327Sbill 	THEN return(0);
1101327Sbill 	FI
1111327Sbill 	file=(space&DSP?datmap.ufd:txtmap.ufd);
1121327Sbill 	if (longseek(file,adr)==0 ||
1131327Sbill 	   (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1)
1141327Sbill 		errflg=(space&DSP?BADDAT:BADTXT);
1151327Sbill 	return(w);
1161327Sbill 
1171327Sbill }
1181327Sbill 
chkmap(adr,space)1191327Sbill chkmap(adr,space)
1201327Sbill 	REG L_INT	*adr;
1211327Sbill 	REG INT		space;
1221327Sbill {
1231327Sbill 	REG MAPPTR amap;
1241327Sbill 	amap=((space&DSP?&datmap:&txtmap));
1251327Sbill 	IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
1261327Sbill 	THEN if (within(*adr,amap->b2,amap->e2))
1271327Sbill 		*adr += (amap->f2)-(amap->b2);
1281327Sbill 	     else {
1291327Sbill 		errflg=(space&DSP?BADDAT:BADTXT); return(0);
1301327Sbill 	     }
1311327Sbill 	ELSE *adr += (amap->f1)-(amap->b1);
1321327Sbill 	FI
1331327Sbill 	return(1);
1341327Sbill }
1351327Sbill 
within(adr,lbd,ubd)1361327Sbill within(adr,lbd,ubd)
1371327Sbill POS	adr, lbd, ubd;
1381327Sbill {
1391327Sbill 	return(adr>=lbd && adr<ubd);
1401327Sbill }
1411327Sbill 
1421327Sbill /* ------------ */
chkget(n,space)1431327Sbill POS	chkget(n, space)
1441327Sbill L_INT		n;
1451327Sbill {
1461327Sbill #ifndef vax
1471327Sbill 	REG INT		w;
1481327Sbill #else
1491327Sbill 	REG L_INT	w;
1501327Sbill #endif
1511327Sbill 
1521327Sbill 	w = get(n, space);
1531327Sbill 	chkerr();
1541327Sbill 	return(w);
1551327Sbill }
1561327Sbill 
bchkget(n,space)1571327Sbill POS bchkget(n, space)
1581327Sbill L_INT	n;
1591327Sbill {
1601327Sbill 	return(chkget(n, space) & LOBYTE);
1611327Sbill }
162