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