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