1#ifndef UD_DECODE_H
2#define UD_DECODE_H
3
4#define MAX_INSN_LENGTH 15
5
6/* register classes */
7#define T_NONE  0
8#define T_GPR   1
9#define T_MMX   2
10#define T_CRG   3
11#define T_DBG   4
12#define T_SEG   5
13#define T_XMM   6
14
15/* itab prefix bits */
16#define P_none          ( 0 )
17#define P_c1            ( 1 << 0 )
18#define P_C1(n)         ( ( n >> 0 ) & 1 )
19#define P_rexb          ( 1 << 1 )
20#define P_REXB(n)       ( ( n >> 1 ) & 1 )
21#define P_depM          ( 1 << 2 )
22#define P_DEPM(n)       ( ( n >> 2 ) & 1 )
23#define P_c3            ( 1 << 3 )
24#define P_C3(n)         ( ( n >> 3 ) & 1 )
25#define P_inv64         ( 1 << 4 )
26#define P_INV64(n)      ( ( n >> 4 ) & 1 )
27#define P_rexw          ( 1 << 5 )
28#define P_REXW(n)       ( ( n >> 5 ) & 1 )
29#define P_c2            ( 1 << 6 )
30#define P_C2(n)         ( ( n >> 6 ) & 1 )
31#define P_def64         ( 1 << 7 )
32#define P_DEF64(n)      ( ( n >> 7 ) & 1 )
33#define P_rexr          ( 1 << 8 )
34#define P_REXR(n)       ( ( n >> 8 ) & 1 )
35#define P_oso           ( 1 << 9 )
36#define P_OSO(n)        ( ( n >> 9 ) & 1 )
37#define P_aso           ( 1 << 10 )
38#define P_ASO(n)        ( ( n >> 10 ) & 1 )
39#define P_rexx          ( 1 << 11 )
40#define P_REXX(n)       ( ( n >> 11 ) & 1 )
41#define P_ImpAddr       ( 1 << 12 )
42#define P_IMPADDR(n)    ( ( n >> 12 ) & 1 )
43
44/* rex prefix bits */
45#define REX_W(r)        ( ( 0xF & ( r ) )  >> 3 )
46#define REX_R(r)        ( ( 0x7 & ( r ) )  >> 2 )
47#define REX_X(r)        ( ( 0x3 & ( r ) )  >> 1 )
48#define REX_B(r)        ( ( 0x1 & ( r ) )  >> 0 )
49#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \
50                          ( P_REXR(n) << 2 ) | \
51                          ( P_REXX(n) << 1 ) | \
52                          ( P_REXB(n) << 0 ) )
53
54/* scable-index-base bits */
55#define SIB_S(b)        ( ( b ) >> 6 )
56#define SIB_I(b)        ( ( ( b ) >> 3 ) & 7 )
57#define SIB_B(b)        ( ( b ) & 7 )
58
59/* modrm bits */
60#define MODRM_REG(b)    ( ( ( b ) >> 3 ) & 7 )
61#define MODRM_NNN(b)    ( ( ( b ) >> 3 ) & 7 )
62#define MODRM_MOD(b)    ( ( ( b ) >> 6 ) & 3 )
63#define MODRM_RM(b)     ( ( b ) & 7 )
64
65/* operand type constants -- order is important! */
66
67enum ud_operand_code {
68    OP_NONE,
69
70    OP_A,      OP_E,      OP_M,       OP_G,
71    OP_I,
72
73    OP_AL,     OP_CL,     OP_DL,      OP_BL,
74    OP_AH,     OP_CH,     OP_DH,      OP_BH,
75
76    OP_ALr8b,  OP_CLr9b,  OP_DLr10b,  OP_BLr11b,
77    OP_AHr12b, OP_CHr13b, OP_DHr14b,  OP_BHr15b,
78
79    OP_AX,     OP_CX,     OP_DX,      OP_BX,
80    OP_SI,     OP_DI,     OP_SP,      OP_BP,
81
82    OP_rAX,    OP_rCX,    OP_rDX,     OP_rBX,
83    OP_rSP,    OP_rBP,    OP_rSI,     OP_rDI,
84
85    OP_rAXr8,  OP_rCXr9,  OP_rDXr10,  OP_rBXr11,
86    OP_rSPr12, OP_rBPr13, OP_rSIr14,  OP_rDIr15,
87
88    OP_eAX,    OP_eCX,    OP_eDX,     OP_eBX,
89    OP_eSP,    OP_eBP,    OP_eSI,     OP_eDI,
90
91    OP_ES,     OP_CS,     OP_SS,      OP_DS,
92    OP_FS,     OP_GS,
93
94    OP_ST0,    OP_ST1,    OP_ST2,     OP_ST3,
95    OP_ST4,    OP_ST5,    OP_ST6,     OP_ST7,
96
97    OP_J,      OP_S,      OP_O,
98    OP_I1,     OP_I3,
99
100    OP_V,      OP_W,      OP_Q,       OP_P,
101
102    OP_R,      OP_C,  OP_D,       OP_VR,  OP_PR
103};
104
105
106/* operand size constants */
107
108enum ud_operand_size {
109    SZ_NA  = 0,
110    SZ_Z   = 1,
111    SZ_V   = 2,
112    SZ_P   = 3,
113    SZ_WP  = 4,
114    SZ_DP  = 5,
115    SZ_MDQ = 6,
116    SZ_RDQ = 7,
117
118    /* the following values are used as is,
119     * and thus hard-coded. changing them
120     * will break internals
121     */
122    SZ_B   = 8,
123    SZ_W   = 16,
124    SZ_D   = 32,
125    SZ_Q   = 64,
126    SZ_T   = 80,
127};
128
129/* itab entry operand definitions */
130
131#define O_rSPr12  { OP_rSPr12,   SZ_NA    }
132#define O_BL      { OP_BL,       SZ_NA    }
133#define O_BH      { OP_BH,       SZ_NA    }
134#define O_BP      { OP_BP,       SZ_NA    }
135#define O_AHr12b  { OP_AHr12b,   SZ_NA    }
136#define O_BX      { OP_BX,       SZ_NA    }
137#define O_Jz      { OP_J,        SZ_Z     }
138#define O_Jv      { OP_J,        SZ_V     }
139#define O_Jb      { OP_J,        SZ_B     }
140#define O_rSIr14  { OP_rSIr14,   SZ_NA    }
141#define O_GS      { OP_GS,       SZ_NA    }
142#define O_D       { OP_D,        SZ_NA    }
143#define O_rBPr13  { OP_rBPr13,   SZ_NA    }
144#define O_Ob      { OP_O,        SZ_B     }
145#define O_P       { OP_P,        SZ_NA    }
146#define O_Ow      { OP_O,        SZ_W     }
147#define O_Ov      { OP_O,        SZ_V     }
148#define O_Gw      { OP_G,        SZ_W     }
149#define O_Gv      { OP_G,        SZ_V     }
150#define O_rDX     { OP_rDX,      SZ_NA    }
151#define O_Gx      { OP_G,        SZ_MDQ   }
152#define O_Gd      { OP_G,        SZ_D     }
153#define O_Gb      { OP_G,        SZ_B     }
154#define O_rBXr11  { OP_rBXr11,   SZ_NA    }
155#define O_rDI     { OP_rDI,      SZ_NA    }
156#define O_rSI     { OP_rSI,      SZ_NA    }
157#define O_ALr8b   { OP_ALr8b,    SZ_NA    }
158#define O_eDI     { OP_eDI,      SZ_NA    }
159#define O_Gz      { OP_G,        SZ_Z     }
160#define O_eDX     { OP_eDX,      SZ_NA    }
161#define O_DHr14b  { OP_DHr14b,   SZ_NA    }
162#define O_rSP     { OP_rSP,      SZ_NA    }
163#define O_PR      { OP_PR,       SZ_NA    }
164#define O_NONE    { OP_NONE,     SZ_NA    }
165#define O_rCX     { OP_rCX,      SZ_NA    }
166#define O_jWP     { OP_J,        SZ_WP    }
167#define O_rDXr10  { OP_rDXr10,   SZ_NA    }
168#define O_Md      { OP_M,        SZ_D     }
169#define O_C       { OP_C,        SZ_NA    }
170#define O_G       { OP_G,        SZ_NA    }
171#define O_Mb      { OP_M,        SZ_B     }
172#define O_Mt      { OP_M,        SZ_T     }
173#define O_S       { OP_S,        SZ_NA    }
174#define O_Mq      { OP_M,        SZ_Q     }
175#define O_W       { OP_W,        SZ_NA    }
176#define O_ES      { OP_ES,       SZ_NA    }
177#define O_rBX     { OP_rBX,      SZ_NA    }
178#define O_Ed      { OP_E,        SZ_D     }
179#define O_DLr10b  { OP_DLr10b,   SZ_NA    }
180#define O_Mw      { OP_M,        SZ_W     }
181#define O_Eb      { OP_E,        SZ_B     }
182#define O_Ex      { OP_E,        SZ_MDQ   }
183#define O_Ez      { OP_E,        SZ_Z     }
184#define O_Ew      { OP_E,        SZ_W     }
185#define O_Ev      { OP_E,        SZ_V     }
186#define O_Ep      { OP_E,        SZ_P     }
187#define O_FS      { OP_FS,       SZ_NA    }
188#define O_Ms      { OP_M,        SZ_W     }
189#define O_rAXr8   { OP_rAXr8,    SZ_NA    }
190#define O_eBP     { OP_eBP,      SZ_NA    }
191#define O_Isb     { OP_I,        SZ_SB    }
192#define O_eBX     { OP_eBX,      SZ_NA    }
193#define O_rCXr9   { OP_rCXr9,    SZ_NA    }
194#define O_jDP     { OP_J,        SZ_DP    }
195#define O_CH      { OP_CH,       SZ_NA    }
196#define O_CL      { OP_CL,       SZ_NA    }
197#define O_R       { OP_R,        SZ_RDQ   }
198#define O_V       { OP_V,        SZ_NA    }
199#define O_CS      { OP_CS,       SZ_NA    }
200#define O_CHr13b  { OP_CHr13b,   SZ_NA    }
201#define O_eCX     { OP_eCX,      SZ_NA    }
202#define O_eSP     { OP_eSP,      SZ_NA    }
203#define O_SS      { OP_SS,       SZ_NA    }
204#define O_SP      { OP_SP,       SZ_NA    }
205#define O_BLr11b  { OP_BLr11b,   SZ_NA    }
206#define O_SI      { OP_SI,       SZ_NA    }
207#define O_eSI     { OP_eSI,      SZ_NA    }
208#define O_DL      { OP_DL,       SZ_NA    }
209#define O_DH      { OP_DH,       SZ_NA    }
210#define O_DI      { OP_DI,       SZ_NA    }
211#define O_DX      { OP_DX,       SZ_NA    }
212#define O_rBP     { OP_rBP,      SZ_NA    }
213#define O_Gvw     { OP_G,        SZ_MDQ   }
214#define O_I1      { OP_I1,       SZ_NA    }
215#define O_I3      { OP_I3,       SZ_NA    }
216#define O_DS      { OP_DS,       SZ_NA    }
217#define O_ST4     { OP_ST4,      SZ_NA    }
218#define O_ST5     { OP_ST5,      SZ_NA    }
219#define O_ST6     { OP_ST6,      SZ_NA    }
220#define O_ST7     { OP_ST7,      SZ_NA    }
221#define O_ST0     { OP_ST0,      SZ_NA    }
222#define O_ST1     { OP_ST1,      SZ_NA    }
223#define O_ST2     { OP_ST2,      SZ_NA    }
224#define O_ST3     { OP_ST3,      SZ_NA    }
225#define O_E       { OP_E,        SZ_NA    }
226#define O_AH      { OP_AH,       SZ_NA    }
227#define O_M       { OP_M,        SZ_NA    }
228#define O_AL      { OP_AL,       SZ_NA    }
229#define O_CLr9b   { OP_CLr9b,    SZ_NA    }
230#define O_Q       { OP_Q,        SZ_NA    }
231#define O_eAX     { OP_eAX,      SZ_NA    }
232#define O_VR      { OP_VR,       SZ_NA    }
233#define O_AX      { OP_AX,       SZ_NA    }
234#define O_rAX     { OP_rAX,      SZ_NA    }
235#define O_Iz      { OP_I,        SZ_Z     }
236#define O_rDIr15  { OP_rDIr15,   SZ_NA    }
237#define O_Iw      { OP_I,        SZ_W     }
238#define O_Iv      { OP_I,        SZ_V     }
239#define O_Ap      { OP_A,        SZ_P     }
240#define O_CX      { OP_CX,       SZ_NA    }
241#define O_Ib      { OP_I,        SZ_B     }
242#define O_BHr15b  { OP_BHr15b,   SZ_NA    }
243
244
245/* A single operand of an entry in the instruction table.
246 * (internal use only)
247 */
248struct ud_itab_entry_operand
249{
250  enum ud_operand_code type;
251  enum ud_operand_size size;
252};
253
254
255/* A single entry in an instruction table.
256 *(internal use only)
257 */
258struct ud_itab_entry
259{
260  enum ud_mnemonic_code         mnemonic;
261  struct ud_itab_entry_operand  operand1;
262  struct ud_itab_entry_operand  operand2;
263  struct ud_itab_entry_operand  operand3;
264  uint32_t                      prefix;
265};
266
267extern const char * ud_lookup_mnemonic( enum ud_mnemonic_code c );
268
269#endif /* UD_DECODE_H */
270
271/* vim:cindent
272 * vim:expandtab
273 * vim:ts=4
274 * vim:sw=4
275 */
276