1: # 2: /* 3: * 4: * UNIX debugger 5: * 6: */ 7: 8: #include "defs.h" 9: 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: 23: 24: 25: /* file handling and access routines */ 26: 27: put(adr,space,value) 28: L_INT adr; 29: { 30: access(WT,adr,space,value); 31: } 32: 33: POS get(adr, space) 34: L_INT adr; 35: { 36: return(access(RD,adr,space,0)); 37: } 38: 39: POS chkget(n, space) 40: L_INT n; 41: { 42: REG INT w; 43: 44: w = get(n, space); 45: chkerr(); 46: return(w); 47: } 48: 49: access(mode,adr,space,value) 50: L_INT adr; 51: { 52: INT w, w1, pmode, rd, file; 53: rd = mode==RD; 54: 55: IF space == NSP THEN return(0); FI 56: 57: IF pid /* tracing on? */ 58: THEN IF (adr&01) ANDF !rd THEN error(ODDADR); FI 59: pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); 60: w = ptrace(pmode, pid, shorten(adr&~01), value); 61: IF adr&01 62: THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); 63: w = (w>>8)&LOBYTE | (w1<<8); 64: FI 65: IF errno 66: THEN errflg = (space&DSP ? BADDAT : BADTXT); 67: FI 68: return(w); 69: FI 70: w = 0; 71: IF mode==WT ANDF wtflag==0 72: THEN error("not in write mode"); 73: FI 74: IF !chkmap(&adr,space) 75: THEN return(0); 76: FI 77: file=(space&DSP?datmap.ufd:txtmap.ufd); 78: IF longseek(file,adr)==0 ORF 79: (rd ? read(file,&w,2) : write(file,&value,2)) < 1 80: THEN errflg=(space&DSP?BADDAT:BADTXT); 81: FI 82: return(w); 83: 84: } 85: 86: chkmap(adr,space) 87: REG L_INT *adr; 88: REG INT space; 89: { 90: REG MAPPTR amap; 91: amap=((space&DSP?&datmap:&txtmap)); 92: IF space&STAR ORF !within(*adr,amap->b1,amap->e1) 93: THEN IF within(*adr,amap->b2,amap->e2) 94: THEN *adr += (amap->f2)-(amap->b2); 95: ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); 96: FI 97: ELSE *adr += (amap->f1)-(amap->b1); 98: FI 99: return(1); 100: } 101: 102: within(adr,lbd,ubd) 103: L_INT adr, lbd, ubd; 104: { 105: return(adr>=lbd && adr<ubd); 106: }