1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* udis86 - libudis86/udis86.c
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Copyright (c) 2002-2013 Vivek Thampi
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * All rights reserved.
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without modification,
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * are permitted provided that the following conditions are met:
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright notice,
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *       this list of conditions and the following disclaimer.
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above copyright notice,
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *       this list of conditions and the following disclaimer in the documentation
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *       and/or other materials provided with the distribution.
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "input.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extern.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "decode.h"
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(__UD_STANDALONE__)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# if HAVE_STRING_H
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#  include <string.h>
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# endif
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif /* !__UD_STANDALONE__ */
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_init() - Initializes ud_t object.
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern void
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_init(struct ud* u)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset((void*)u, 0, sizeof(struct ud));
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ud_set_mode(u, 16);
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->mnemonic = UD_Iinvalid;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ud_set_pc(u, 0);
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef __UD_STANDALONE__
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ud_set_input_file(u, stdin);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif /* __UD_STANDALONE__ */
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_disassemble() - disassembles one instruction and returns the number of
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * bytes disassembled. A zero means end of disassembly.
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern unsigned int
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_disassemble(struct ud* u)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ud_input_end(u))
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return 0;
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->asm_buf[0] = 0;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ud_decode(u) == 0)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return 0;
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (u->translator)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->translator(u);
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ud_insn_len(u);
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_mode() - Set Disassemly Mode.
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern void
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_mode(struct ud* u, uint8_t m)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  switch(m) {
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  case 16:
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  case 32:
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  case 64: u->dis_mode = m ; return;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  default: u->dis_mode = 16; return;
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_vendor() - Set vendor.
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern void
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_vendor(struct ud* u, unsigned v)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  switch(v) {
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  case UD_VENDOR_INTEL:
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    u->vendor = v;
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    break;
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  case UD_VENDOR_ANY:
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    u->vendor = v;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    break;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  default:
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    u->vendor = UD_VENDOR_AMD;
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_pc() - Sets code origin.
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern void
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_pc(struct ud* u, uint64_t o)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->pc = o;
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_syntax() - Sets the output syntax.
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern void
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_syntax(struct ud* u, void (*t)(struct ud*))
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->translator = t;
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn() - returns the disassembled instruction
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char*
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_asm(const struct ud* u)
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->asm_buf;
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn_offset() - Returns the offset.
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)uint64_t
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_off(const struct ud* u)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->insn_offset;
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn_hex() - Returns hex form of disassembled instruction.
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char*
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_hex(struct ud* u)
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->insn_hexcode[0] = 0;
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!u->error) {
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    unsigned int i;
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    unsigned char *src_ptr = inp_sess(u);
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    char* src_hex;
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    src_hex = (char*) u->insn_hexcode;
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /* for each byte used to decode instruction */
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (i = 0; i < u->inp_ctr && i < sizeof(u->insn_hexcode) / 2;
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         ++i, ++src_ptr) {
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      sprintf(src_hex, "%02x", *src_ptr & 0xFF);
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      src_hex += 2;
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->insn_hexcode;
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn_ptr() - Returns code disassembled.
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern const uint8_t*
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_ptr(const struct ud* u)
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->inp_sess;
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn_len() - Returns the count of bytes disassembled.
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern unsigned int
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_len(const struct ud* u)
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->inp_ctr;
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_insn_get_opr
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Return the operand struct representing the nth operand of
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    the currently disassembled instruction. Returns NULL if
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    there's no such operand.
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const struct ud_operand*
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_insn_opr(const struct ud *u, unsigned int n)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (n > 2 || u->operand[n].type == UD_NONE) {
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return &u->operand[n];
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_opr_is_sreg
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Returns non-zero if the given operand is of a segment register type.
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_opr_is_sreg(const struct ud_operand *opr)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return opr->type == UD_OP_REG &&
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         opr->base >= UD_R_ES   &&
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         opr->base <= UD_R_GS;
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_opr_is_sreg
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Returns non-zero if the given operand is of a general purpose
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    register type.
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_opr_is_gpr(const struct ud_operand *opr)
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return opr->type == UD_OP_REG &&
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         opr->base >= UD_R_AL   &&
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         opr->base <= UD_R_R15;
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_user_opaque_data
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_get_user_opaque_data
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Get/set user opaqute data pointer
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_user_opaque_data(struct ud * u, void* opaque)
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->user_opaque_data = opaque;
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void*
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_get_user_opaque_data(const struct ud *u)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return u->user_opaque_data;
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_asm_buffer
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Allow the user to set an assembler output buffer. If `buf` is NULL,
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    we switch back to the internal buffer.
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_asm_buffer(struct ud *u, char *buf, size_t size)
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (buf == NULL) {
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    u->asm_buf = buf;
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    u->asm_buf_size = size;
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* =============================================================================
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * ud_set_sym_resolver
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    Set symbol resolver for relative targets used in the translation
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    phase.
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    The resolver is a function that takes a uint64_t address and returns a
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    symbolic name for the that address. The function also takes a second
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    argument pointing to an integer that the client can optionally set to a
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    non-zero value for offsetted targets. (symbol+offset) The function may
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    also return NULL, in which case the translator only prints the target
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    address.
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *    The function pointer maybe NULL which resets symbol resolution.
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * =============================================================================
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*,
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                          uint64_t addr,
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                          int64_t *offset))
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  u->sym_resolver = resolver;
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/*
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)vim:set ts=2 sw=2 expandtab
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)*/
305