1 /* udis86 - libudis86/types.h 2 * 3 * Copyright (c) 2002-2013 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 #ifdef __KERNEL__ 30 /* -D__KERNEL__ is automatically passed on the command line when 31 building something as part of the Linux kernel */ 32 # include <linux/kernel.h> 33 # include <linux/string.h> 34 # ifndef __UD_STANDALONE__ 35 # define __UD_STANDALONE__ 1 36 #endif 37 #endif /* __KERNEL__ */ 38 39 #if defined(_MSC_VER) || defined(__BORLANDC__) 40 # include <stdint.h> 41 # include <stdio.h> 42 # define inline __inline /* MS Visual Studio requires __inline 43 instead of inline for C code */ 44 #elif !defined(__UD_STANDALONE__) 45 # include <stdio.h> 46 # include <inttypes.h> 47 #endif /* !__UD_STANDALONE__ */ 48 49 /* gcc specific extensions */ 50 #ifdef __GNUC__ 51 # define UD_ATTR_PACKED __attribute__((packed)) 52 #else 53 # define UD_ATTR_PACKED 54 #endif /* UD_ATTR_PACKED */ 55 56 57 /* ----------------------------------------------------------------------------- 58 * All possible "types" of objects in udis86. Order is Important! 59 * ----------------------------------------------------------------------------- 60 */ 61 enum 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 "itab.h" 128 129 union ud_lval { 130 int8_t sbyte; 131 uint8_t ubyte; 132 int16_t sword; 133 uint16_t uword; 134 int32_t sdword; 135 uint32_t udword; 136 int64_t sqword; 137 uint64_t uqword; 138 struct { 139 uint16_t seg; 140 uint32_t off; 141 } ptr; 142 }; 143 144 /* ----------------------------------------------------------------------------- 145 * struct ud_operand - Disassembled instruction Operand. 146 * ----------------------------------------------------------------------------- 147 */ 148 struct ud_operand { 149 enum ud_type type; 150 uint8_t size; 151 enum ud_type base; 152 enum ud_type index; 153 uint8_t scale; 154 uint8_t offset; 155 union ud_lval lval; 156 uint64_t disp; 157 /* 158 * internal use only 159 */ 160 uint8_t _oprcode; 161 }; 162 163 /* ----------------------------------------------------------------------------- 164 * struct ud - The udis86 object. 165 * ----------------------------------------------------------------------------- 166 */ 167 struct ud 168 { 169 /* 170 * input buffering 171 */ 172 int (*inp_hook) (struct ud*); 173 #ifndef __UD_STANDALONE__ 174 FILE* inp_file; 175 #endif 176 uint8_t inp_curr; 177 uint8_t inp_fill; 178 uint8_t inp_ctr; 179 const uint8_t* inp_buff; 180 const uint8_t* inp_buff_end; 181 uint8_t inp_end; 182 uint8_t inp_cache[256]; 183 uint8_t inp_sess[64]; 184 185 void (*translator)(struct ud*); 186 uint64_t insn_offset; 187 char insn_hexcode[64]; 188 189 /* 190 * Assembly output buffer 191 */ 192 char *asm_buf; 193 size_t asm_buf_size; 194 size_t asm_buf_fill; 195 char asm_buf_int[128]; 196 197 /* 198 * Symbol resolver for use in the translation phase. 199 */ 200 const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset); 201 202 uint8_t dis_mode; 203 uint64_t pc; 204 uint8_t vendor; 205 enum ud_mnemonic_code mnemonic; 206 struct ud_operand operand[3]; 207 uint8_t error; 208 uint8_t pfx_rex; 209 uint8_t pfx_seg; 210 uint8_t pfx_opr; 211 uint8_t pfx_adr; 212 uint8_t pfx_lock; 213 uint8_t pfx_str; 214 uint8_t pfx_rep; 215 uint8_t pfx_repe; 216 uint8_t pfx_repne; 217 uint8_t default64; 218 uint8_t opr_mode; 219 uint8_t adr_mode; 220 uint8_t br_far; 221 uint8_t br_near; 222 uint8_t implicit_addr; 223 uint8_t have_modrm; 224 uint8_t modrm; 225 uint8_t primary_opcode; 226 void * user_opaque_data; 227 struct ud_itab_entry * itab_entry; 228 struct ud_lookup_table_list_entry *le; 229 }; 230 231 /* ----------------------------------------------------------------------------- 232 * Type-definitions 233 * ----------------------------------------------------------------------------- 234 */ 235 typedef enum ud_type ud_type_t; 236 typedef enum ud_mnemonic_code ud_mnemonic_code_t; 237 238 typedef struct ud ud_t; 239 typedef struct ud_operand ud_operand_t; 240 241 #define UD_SYN_INTEL ud_translate_intel 242 #define UD_SYN_ATT ud_translate_att 243 #define UD_EOI (-1) 244 #define UD_INP_CACHE_SZ 32 245 #define UD_VENDOR_AMD 0 246 #define UD_VENDOR_INTEL 1 247 #define UD_VENDOR_ANY 2 248 249 #endif 250 251 /* 252 vim: set ts=2 sw=2 expandtab 253 */ 254