130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* udis86 - libudis86/types.h 230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (c) 2002-2013 Vivek Thampi 430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * All rights reserved. 530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Redistribution and use in source and binary forms, with or without modification, 730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are permitted provided that the following conditions are met: 830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * * Redistributions of source code must retain the above copyright notice, 1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * this list of conditions and the following disclaimer. 1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * * Redistributions in binary form must reproduce the above copyright notice, 1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * this list of conditions and the following disclaimer in the documentation 1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and/or other materials provided with the distribution. 1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef UD_TYPES_H 2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define UD_TYPES_H 2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifdef __KERNEL__ 3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* -D__KERNEL__ is automatically passed on the command line when 3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng building something as part of the Linux kernel */ 3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <linux/kernel.h> 3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <linux/string.h> 3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# ifndef __UD_STANDALONE__ 3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define __UD_STANDALONE__ 1 3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif 3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* __KERNEL__ */ 3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if defined(_MSC_VER) || defined(__BORLANDC__) 4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <stdint.h> 4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <stdio.h> 4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define inline __inline /* MS Visual Studio requires __inline 4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng instead of inline for C code */ 4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#elif !defined(__UD_STANDALONE__) 4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <stdio.h> 4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <inttypes.h> 4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* !__UD_STANDALONE__ */ 4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* gcc specific extensions */ 5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifdef __GNUC__ 5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define UD_ATTR_PACKED __attribute__((packed)) 5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#else 5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define UD_ATTR_PACKED 5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* UD_ATTR_PACKED */ 5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* ----------------------------------------------------------------------------- 5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * All possible "types" of objects in udis86. Order is Important! 5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ----------------------------------------------------------------------------- 6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 61e87eaf040ab639e94ed0a58ff0eac68d1d38fb0aEd Heylenum ud_type 6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{ 6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_NONE, 6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 8 bit GPRs */ 6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL, 6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH, 6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL, 6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B, 7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B, 7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 16 bit GPRs */ 7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX, 7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI, 7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W, 7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W, 7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 32 bit GPRs */ 7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX, 8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI, 8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D, 8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D, 8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 64 bit GPRs */ 8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX, 8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI, 8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11, 8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15, 8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* segment registers */ 9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, 9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_FS, UD_R_GS, 9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* control registers*/ 9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3, 9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7, 9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11, 9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15, 9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* debug registers */ 10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3, 10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7, 10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11, 10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15, 10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* mmx registers */ 10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, 10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, 10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* x87 registers */ 11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, 11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, 11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* extended multimedia registers */ 11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3, 11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7, 11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11, 11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15, 11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_R_RIP, 12130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 12230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* Operand Types */ 12330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, 12430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng UD_OP_JIMM, UD_OP_CONST 12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}; 12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include "itab.h" 12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 12930692c65c4174412c90e79489e98ab85c1a7412fBen Chengunion ud_lval { 13030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int8_t sbyte; 13130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint8_t ubyte; 13230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int16_t sword; 13330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint16_t uword; 13430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int32_t sdword; 13530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint32_t udword; 13630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int64_t sqword; 13730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint64_t uqword; 13830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng struct { 13930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint16_t seg; 14030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint32_t off; 14130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } ptr; 14230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}; 14330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 14430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* ----------------------------------------------------------------------------- 14530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * struct ud_operand - Disassembled instruction Operand. 14630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ----------------------------------------------------------------------------- 14730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 14830692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct ud_operand { 14930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng enum ud_type type; 15030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint8_t size; 15130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng enum ud_type base; 15230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng enum ud_type index; 15330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint8_t scale; 15430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint8_t offset; 15530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng union ud_lval lval; 15630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint64_t disp; 15730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 15830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * internal use only 15930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 16030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng uint8_t _oprcode; 16130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}; 16230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 16330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* ----------------------------------------------------------------------------- 164 * struct ud - The udis86 object. 165 * ----------------------------------------------------------------------------- 166 */ 167struct 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 */ 235typedef enum ud_type ud_type_t; 236typedef enum ud_mnemonic_code ud_mnemonic_code_t; 237 238typedef struct ud ud_t; 239typedef 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/* 252vim: set ts=2 sw=2 expandtab 253*/ 254