Commit | Line | Data |
---|---|---|
d6f0eb77 HK |
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 | } |