author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Tue, 14 Jun 2016 22:40:22 +0100 | |
changeset 21 | 7d99b51b4784 |
parent 0 | e4a716697bef |
permissions | -rw-r--r-- |
0
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
/* udis86 - libudis86/syn.c |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
2 |
* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
3 |
* Copyright (c) 2002-2013 Vivek Thampi |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
4 |
* All rights reserved. |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
5 |
* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
6 |
* Redistribution and use in source and binary forms, with or without modification, |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
7 |
* are permitted provided that the following conditions are met: |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
8 |
* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
9 |
* * Redistributions of source code must retain the above copyright notice, |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
10 |
* this list of conditions and the following disclaimer. |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
11 |
* * Redistributions in binary form must reproduce the above copyright notice, |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
12 |
* this list of conditions and the following disclaimer in the documentation |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
13 |
* and/or other materials provided with the distribution. |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
14 |
* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
15 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
16 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
17 |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
18 |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
19 |
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
20 |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
21 |
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
22 |
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
23 |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
24 |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
25 |
*/ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
26 |
#include "types.h" |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
27 |
#include "decode.h" |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
28 |
#include "syn.h" |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
#include "udint.h" |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
/* ----------------------------------------------------------------------------- |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
* Intel Register Table - Order Matters (types.h)! |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
* ----------------------------------------------------------------------------- |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
*/ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
const char* ud_reg_tab[] = |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
"al", "cl", "dl", "bl", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
38 |
"ah", "ch", "dh", "bh", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
"spl", "bpl", "sil", "dil", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
40 |
"r8b", "r9b", "r10b", "r11b", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
41 |
"r12b", "r13b", "r14b", "r15b", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
42 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
43 |
"ax", "cx", "dx", "bx", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
44 |
"sp", "bp", "si", "di", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
45 |
"r8w", "r9w", "r10w", "r11w", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
46 |
"r12w", "r13w" , "r14w", "r15w", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
47 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
48 |
"eax", "ecx", "edx", "ebx", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
49 |
"esp", "ebp", "esi", "edi", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
50 |
"r8d", "r9d", "r10d", "r11d", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
51 |
"r12d", "r13d", "r14d", "r15d", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
52 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
53 |
"rax", "rcx", "rdx", "rbx", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
54 |
"rsp", "rbp", "rsi", "rdi", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
55 |
"r8", "r9", "r10", "r11", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
56 |
"r12", "r13", "r14", "r15", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
57 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
58 |
"es", "cs", "ss", "ds", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
59 |
"fs", "gs", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
60 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
61 |
"cr0", "cr1", "cr2", "cr3", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
62 |
"cr4", "cr5", "cr6", "cr7", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
63 |
"cr8", "cr9", "cr10", "cr11", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
64 |
"cr12", "cr13", "cr14", "cr15", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
65 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
66 |
"dr0", "dr1", "dr2", "dr3", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
67 |
"dr4", "dr5", "dr6", "dr7", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
68 |
"dr8", "dr9", "dr10", "dr11", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
69 |
"dr12", "dr13", "dr14", "dr15", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
70 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
71 |
"mm0", "mm1", "mm2", "mm3", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
"mm4", "mm5", "mm6", "mm7", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
"st0", "st1", "st2", "st3", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
"st4", "st5", "st6", "st7", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
"xmm0", "xmm1", "xmm2", "xmm3", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
"xmm4", "xmm5", "xmm6", "xmm7", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
"xmm8", "xmm9", "xmm10", "xmm11", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
"xmm12", "xmm13", "xmm14", "xmm15", |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
"rip" |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
}; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
uint64_t |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
ud_syn_rel_target(struct ud *u, struct ud_operand *opr) |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
switch (opr->size) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
case 16: return (u->pc + opr->lval.sword) & trunc_mask; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
case 32: return (u->pc + opr->lval.sdword) & trunc_mask; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
default: UD_ASSERT(!"invalid relative offset size."); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
return 0ull; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
/* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
* asmprintf |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
* Printf style function for printing translated assembly |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
* output. Returns the number of characters written and |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
* moves the buffer pointer forward. On an overflow, |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
* returns a negative number and truncates the output. |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
106 |
*/ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
107 |
int |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
108 |
ud_asmprintf(struct ud *u, const char *fmt, ...) |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
109 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
110 |
int ret; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
111 |
int avail; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
112 |
va_list ap; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
113 |
va_start(ap, fmt); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
114 |
avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
115 |
ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
116 |
if (ret < 0 || ret > avail) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
117 |
u->asm_buf_fill = u->asm_buf_size - 1; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
118 |
} else { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
119 |
u->asm_buf_fill += ret; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
120 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
121 |
va_end(ap); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
122 |
return ret; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
123 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
124 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
125 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
126 |
void |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
127 |
ud_syn_print_addr(struct ud *u, uint64_t addr) |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
128 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
129 |
const char *name = NULL; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
130 |
if (u->sym_resolver) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
131 |
int64_t offset = 0; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
132 |
name = u->sym_resolver(u, addr, &offset); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
133 |
if (name) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
134 |
if (offset) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
135 |
ud_asmprintf(u, "%s%+" FMT64 "d", name, offset); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
136 |
} else { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
137 |
ud_asmprintf(u, "%s", name); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
138 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
139 |
return; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
140 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
141 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
142 |
ud_asmprintf(u, "0x%" FMT64 "x", addr); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
143 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
144 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
145 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
146 |
void |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
147 |
ud_syn_print_imm(struct ud* u, const struct ud_operand *op) |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
148 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
149 |
uint64_t v; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
150 |
if (op->_oprcode == OP_sI && op->size != u->opr_mode) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
151 |
if (op->size == 8) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
152 |
v = (int64_t)op->lval.sbyte; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
153 |
} else { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
154 |
UD_ASSERT(op->size == 32); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
155 |
v = (int64_t)op->lval.sdword; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
156 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
157 |
if (u->opr_mode < 64) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
158 |
v = v & ((1ull << u->opr_mode) - 1ull); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
159 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
160 |
} else { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
161 |
switch (op->size) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
162 |
case 8 : v = op->lval.ubyte; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
163 |
case 16: v = op->lval.uword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
164 |
case 32: v = op->lval.udword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
165 |
case 64: v = op->lval.uqword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
166 |
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
167 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
168 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
169 |
ud_asmprintf(u, "0x%" FMT64 "x", v); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
170 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
171 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
172 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
173 |
void |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
174 |
ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign) |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
175 |
{ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
176 |
UD_ASSERT(op->offset != 0); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
177 |
if (op->base == UD_NONE && op->index == UD_NONE) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
178 |
uint64_t v; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
179 |
UD_ASSERT(op->scale == UD_NONE && op->offset != 8); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
180 |
/* unsigned mem-offset */ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
181 |
switch (op->offset) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
182 |
case 16: v = op->lval.uword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
183 |
case 32: v = op->lval.udword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
184 |
case 64: v = op->lval.uqword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
185 |
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
186 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
187 |
ud_asmprintf(u, "0x%" FMT64 "x", v); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
188 |
} else { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
189 |
int64_t v; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
190 |
UD_ASSERT(op->offset != 64); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
191 |
switch (op->offset) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
192 |
case 8 : v = op->lval.sbyte; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
193 |
case 16: v = op->lval.sword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
194 |
case 32: v = op->lval.sdword; break; |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
195 |
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
196 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
197 |
if (v < 0) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
198 |
ud_asmprintf(u, "-0x%" FMT64 "x", -v); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
199 |
} else if (v > 0) { |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
200 |
ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v); |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
201 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
202 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
203 |
} |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
204 |
|
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
205 |
/* |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
206 |
vim: set ts=2 sw=2 expandtab |
e4a716697bef
Added sources of udis86 1.7.2
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
207 |
*/ |