1/* udis86 - libudis86/types.h
2 *
3 * Copyright (c) 2002-2009 Vivek Thampi
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 *     * Redistributions of source code must retain the above copyright notice,
10 *       this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above copyright notice,
12 *       this list of conditions and the following disclaimer in the documentation
13 *       and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
22 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26#ifndef UD_TYPES_H
27#define UD_TYPES_H
28
29#ifndef __UD_STANDALONE__
30# include <stdio.h>
31#endif /* __UD_STANDALONE__ */
32
33/* gcc specific extensions */
34#ifdef __GNUC__
35# define UD_ATTR_PACKED __attribute__((packed))
36#else
37# define UD_ATTR_PACKED
38#endif /* UD_ATTR_PACKED */
39
40#ifdef _MSC_VER
41# define FMT64 "%I64"
42  typedef unsigned __int8 uint8_t;
43  typedef unsigned __int16 uint16_t;
44  typedef unsigned __int32 uint32_t;
45  typedef unsigned __int64 uint64_t;
46  typedef __int8 int8_t;
47  typedef __int16 int16_t;
48  typedef __int32 int32_t;
49  typedef __int64 int64_t;
50#else
51# if defined(__GNU_LIBRARY__) && defined(__WORDSIZE) && (__WORDSIZE == 64)
52#  define FMT64 "%l"
53# else
54#  define FMT64 "%ll"
55# endif
56# ifndef __UD_STANDALONE__
57#  include <inttypes.h>
58# endif /* __UD_STANDALONE__ */
59#endif
60
61/* -----------------------------------------------------------------------------
62 * All possible "types" of objects in udis86. Order is Important!
63 * -----------------------------------------------------------------------------
64 */
65enum ud_type
66{
67  UD_NONE,
68
69  /* 8 bit GPRs */
70  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
71  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
72  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
73  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
74  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
75
76  /* 16 bit GPRs */
77  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
78  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
79  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
80  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
81
82  /* 32 bit GPRs */
83  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
84  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
85  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
86  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
87
88  /* 64 bit GPRs */
89  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
90  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
91  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
92  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
93
94  /* segment registers */
95  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
96  UD_R_FS,	UD_R_GS,
97
98  /* control registers*/
99  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
100  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
101  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
102  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
103
104  /* debug registers */
105  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
106  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
107  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
108  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
109
110  /* mmx registers */
111  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
112  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
113
114  /* x87 registers */
115  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
116  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7,
117
118  /* extended multimedia registers */
119  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
120  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
121  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
122  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
123
124  UD_R_RIP,
125
126  /* Operand Types */
127  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,
128  UD_OP_JIMM,	UD_OP_CONST
129};
130
131#include "udis86_itab.h"
132
133/* -----------------------------------------------------------------------------
134 * struct ud_operand - Disassembled instruction Operand.
135 * -----------------------------------------------------------------------------
136 */
137struct ud_operand
138{
139  enum ud_type		type;
140  uint8_t		size;
141  union {
142	int8_t		sbyte;
143	uint8_t		ubyte;
144	int16_t		sword;
145	uint16_t	uword;
146	int32_t		sdword;
147	uint32_t	udword;
148	int64_t		sqword;
149	uint64_t	uqword;
150
151	struct {
152		uint16_t seg;
153		uint32_t off;
154	} ptr;
155  } lval;
156
157  enum ud_type		base;
158  enum ud_type		index;
159  uint8_t		offset;
160  uint8_t		scale;
161};
162
163#define UD_STRING_BUFFER_SIZE 64
164
165/* -----------------------------------------------------------------------------
166 * struct ud - The udis86 object.
167 * -----------------------------------------------------------------------------
168 */
169struct ud
170{
171  int 			(*inp_hook) (struct ud*);
172  uint8_t		inp_curr;
173  uint8_t		inp_fill;
174#ifndef __UD_STANDALONE__
175  FILE*			inp_file;
176#endif
177  uint8_t		inp_ctr;
178  uint8_t*		inp_buff;
179  uint8_t*		inp_buff_end;
180  uint8_t		inp_end;
181  void			(*translator)(struct ud*);
182  uint64_t		insn_offset;
183  char			insn_hexcode[32];
184  char			insn_buffer[UD_STRING_BUFFER_SIZE];
185  unsigned int		insn_fill;
186  uint8_t		dis_mode;
187  uint64_t		pc;
188  uint8_t		vendor;
189  struct map_entry*	mapen;
190  enum ud_mnemonic_code	mnemonic;
191  struct ud_operand	operand[3];
192  uint8_t		error;
193  uint8_t	 	pfx_rex;
194  uint8_t 		pfx_seg;
195  uint8_t 		pfx_opr;
196  uint8_t 		pfx_adr;
197  uint8_t 		pfx_lock;
198  uint8_t 		pfx_rep;
199  uint8_t 		pfx_repe;
200  uint8_t 		pfx_repne;
201  uint8_t 		pfx_insn;
202  uint8_t		default64;
203  uint8_t		opr_mode;
204  uint8_t		adr_mode;
205  uint8_t		br_far;
206  uint8_t		br_near;
207  uint8_t		implicit_addr;
208  uint8_t		c1;
209  uint8_t		c2;
210  uint8_t		c3;
211  uint8_t 		inp_cache[256];
212  uint8_t		inp_sess[64];
213  uint8_t       have_modrm;
214  uint8_t       modrm;
215  void *        user_opaque_data;
216  struct ud_itab_entry * itab_entry;
217  struct ud_lookup_table_list_entry *le;
218};
219
220/* -----------------------------------------------------------------------------
221 * Type-definitions
222 * -----------------------------------------------------------------------------
223 */
224typedef enum ud_type 		ud_type_t;
225typedef enum ud_mnemonic_code	ud_mnemonic_code_t;
226
227typedef struct ud 		ud_t;
228typedef struct ud_operand 	ud_operand_t;
229
230#define UD_SYN_INTEL		ud_translate_intel
231#define UD_SYN_ATT		ud_translate_att
232#define UD_EOI			-1
233#define UD_INP_CACHE_SZ		32
234#define UD_VENDOR_AMD		0
235#define UD_VENDOR_INTEL		1
236#define UD_VENDOR_ANY		2
237
238#define bail_out(ud,error_code) longjmp( (ud)->bailout, error_code )
239#define try_decode(ud) if ( setjmp( (ud)->bailout ) == 0 )
240#define catch_error() else
241
242#endif
243