|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.