1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38: #include <stdlib.h>
39: #include "dis-asm.h"
40:
41: #define MAXLEN 20
42:
43: #include <setjmp.h>
44:
45: #ifndef UNIXWARE_COMPAT
46:
47:
48: #define UNIXWARE_COMPAT 1
49: #endif
50:
51: static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
52: static void ckprefix PARAMS ((void));
53: static const char *prefix_name PARAMS ((int, int));
54: static int print_insn PARAMS ((bfd_vma, disassemble_info *));
55: static void dofloat PARAMS ((int));
56: static void OP_ST PARAMS ((int, int));
57: static void OP_STi PARAMS ((int, int));
58: static int putop PARAMS ((const char *, int));
59: static void oappend PARAMS ((const char *));
60: static void append_seg PARAMS ((void));
61: static void OP_indirE PARAMS ((int, int));
62: static void print_operand_value PARAMS ((char *, int, bfd_vma));
63: static void OP_E PARAMS ((int, int));
64: static void OP_G PARAMS ((int, int));
65: static bfd_vma get64 PARAMS ((void));
66: static bfd_signed_vma get32 PARAMS ((void));
67: static bfd_signed_vma get32s PARAMS ((void));
68: static int get16 PARAMS ((void));
69: static void set_op PARAMS ((bfd_vma, int));
70: static void OP_REG PARAMS ((int, int));
71: static void OP_IMREG PARAMS ((int, int));
72: static void OP_I PARAMS ((int, int));
73: static void OP_I64 PARAMS ((int, int));
74: static void OP_sI PARAMS ((int, int));
75: static void OP_J PARAMS ((int, int));
76: static void OP_SEG PARAMS ((int, int));
77: static void OP_DIR PARAMS ((int, int));
78: static void OP_OFF PARAMS ((int, int));
79: static void OP_OFF64 PARAMS ((int, int));
80: static void ptr_reg PARAMS ((int, int));
81: static void OP_ESreg PARAMS ((int, int));
82: static void OP_DSreg PARAMS ((int, int));
83: static void OP_C PARAMS ((int, int));
84: static void OP_D PARAMS ((int, int));
85: static void OP_T PARAMS ((int, int));
86: static void OP_Rd PARAMS ((int, int));
87: static void OP_MMX PARAMS ((int, int));
88: static void OP_XMM PARAMS ((int, int));
89: static void OP_EM PARAMS ((int, int));
90: static void OP_EX PARAMS ((int, int));
91: static void OP_MS PARAMS ((int, int));
92: static void OP_XS PARAMS ((int, int));
93: static void OP_3DNowSuffix PARAMS ((int, int));
94: static void OP_SIMD_Suffix PARAMS ((int, int));
95: static void SIMD_Fixup PARAMS ((int, int));
96: static void BadOp PARAMS ((void));
97:
98: struct dis_private {
99:
100: bfd_byte *max_fetched;
101: bfd_byte the_buffer[MAXLEN];
102: bfd_vma insn_start;
103: int orig_sizeflag;
104: jmp_buf bailout;
105: };
106:
107:
108:
109: #define FWAIT_OPCODE (0x9b)
110:
111:
112: static int mode_64bit;
113:
114:
115: static int prefixes;
116:
117:
118: static int rex;
119:
120: static int rex_used;
121: #define REX_MODE64 8
122: #define REX_EXTX 4
123: #define REX_EXTY 2
124: #define REX_EXTZ 1
125:
126:
127:
128:
129: #define USED_REX(value) \
130: { \
131: if (value) \
132: rex_used |= (rex & value) ? (value) | 0x40 : 0; \
133: else \
134: rex_used |= 0x40; \
135: }
136:
137:
138:
139: static int used_prefixes;
140:
141:
142: #define PREFIX_REPZ 1
143: #define PREFIX_REPNZ 2
144: #define PREFIX_LOCK 4
145: #define PREFIX_CS 8
146: #define PREFIX_SS 0x10
147: #define PREFIX_DS 0x20
148: #define PREFIX_ES 0x40
149: #define PREFIX_FS 0x80
150: #define PREFIX_GS 0x100
151: #define PREFIX_DATA 0x200
152: #define PREFIX_ADDR 0x400
153: #define PREFIX_FWAIT 0x800
154:
155:
156:
157:
158: #define FETCH_DATA(info, addr) \
159: ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
160: ? 1 : fetch_data ((info), (addr)))
161:
162: static int
163: fetch_data (info, addr)
164: struct disassemble_info *info;
165: bfd_byte *addr;
166: {
167: int status;
168: struct dis_private *priv = (struct dis_private *) info->private_data;
169: bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
170:
171: status = (*info->read_memory_func) (start,
172: priv->max_fetched,
173: addr - priv->max_fetched,
174: info);
175: if (status != 0)
176: {
177:
178:
179:
180:
181: if (priv->max_fetched == priv->the_buffer)
182: (*info->memory_error_func) (status, start, info);
183: longjmp (priv->bailout, 1);
184: }
185: else
186: priv->max_fetched = addr;
187: return 1;
188: }
189:
190: #define XX NULL, 0
191:
192: #define Eb OP_E, b_mode
193: #define Ev OP_E, v_mode
194: #define Ed OP_E, d_mode
195: #define indirEb OP_indirE, b_mode
196: #define indirEv OP_indirE, v_mode
197: #define Ew OP_E, w_mode
198: #define Ma OP_E, v_mode
199: #define M OP_E, 0
200: #define Mp OP_E, 0
201: #define Gb OP_G, b_mode
202: #define Gv OP_G, v_mode
203: #define Gd OP_G, d_mode
204: #define Gw OP_G, w_mode
205: #define Rd OP_Rd, d_mode
206: #define Rm OP_Rd, m_mode
207: #define Ib OP_I, b_mode
208: #define sIb OP_sI, b_mode
209: #define Iv OP_I, v_mode
210: #define Iq OP_I, q_mode
211: #define Iv64 OP_I64, v_mode
212: #define Iw OP_I, w_mode
213: #define Jb OP_J, b_mode
214: #define Jv OP_J, v_mode
215: #define Cm OP_C, m_mode
216: #define Dm OP_D, m_mode
217: #define Td OP_T, d_mode
218:
219: #define RMeAX OP_REG, eAX_reg
220: #define RMeBX OP_REG, eBX_reg
221: #define RMeCX OP_REG, eCX_reg
222: #define RMeDX OP_REG, eDX_reg
223: #define RMeSP OP_REG, eSP_reg
224: #define RMeBP OP_REG, eBP_reg
225: #define RMeSI OP_REG, eSI_reg
226: #define RMeDI OP_REG, eDI_reg
227: #define RMrAX OP_REG, rAX_reg
228: #define RMrBX OP_REG, rBX_reg
229: #define RMrCX OP_REG, rCX_reg
230: #define RMrDX OP_REG, rDX_reg
231: #define RMrSP OP_REG, rSP_reg
232: #define RMrBP OP_REG, rBP_reg
233: #define RMrSI OP_REG, rSI_reg
234: #define RMrDI OP_REG, rDI_reg
235: #define RMAL OP_REG, al_reg
236: #define RMAL OP_REG, al_reg
237: #define RMCL OP_REG, cl_reg
238: #define RMDL OP_REG, dl_reg
239: #define RMBL OP_REG, bl_reg
240: #define RMAH OP_REG, ah_reg
241: #define RMCH OP_REG, ch_reg
242: #define RMDH OP_REG, dh_reg
243: #define RMBH OP_REG, bh_reg
244: #define RMAX OP_REG, ax_reg
245: #define RMDX OP_REG, dx_reg
246:
247: #define eAX OP_IMREG, eAX_reg
248: #define eBX OP_IMREG, eBX_reg
249: #define eCX OP_IMREG, eCX_reg
250: #define eDX OP_IMREG, eDX_reg
251: #define eSP OP_IMREG, eSP_reg
252: #define eBP OP_IMREG, eBP_reg
253: #define eSI OP_IMREG, eSI_reg
254: #define eDI OP_IMREG, eDI_reg
255: #define AL OP_IMREG, al_reg
256: #define AL OP_IMREG, al_reg
257: #define CL OP_IMREG, cl_reg
258: #define DL OP_IMREG, dl_reg
259: #define BL OP_IMREG, bl_reg
260: #define AH OP_IMREG, ah_reg
261: #define CH OP_IMREG, ch_reg
262: #define DH OP_IMREG, dh_reg
263: #define BH OP_IMREG, bh_reg
264: #define AX OP_IMREG, ax_reg
265: #define DX OP_IMREG, dx_reg
266: #define indirDX OP_IMREG, indir_dx_reg
267:
268: #define Sw OP_SEG, w_mode
269: #define Ap OP_DIR, 0
270: #define Ob OP_OFF, b_mode
271: #define Ob64 OP_OFF64, b_mode
272: #define Ov OP_OFF, v_mode
273: #define Ov64 OP_OFF64, v_mode
274: #define Xb OP_DSreg, eSI_reg
275: #define Xv OP_DSreg, eSI_reg
276: #define Yb OP_ESreg, eDI_reg
277: #define Yv OP_ESreg, eDI_reg
278: #define DSBX OP_DSreg, eBX_reg
279:
280: #define es OP_REG, es_reg
281: #define ss OP_REG, ss_reg
282: #define cs OP_REG, cs_reg
283: #define ds OP_REG, ds_reg
284: #define fs OP_REG, fs_reg
285: #define gs OP_REG, gs_reg
286:
287: #define MX OP_MMX, 0
288: #define XM OP_XMM, 0
289: #define EM OP_EM, v_mode
290: #define EX OP_EX, v_mode
291: #define MS OP_MS, v_mode
292: #define XS OP_XS, v_mode
293: #define None OP_E, 0
294: #define OPSUF OP_3DNowSuffix, 0
295: #define OPSIMD OP_SIMD_Suffix, 0
296:
297: #define cond_jump_flag NULL, cond_jump_mode
298: #define loop_jcxz_flag NULL, loop_jcxz_mode
299:
300:
301: #define SUFFIX_ALWAYS 4
302: #define AFLAG 2
303: #define DFLAG 1
304:
305: #define b_mode 1
306: #define v_mode 2
307: #define w_mode 3
308: #define d_mode 4
309: #define q_mode 5
310: #define x_mode 6
311: #define m_mode 7
312: #define cond_jump_mode 8
313: #define loop_jcxz_mode 9
314:
315: #define es_reg 100
316: #define cs_reg 101
317: #define ss_reg 102
318: #define ds_reg 103
319: #define fs_reg 104
320: #define gs_reg 105
321:
322: #define eAX_reg 108
323: #define eCX_reg 109
324: #define eDX_reg 110
325: #define eBX_reg 111
326: #define eSP_reg 112
327: #define eBP_reg 113
328: #define eSI_reg 114
329: #define eDI_reg 115
330:
331: #define al_reg 116
332: #define cl_reg 117
333: #define dl_reg 118
334: #define bl_reg 119
335: #define ah_reg 120
336: #define ch_reg 121
337: #define dh_reg 122
338: #define bh_reg 123
339:
340: #define ax_reg 124
341: #define cx_reg 125
342: #define dx_reg 126
343: #define bx_reg 127
344: #define sp_reg 128
345: #define bp_reg 129
346: #define si_reg 130
347: #define di_reg 131
348:
349: #define rAX_reg 132
350: #define rCX_reg 133
351: #define rDX_reg 134
352: #define rBX_reg 135
353: #define rSP_reg 136
354: #define rBP_reg 137
355: #define rSI_reg 138
356: #define rDI_reg 139
357:
358: #define indir_dx_reg 150
359:
360: #define FLOATCODE 1
361: #define USE_GROUPS 2
362: #define USE_PREFIX_USER_TABLE 3
363: #define X86_64_SPECIAL 4
364:
365: #define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
366:
367: #define GRP1b NULL, NULL, USE_GROUPS, NULL, 0, NULL, 0
368: #define GRP1S NULL, NULL, USE_GROUPS, NULL, 1, NULL, 0
369: #define GRP1Ss NULL, NULL, USE_GROUPS, NULL, 2, NULL, 0
370: #define GRP2b NULL, NULL, USE_GROUPS, NULL, 3, NULL, 0
371: #define GRP2S NULL, NULL, USE_GROUPS, NULL, 4, NULL, 0
372: #define GRP2b_one NULL, NULL, USE_GROUPS, NULL, 5, NULL, 0
373: #define GRP2S_one NULL, NULL, USE_GROUPS, NULL, 6, NULL, 0
374: #define GRP2b_cl NULL, NULL, USE_GROUPS, NULL, 7, NULL, 0
375: #define GRP2S_cl NULL, NULL, USE_GROUPS, NULL, 8, NULL, 0
376: #define GRP3b NULL, NULL, USE_GROUPS, NULL, 9, NULL, 0
377: #define GRP3S NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0
378: #define GRP4 NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0
379: #define GRP5 NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0
380: #define GRP6 NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0
381: #define GRP7 NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0
382: #define GRP8 NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0
383: #define GRP9 NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0
384: #define GRP10 NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0
385: #define GRP11 NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0
386: #define GRP12 NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0
387: #define GRP13 NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0
388: #define GRP14 NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0
389: #define GRPAMD NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0
390:
391: #define PREGRP0 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 0, NULL, 0
392: #define PREGRP1 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 1, NULL, 0
393: #define PREGRP2 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 2, NULL, 0
394: #define PREGRP3 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 3, NULL, 0
395: #define PREGRP4 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 4, NULL, 0
396: #define PREGRP5 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 5, NULL, 0
397: #define PREGRP6 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 6, NULL, 0
398: #define PREGRP7 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 7, NULL, 0
399: #define PREGRP8 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 8, NULL, 0
400: #define PREGRP9 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 9, NULL, 0
401: #define PREGRP10 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0
402: #define PREGRP11 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0
403: #define PREGRP12 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0
404: #define PREGRP13 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0
405: #define PREGRP14 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0
406: #define PREGRP15 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0
407: #define PREGRP16 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0
408: #define PREGRP17 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0
409: #define PREGRP18 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0
410: #define PREGRP19 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0
411: #define PREGRP20 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0
412: #define PREGRP21 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0
413: #define PREGRP22 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0
414: #define PREGRP23 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0
415: #define PREGRP24 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0
416: #define PREGRP25 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0
417: #define PREGRP26 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0
418:
419: #define X86_64_0 NULL, NULL, X86_64_SPECIAL, NULL, 0, NULL, 0
420:
421: typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
422:
423: struct dis386 {
424: const char *name;
425: op_rtn op1;
426: int bytemode1;
427: op_rtn op2;
428: int bytemode2;
429: op_rtn op3;
430: int bytemode3;
431: };
432:
433:
434:
435:
436:
437: