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