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# define FMT64 "%ll"
52# ifndef __UD_STANDALONE__
53#  include <inttypes.h>
54# endif /* __UD_STANDALONE__ */
55#endif
56
57/* -----------------------------------------------------------------------------
58 * All possible "types" of objects in udis86. Order is Important!
59 * -----------------------------------------------------------------------------
60 */
61enum ud_type
62{
63  UD_NONE,
64
65  /* 8 bit GPRs */
66  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
67  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
68  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
69  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
70  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
71
72  /* 16 bit GPRs */
73  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
74  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
75  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
76  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
77
78  /* 32 bit GPRs */
79  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
80  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
81  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
82  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
83
84  /* 64 bit GPRs */
85  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
86  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
87  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
88  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
89
90  /* segment registers */
91  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
92  UD_R_FS,	UD_R_GS,
93
94  /* control registers*/
95  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
96  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
97  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
98  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
99
100  /* debug registers */
101  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
102  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
103  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
104  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
105
106  /* mmx registers */
107  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
108  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
109
110  /* x87 registers */
111  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
112  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7,
113
114  /* extended multimedia registers */
115  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
116  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
117  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
118  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
119
120  UD_R_RIP,
121
122  /* Operand Types */
123  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,
124  UD_OP_JIMM,	UD_OP_CONST
125};
126
127#include "udis86_itab.h"
128
129/* -----------------------------------------------------------------------------
130 * struct ud_operand - Disassembled instruction Operand.
131 * -----------------------------------------------------------------------------
132 */
133struct ud_operand
134{
135  enum ud_type		type;
136  uint8_t		size;
137  union {
138	int8_t		sbyte;
139	uint8_t		ubyte;
140	int16_t		sword;
141	uint16_t	uword;
142	int32_t		sdword;
143	uint32_t	udword;
144	int64_t		sqword;
145	uint64_t	uqword;
146
147	struct {
148		uint16_t seg;
149		uint32_t off;
150	} ptr;
151  } lval;
152
153  enum ud_type		base;
154  enum ud_type		index;
155  uint8_t		offset;
156  uint8_t		scale;
157};
158
159#define UD_STRING_BUFFER_SIZE 64
160
161/* -----------------------------------------------------------------------------
162 * struct ud - The udis86 object.
163 * -----------------------------------------------------------------------------
164 */
165struct ud
166{
167  int 			(*inp_hook) (struct ud*);
168  uint8_t		inp_curr;
169  uint8_t		inp_fill;
170#ifndef __UD_STANDALONE__
171  FILE*			inp_file;
172#endif
173  uint8_t		inp_ctr;
174  uint8_t*		inp_buff;
175  uint8_t*		inp_buff_end;
176  uint8_t		inp_end;
177  void			(*translator)(struct ud*);
178  uint64_t		insn_offset;
179  char			insn_hexcode[32];
180  char			insn_buffer[UD_STRING_BUFFER_SIZE];
181  unsigned int		insn_fill;
182  uint8_t		dis_mode;
183  uint64_t		pc;
184  uint8_t		vendor;
185  struct map_entry*	mapen;
186  enum ud_mnemonic_code	mnemonic;
187  struct ud_operand	operand[3];
188  uint8_t		error;
189  uint8_t	 	pfx_rex;
190  uint8_t 		pfx_seg;
191  uint8_t 		pfx_opr;
192  uint8_t 		pfx_adr;
193  uint8_t 		pfx_lock;
194  uint8_t 		pfx_rep;
195  uint8_t 		pfx_repe;
196  uint8_t 		pfx_repne;
197  uint8_t 		pfx_insn;
198  uint8_t		default64;
199  uint8_t		opr_mode;
200  uint8_t		adr_mode;
201  uint8_t		br_far;
202  uint8_t		br_near;
203  uint8_t		implicit_addr;
204  uint8_t		c1;
205  uint8_t		c2;
206  uint8_t		c3;
207  uint8_t 		inp_cache[256];
208  uint8_t		inp_sess[64];
209  uint8_t       have_modrm;
210  uint8_t       modrm;
211  void *        user_opaque_data;
212  struct ud_itab_entry * itab_entry;
213  struct ud_lookup_table_list_entry *le;
214};
215
216/* -----------------------------------------------------------------------------
217 * Type-definitions
218 * -----------------------------------------------------------------------------
219 */
220typedef enum ud_type 		ud_type_t;
221typedef enum ud_mnemonic_code	ud_mnemonic_code_t;
222
223typedef struct ud 		ud_t;
224typedef struct ud_operand 	ud_operand_t;
225
226#define UD_SYN_INTEL		ud_translate_intel
227#define UD_SYN_ATT		ud_translate_att
228#define UD_EOI			-1
229#define UD_INP_CACHE_SZ		32
230#define UD_VENDOR_AMD		0
231#define UD_VENDOR_INTEL		1
232#define UD_VENDOR_ANY		2
233
234#define bail_out(ud,error_code) longjmp( (ud)->bailout, error_code )
235#define try_decode(ud) if ( setjmp( (ud)->bailout ) == 0 )
236#define catch_error() else
237
238#endif
239