1 # 2 /* 3 * 4 * UNIX debugger 5 * 6 */ 7 8 #include "defs.h" 9 static char sccsid[] = "@(#)access.c 4.1 05/14/81"; 10 11 MSG ODDADR; 12 MSG BADDAT; 13 MSG BADTXT; 14 MAP txtmap; 15 MAP datmap; 16 INT wtflag; 17 STRING errflg; 18 INT errno; 19 20 INT pid; 21 22 /* file handling and access routines */ 23 24 put(adr,space,value) 25 #ifndef EDDT 26 L_INT adr; 27 { 28 access(WT,adr,space,value); 29 } 30 #else 31 L_INT *adr; {*adr=value;} 32 #endif 33 34 POS get(adr, space) 35 #ifndef EDDT 36 L_INT adr; 37 { 38 return(access(RD,adr,space,0)); 39 } 40 #else 41 L_INT *adr; {return(*adr);} 42 #endif 43 44 POS chkget(n, space) 45 L_INT n; 46 { 47 #ifndef vax 48 REG INT w; 49 #else 50 REG L_INT w; 51 #endif 52 53 w = get(n, space); 54 chkerr(); 55 return(w); 56 } 57 58 POS bchkget(n, space) 59 L_INT n; 60 { 61 return(chkget(n, space) & LOBYTE); 62 } 63 64 #ifndef EDDT 65 access(mode,adr,space,value) 66 L_INT adr; 67 { 68 INT pmode,rd,file; 69 ADDR w; 70 rd = mode==RD; 71 72 IF space == NSP THEN return(0); FI 73 74 IF pid /* tracing on? */ 75 THEN 76 #ifndef vax 77 IF adr&01 ANDF !rd THEN error(ODDADR); FI 78 #endif 79 pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); 80 w = ptrace(pmode, pid, adr, value); 81 #ifndef vax 82 IF adr&01 83 THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); 84 w = (w>>8)&LOBYTE | (w1<<8); 85 FI 86 #endif 87 IF errno 88 THEN errflg = (space&DSP ? BADDAT : BADTXT); 89 FI 90 return(w); 91 FI 92 w = 0; 93 IF mode==WT ANDF wtflag==0 94 THEN error("not in write mode"); 95 FI 96 IF !chkmap(&adr,space) 97 THEN return(0); 98 FI 99 file=(space&DSP?datmap.ufd:txtmap.ufd); 100 IF longseek(file,adr)==0 ORF 101 (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1 102 THEN errflg=(space&DSP?BADDAT:BADTXT); 103 FI 104 return(w); 105 106 } 107 #endif 108 109 chkmap(adr,space) 110 REG L_INT *adr; 111 REG INT space; 112 { 113 REG MAPPTR amap; 114 amap=((space&DSP?&datmap:&txtmap)); 115 IF space&STAR ORF !within(*adr,amap->b1,amap->e1) 116 THEN IF within(*adr,amap->b2,amap->e2) 117 THEN *adr += (amap->f2)-(amap->b2); 118 ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); 119 FI 120 ELSE *adr += (amap->f1)-(amap->b1); 121 FI 122 return(1); 123 } 124 125 within(adr,lbd,ubd) 126 POS adr, lbd, ubd; 127 { 128 return(adr>=lbd && adr<ubd); 129 } 130 131 longseek(f, a) 132 L_INT a; 133 { 134 return(lseek(f,a,0) != -1); 135 } 136