1/* -----------------------------------------------------------------------------
2 * types.h
3 *
4 * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
5 * All rights reserved. See LICENSE
6 * -----------------------------------------------------------------------------
7 */
8#ifndef UD_TYPES_H
9#define UD_TYPES_H
10
11#include <stdio.h>
12
13#ifdef _MSC_VER
14# define FMT64 "%I64"
15  typedef unsigned __int8 uint8_t;
16  typedef unsigned __int16 uint16_t;
17  typedef unsigned __int32 uint32_t;
18  typedef unsigned __int64 uint64_t;
19  typedef __int8 int8_t;
20  typedef __int16 int16_t;
21  typedef __int32 int32_t;
22  typedef __int64 int64_t;
23#else
24# define FMT64 "%ll"
25# include <inttypes.h>
26#endif
27
28#include "itab.h"
29
30/* -----------------------------------------------------------------------------
31 * All possible "types" of objects in udis86. Order is Important!
32 * -----------------------------------------------------------------------------
33 */
34enum ud_type
35{
36  UD_NONE,
37
38  /* 8 bit GPRs */
39  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
40  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
41  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
42  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
43  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
44
45  /* 16 bit GPRs */
46  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
47  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
48  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
49  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
50
51  /* 32 bit GPRs */
52  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
53  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
54  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
55  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
56
57  /* 64 bit GPRs */
58  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
59  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
60  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
61  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
62
63  /* segment registers */
64  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
65  UD_R_FS,	UD_R_GS,
66
67  /* control registers*/
68  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
69  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
70  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
71  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
72
73  /* debug registers */
74  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
75  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
76  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
77  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
78
79  /* mmx registers */
80  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
81  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
82
83  /* x87 registers */
84  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
85  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7,
86
87  /* extended multimedia registers */
88  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
89  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
90  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
91  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
92
93  UD_R_RIP,
94
95  /* Operand Types */
96  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,
97  UD_OP_JIMM,	UD_OP_CONST
98};
99
100/* -----------------------------------------------------------------------------
101 * struct ud_operand - Disassembled instruction Operand.
102 * -----------------------------------------------------------------------------
103 */
104struct ud_operand
105{
106  enum ud_type		type;
107  uint8_t		size;
108  union {
109	int8_t		sbyte;
110	uint8_t		ubyte;
111	int16_t		sword;
112	uint16_t	uword;
113	int32_t		sdword;
114	uint32_t	udword;
115	int64_t		sqword;
116	uint64_t	uqword;
117
118	struct {
119		uint16_t seg;
120		uint32_t off;
121	} ptr;
122  } lval;
123
124  enum ud_type		base;
125  enum ud_type		index;
126  uint8_t		offset;
127  uint8_t		scale;
128};
129
130/* -----------------------------------------------------------------------------
131 * struct ud - The udis86 object.
132 * -----------------------------------------------------------------------------
133 */
134struct ud
135{
136  int 			(*inp_hook) (struct ud*);
137  uint8_t		inp_curr;
138  uint8_t		inp_fill;
139  FILE*			inp_file;
140  uint8_t		inp_ctr;
141  uint8_t*		inp_buff;
142  uint8_t*		inp_buff_end;
143  uint8_t		inp_end;
144  void			(*translator)(struct ud*);
145  uint64_t		insn_offset;
146  char			insn_hexcode[32];
147  char			insn_buffer[64];
148  unsigned int		insn_fill;
149  uint8_t		dis_mode;
150  uint64_t		pc;
151  uint8_t		vendor;
152  struct map_entry*	mapen;
153  enum ud_mnemonic_code	mnemonic;
154  struct ud_operand	operand[3];
155  uint8_t		error;
156  uint8_t	 	pfx_rex;
157  uint8_t 		pfx_seg;
158  uint8_t 		pfx_opr;
159  uint8_t 		pfx_adr;
160  uint8_t 		pfx_lock;
161  uint8_t 		pfx_rep;
162  uint8_t 		pfx_repe;
163  uint8_t 		pfx_repne;
164  uint8_t 		pfx_insn;
165  uint8_t		default64;
166  uint8_t		opr_mode;
167  uint8_t		adr_mode;
168  uint8_t		br_far;
169  uint8_t		br_near;
170  uint8_t		implicit_addr;
171  uint8_t		c1;
172  uint8_t		c2;
173  uint8_t		c3;
174  uint8_t 		inp_cache[256];
175  uint8_t		inp_sess[64];
176  struct ud_itab_entry * itab_entry;
177};
178
179/* -----------------------------------------------------------------------------
180 * Type-definitions
181 * -----------------------------------------------------------------------------
182 */
183typedef enum ud_type 		ud_type_t;
184typedef enum ud_mnemonic_code	ud_mnemonic_code_t;
185
186typedef struct ud 		ud_t;
187typedef struct ud_operand 	ud_operand_t;
188
189#define UD_SYN_INTEL		ud_translate_intel
190#define UD_SYN_ATT		ud_translate_att
191#define UD_EOI			-1
192#define UD_INP_CACHE_SZ		32
193#define UD_VENDOR_AMD		0
194#define UD_VENDOR_INTEL		1
195
196#define bail_out(ud,error_code) longjmp( (ud)->bailout, error_code )
197#define try_decode(ud) if ( setjmp( (ud)->bailout ) == 0 )
198#define catch_error() else
199
200#endif
201