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