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