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