13#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
14static uint32_t _asm_x86_inslen(
const uint8_t*
p)
16 static const uint8_t map_op1[256] = {
17 0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x20,
18 0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,
19 0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,
20 0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,
22 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
24 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,
26 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,
27 0x51,0x51,0x92,0x92,0x10,0x10,0x12,0x11,0x45,0x86,0x52,0x93,0x51,0x51,0x51,0x51,
28 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
29 0x93,0x86,0x93,0x93,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,
30 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x47,0x51,0x51,0x51,0x51,0x51,
32 0x59,0x59,0x59,0x59,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,
34 0x55,0x55,0x55,0x55,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,
36 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,
37 0x93,0x93,0x53,0x51,0x70,0x71,0x93,0x86,0x54,0x51,0x53,0x51,0x51,0x52,0x51,0x51,
38 0x92,0x92,0x92,0x92,0x52,0x52,0x51,0x51,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,
39 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x45,0x45,0x47,0x52,0x51,0x51,0x51,0x51,
40 0x10,0x51,0x10,0x10,0x51,0x51,0x63,0x66,0x51,0x51,0x51,0x51,0x51,0x51,0x92,0x92
42 static const uint8_t map_op2[256] = {
43 0x93,0x93,0x93,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x93,0x52,0x94,
44 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
45 0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
46 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x34,0x51,0x35,0x51,0x51,0x51,0x51,0x51,
47 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
48 0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
49 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
50 0x94,0x54,0x54,0x54,0x93,0x93,0x93,0x52,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
51 0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
52 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
53 0x52,0x52,0x52,0x93,0x94,0x93,0x51,0x51,0x52,0x52,0x52,0x93,0x94,0x93,0x93,0x93,
54 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x94,0x93,0x93,0x93,0x93,0x93,
55 0x93,0x93,0x94,0x93,0x94,0x94,0x94,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
56 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
57 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
58 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x52
61 uint32_t prefixes = 0;
62 uint32_t x = map_op1[*
p];
67 return result + x + (prefixes & 4);
87 }
else if ((prefixes & 2) && (x == 0x66)) {
136 if (x < 0x40 && (
p[1] & 7) == 5) {
148static int ir_patch_code(
const void *code,
size_t size,
const void *from_addr,
const void *to_addr)
156 if ((*(unaligned_uint16_t*)
p & 0xf0ff) == 0x800f &&
p + *(unaligned_int32_t*)(
p+2) == (uint8_t*)from_addr - 6) {
157 *(unaligned_int32_t*)(
p+2) = ((uint8_t*)to_addr - (
p + 6));
159 }
else if (*
p == 0xe9 &&
p + *(unaligned_int32_t*)(
p+1) == (uint8_t*)from_addr - 5) {
160 *(unaligned_int32_t*)(
p+1) = ((uint8_t*)to_addr - (
p + 5));
163 p += _asm_x86_inslen(
p);
171#elif defined(IR_TARGET_AARCH64)
173static int ir_patch_code(
const void *code,
size_t size,
const void *from_addr,
const void *to_addr)
177 const void *veneer =
NULL;
180 end = (uint8_t*)code;
187 ins_ptr = (uint32_t*)
p;
189 if ((ins & 0xfc000000u) == 0x14000000u) {
191 delta = (uint32_t*)from_addr - ins_ptr;
192 if (((ins ^ (uint32_t)delta) & 0x01ffffffu) == 0) {
193 delta = (uint32_t*)to_addr - ins_ptr;
194 if (((delta + 0x02000000) >> 26) != 0) {
197 *ins_ptr = (ins & 0xfc000000u) | ((uint32_t)delta & 0x03ffffffu);
203 }
else if ((ins & 0xff000000u) == 0x54000000u ||
204 (ins & 0x7e000000u) == 0x34000000u) {
206 delta = (uint32_t*)from_addr - ins_ptr;
207 if (((ins ^ ((uint32_t)delta << 5)) & 0x00ffffe0u) == 0) {
208 delta = (uint32_t*)to_addr - ins_ptr;
209 if (((delta + 0x40000) >> 19) != 0) {
211 delta = (uint32_t*)veneer - ins_ptr;
212 if (((delta + 0x40000) >> 19) != 0) {
219 *ins_ptr = (ins & 0xff00001fu) | (((uint32_t)delta & 0x7ffffu) << 5);
222 }
else if ((ins & 0x7e000000u) == 0x36000000u) {
224 delta = (uint32_t*)from_addr - ins_ptr;
225 if (((ins ^ ((uint32_t)delta << 5)) & 0x0007ffe0u) == 0) {
226 delta = (uint32_t*)to_addr - ins_ptr;
227 if (((delta + 0x2000) >> 14) != 0) {
229 delta = (uint32_t*)veneer - ins_ptr;
230 if (((delta + 0x2000) >> 14) != 0) {
237 *ins_ptr = (ins & 0xfff8001fu) | (((uint32_t)delta & 0x3fffu) << 5);
251int ir_patch(
const void *code,
size_t size, uint32_t jmp_table_size,
const void *from_addr,
const void *to_addr)
255 if (jmp_table_size) {
256 const void **jmp_slot = (
const void **)((
char*)code +
IR_ALIGNED_SIZE(
size,
sizeof(
void*)));
259 if (*jmp_slot == from_addr) {
264 }
while (--jmp_table_size);
267 ret += ir_patch_code(code,
size, from_addr, to_addr);
int ir_mem_flush(void *ptr, size_t size)
int ir_patch(const void *code, size_t size, uint32_t jmp_table_size, const void *from_addr, const void *to_addr)
#define IR_ALIGNED_SIZE(size, alignment)
#define IR_SET_ALIGNED(alignment, decl)
unsigned const char * end