Commit | Line | Data |
---|---|---|
129925f4 TL |
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 | #ifndef EDDT | |
62 | L_INT adr; | |
63 | { | |
64 | access(WT,adr,space,value); | |
65 | } | |
66 | #else | |
67 | L_INT *adr; {*adr=value;} | |
68 | #endif | |
69 | ||
70 | POS get(adr, space) | |
71 | #ifndef EDDT | |
72 | L_INT adr; | |
73 | { | |
74 | return(access(RD,adr,space,0)); | |
75 | } | |
76 | #else | |
77 | L_INT *adr; {return(*adr);} | |
78 | #endif | |
79 | ||
80 | ||
81 | #ifndef EDDT | |
82 | access(mode,adr,space,value) | |
83 | L_INT adr; | |
84 | { | |
85 | INT pmode,rd,file; | |
86 | ADDR w; | |
87 | rd = mode==RD; | |
88 | ||
89 | IF space == NSP THEN return(0); FI | |
90 | ||
91 | IF pid /* tracing on? */ | |
92 | THEN | |
93 | #ifndef vax | |
94 | IF adr&01 ANDF !rd THEN error(ODDADR); FI | |
95 | #endif | |
96 | pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); | |
97 | w = ptrace(pmode, pid, adr, value); | |
98 | #ifndef vax | |
99 | IF adr&01 | |
100 | THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); | |
101 | w = (w>>8)&LOBYTE | (w1<<8); | |
102 | FI | |
103 | #endif | |
104 | IF errno | |
105 | THEN errflg = (space&DSP ? BADDAT : BADTXT); | |
106 | FI | |
107 | return(w); | |
108 | FI | |
109 | w = 0; | |
110 | IF !chkmap(&adr,space) | |
111 | THEN return(0); | |
112 | FI | |
113 | file=(space&DSP?datmap.ufd:txtmap.ufd); | |
114 | IF longseek(file,adr)==0 ORF | |
115 | (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1 | |
116 | THEN errflg=(space&DSP?BADDAT:BADTXT); | |
117 | FI | |
118 | return(w); | |
119 | ||
120 | } | |
121 | #endif | |
122 | ||
123 | chkmap(adr,space) | |
124 | REG L_INT *adr; | |
125 | REG INT space; | |
126 | { | |
127 | REG MAPPTR amap; | |
128 | amap=((space&DSP?&datmap:&txtmap)); | |
129 | IF space&STAR ORF !within(*adr,amap->b1,amap->e1) | |
130 | THEN IF within(*adr,amap->b2,amap->e2) | |
131 | THEN *adr += (amap->f2)-(amap->b2); | |
132 | ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); | |
133 | FI | |
134 | ELSE *adr += (amap->f1)-(amap->b1); | |
135 | FI | |
136 | return(1); | |
137 | } | |
138 | ||
139 | within(adr,lbd,ubd) | |
140 | POS adr, lbd, ubd; | |
141 | { | |
142 | return(adr>=lbd && adr<ubd); | |
143 | } |