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