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