Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.  */
  34. enum 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.  */
  104. struct 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.  */
  134. struct 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.  */
  183. typedef enum ud_type            ud_type_t;
  184. typedef enum ud_mnemonic_code   ud_mnemonic_code_t;
  185.  
  186. typedef struct ud               ud_t;
  187. typedef 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.