|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "head.h"
9: struct user u;
10:
11:
12: MSG BADDAT;
13: MSG BADTXT;
14: MAP txtmap;
15: MAP datmap;
16: STRING errflg;
17: int errno;
18:
19: INT pid;
20:
21:
22:
23:
24: /* file handling and access routines */
25:
26: int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
27:
28: /* get data at loc using descriptor format d */
29: long
30: getval(loc, d)
31: ADDR loc;
32: char d; {
33: register int val;
34:
35: val = get(loc, DSP);
36: val &= dmask[dtol(d)];
37: return(val);
38: }
39:
40: /* put value at loc using descriptor format d */
41: putval(loc, d, value)
42: ADDR loc; char d; long value; {
43: register long val;
44:
45: val = get(loc, DSP);
46: val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
47: put(loc, DSP, val);
48: }
49:
50: /* put value in named register using descriptor format d */
51: putreg(reg, d, value)
52: ADDR reg; char d; long value; {
53: register long val;
54:
55: val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
56: val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
57: *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
58: }
59:
60: put(adr,space,value)
61: L_INT adr;
62: {
63: access(WT,adr,space,value);
64: }
65:
66: POS get(adr, space)
67: L_INT adr;
68: {
69: return(access(RD,adr,space,0));
70: }
71:
72:
73: access(mode,adr,space,value)
74: L_INT adr;
75: {
76: INT pmode,rd,file;
77: ADDR w;
78: rd = mode==RD;
79:
80: IF space == NSP THEN return(0); FI
81:
82: IF pid /* tracing on? */
83: THEN
84: #ifndef vax
85: IF adr&01 ANDF !rd THEN error(ODDADR); FI
86: #endif
87: pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
88: w = ptrace(pmode, pid, adr, value);
89: #ifndef vax
90: IF adr&01
91: THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
92: w = (w>>8)&LOBYTE | (w1<<8);
93: FI
94: #endif
95: IF errno
96: THEN errflg = (space&DSP ? BADDAT : BADTXT);
97: FI
98: return(w);
99: FI
100: w = 0;
101: IF !chkmap(&adr,space)
102: THEN return(0);
103: FI
104: file=(space&DSP?datmap.ufd:txtmap.ufd);
105: IF longseek(file,adr)==0 ORF
106: (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1
107: THEN errflg=(space&DSP?BADDAT:BADTXT);
108: FI
109: return(w);
110:
111: }
112:
113: chkmap(adr,space)
114: REG L_INT *adr;
115: REG INT space;
116: {
117: REG MAPPTR amap;
118: amap=((space&DSP?&datmap:&txtmap));
119: IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
120: THEN IF within(*adr,amap->b2,amap->e2)
121: THEN *adr += (amap->f2)-(amap->b2);
122: ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
123: FI
124: ELSE *adr += (amap->f1)-(amap->b1);
125: FI
126: return(1);
127: }
128:
129: within(adr,lbd,ubd)
130: POS adr, lbd, ubd;
131: {
132: return(adr>=lbd && adr<ubd);
133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.