Home | History | Annotate | Download | only in libudis86
      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