db_disasm.c revision 1.1 1 #include <sys/param.h>
2 #include <sys/proc.h>
3 #include <sys/reboot.h>
4
5 #include <ddb/db_variables.h>
6
7 #include <machine/db_machdep.h>
8
9
10
11 struct vax_insn {
12 char *insn;
13 int nargs;
14 } instr[] = {
15 "halt", 0,
16 "nop", 0,
17 "rei", 0,
18 "bpt", 0,
19 "ret", 0,
20 "rsb", 0,
21 "ldpctx", 0,
22 "svpctx", 0,
23 "cvtps", 4,
24 "cvtsp", 4,
25 "index", 6,
26 "crc", 4,
27 "prober", 3,
28 "probew", 3,
29 "insque", 2,
30 "remque", 2,
31 "", -1,
32 "", -1,
33 "", -1,
34 "", -1,
35 "", -1,
36 "", -1,
37 "", -1,
38 "", -1,
39 "", -1,
40 "", -1,
41 "", -1,
42 "", -1,
43 "", -1,
44 "", -1,
45 "", -1,
46 "", -1,
47 "", -1,
48 "", -1,
49 "", -1,
50 "", -1,
51 "", -1,
52 "", -1,
53 "", -1,
54 "", -1,
55 "", -1,
56 "", -1,
57 "", -1,
58 "", -1,
59 "", -1,
60 "", -1,
61 "", -1,
62 "", -1,
63 "", -1,
64 "", -1,
65 "", -1,
66 "", -1,
67 "", -1,
68 "", -1,
69 "", -1,
70 "", -1,
71 "", -1,
72 "", -1,
73 "", -1,
74 "", -1,
75 "", -1,
76 "", -1,
77 "", -1,
78 "", -1,
79 "", -1,
80 "", -1,
81 "", -1,
82 "", -1,
83 "", -1,
84 "", -1,
85 "", -1,
86 "", -1,
87 "", -1,
88 "", -1,
89 "", -1,
90 "", -1,
91 "", -1,
92 "", -1,
93 "", -1,
94 "", -1,
95 "", -1,
96 "", -1,
97 "", -1,
98 "", -1,
99 "", -1,
100 "", -1,
101 "", -1,
102 "", -1,
103 "", -1,
104 "", -1,
105 "", -1,
106 "", -1,
107 "", -1,
108 "", -1,
109 "", -1,
110 "", -1,
111 "", -1,
112 "", -1,
113 "", -1,
114 "", -1,
115 "", -1,
116 "", -1,
117 "", -1,
118 "", -1,
119 "", -1,
120 "", -1,
121 "", -1,
122 "", -1,
123 "", -1,
124 "", -1,
125 "", -1,
126 "", -1,
127 "", -1,
128 "", -1,
129 "", -1,
130 "", -1,
131 "", -1,
132 "", -1,
133 "", -1,
134 "", -1,
135 "", -1,
136 "", -1,
137 "", -1,
138 "", -1,
139 "", -1,
140 "", -1,
141 "", -1,
142 "", -1,
143 "", -1,
144 "", -1,
145 "", -1,
146 "", -1,
147 "", -1,
148 "", -1,
149 "", -1,
150 "", -1,
151 "", -1,
152 "", -1,
153 "", -1,
154 "", -1,
155 "", -1,
156 "", -1,
157 "", -1,
158 "", -1,
159 "", -1,
160 "", -1,
161 "", -1,
162 "", -1,
163 "", -1,
164 "", -1,
165 "", -1,
166 "", -1,
167 "", -1,
168 "", -1,
169 "", -1,
170 "", -1,
171 "", -1,
172 "", -1,
173 "", -1,
174 "", -1,
175 "", -1,
176 "", -1,
177 "", -1,
178 "", -1,
179 "", -1,
180 "", -1,
181 "", -1,
182 "", -1,
183 "", -1,
184 "", -1,
185 "", -1,
186 "", -1,
187 "", -1,
188 "", -1,
189 "", -1,
190 "", -1,
191 "", -1,
192 "", -1,
193 "", -1,
194 "", -1,
195 "", -1,
196 "", -1,
197 "", -1,
198 "", -1,
199 "", -1,
200 "", -1,
201 "", -1,
202 "", -1,
203 "", -1,
204 "", -1,
205 "", -1,
206 "", -1,
207 "", -1,
208 "", -1,
209 "", -1,
210 "", -1,
211 "", -1,
212 "", -1,
213 "", -1,
214 "", -1,
215 "", -1,
216 "", -1,
217 "", -1,
218 "", -1,
219 "", -1,
220 "", -1,
221 "", -1,
222 "", -1,
223 "", -1,
224 "", -1,
225 "", -1,
226 "", -1,
227 "", -1,
228 "", -1,
229 "", -1,
230 "", -1,
231 "", -1,
232 "", -1,
233 "", -1,
234 "", -1,
235 "", -1,
236 "", -1,
237 "", -1,
238 "", -1,
239 "", -1,
240 "", -1,
241 "", -1,
242 "", -1,
243 "", -1,
244 "", -1,
245 "", -1,
246 "", -1,
247 "", -1,
248 "", -1,
249 "", -1,
250 "", -1,
251 "", -1,
252 "", -1,
253 "", -1,
254 "", -1,
255 "", -1,
256 "", -1,
257 "", -1,
258 "", -1,
259 "", -1,
260 "", -1,
261 "", -1,
262 "", -1,
263 "", -1,
264 "", -1,
265 "", -1,
266 "", -1,
267 "", -1,
268 "", -1,
269 "", -1,
270 "", -1,
271 "", -1,
272 "", -1,
273 "", -1,
274 "", -1,
275 "", -1,
276 "", -1,
277 "", -1,
278 "", -1,
279 "", -1,
280 "", -1,
281 "", -1,
282 "", -1,
283 "", -1,
284 "", -1,
285 "", -1,
286 "", -1,
287 };
288
289
290 /*
291 * Disassemble instruction at 'loc'. 'altfmt' specifies an
292 * (optional) alternate format. Return address of start of
293 * next instruction.
294 */
295 db_addr_t
296 db_disasm(loc, altfmt)
297 db_addr_t loc;
298 boolean_t altfmt;
299 {
300 char *i_pl;
301 int inr, i;
302
303 i_pl = loc;
304 inr = *i_pl;
305
306 if (instr[*i_pl].nargs < 0) {
307 printf("Ok{nd instruktion: %2x",*i_pl&0xff);
308 i_pl++;
309 } else {
310 printf("\t%s\t",instr[inr].insn);
311 i_pl++;
312 for (i=0;i<instr[inr].nargs;i++) {
313 i_pl = argprint(i_pl);
314 if (i<instr[inr].nargs-1)
315 printf(",");
316 }
317 }
318
319
320
321 return i_pl;
322 }
323
324 argprint(plats)
325 char *plats;
326 {
327 switch (*plats&0xf0) {
328 case 0x00:
329 case 0x10:
330 case 0x20:
331 case 0x30:
332 printf("$%x",*plats++);
333 break;
334
335 case 0xe0:
336 if (*plats++&15 == 15) {
337 printf("%8x",*(unsigned *)plats + plats);
338 plats += 4;
339 } else {
340 printf("Oinpl. s{tt.");
341 }
342 break;
343 default:
344 printf("Oinpl. s{tt.");
345 }
346 return plats;
347 }
348