• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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