diff --git a/lightening/aarch64.c b/lightening/aarch64.c index 2e525166c..b605cc53a 100644 --- a/lightening/aarch64.c +++ b/lightening/aarch64.c @@ -114,8 +114,12 @@ DEFINE_ENCODER(size, 2, 22, unsigned, uint32_t) } \ } -DEFINE_PATCHABLE_INSTRUCTION(jmp, simm26, JMP_WITH_VENEER, 2); -DEFINE_PATCHABLE_INSTRUCTION(jcc, simm19, JCC_WITH_VENEER, 2); +#define DEFINE_PATCHABLE_INSTRUCTIONS(name, kind, RELOC, rsh) \ + DEFINE_PATCHABLE_INSTRUCTION(name, kind, RELOC, rsh); \ + DEFINE_PATCHABLE_INSTRUCTION(veneer_##name, kind, RELOC, rsh); + +DEFINE_PATCHABLE_INSTRUCTIONS(jmp, simm26, JMP_WITH_VENEER, 2); +DEFINE_PATCHABLE_INSTRUCTIONS(jcc, simm19, JCC_WITH_VENEER, 2); DEFINE_PATCHABLE_INSTRUCTION(load_from_pool, simm19, LOAD_FROM_POOL, 2); struct veneer diff --git a/lightening/arm-cpu.c b/lightening/arm-cpu.c index d96d57b2d..8e3b12196 100644 --- a/lightening/arm-cpu.c +++ b/lightening/arm-cpu.c @@ -325,6 +325,12 @@ patch_jmp_offset(uint32_t *loc, int32_t v) write_wide_thumb(loc, patch_thumb_jump(read_wide_thumb(loc), v)); } +static void +patch_veneer_jmp_offset(uint32_t *loc, int32_t v) +{ + patch_jmp_offset(loc, v); +} + static jit_reloc_t emit_thumb_jump(jit_state_t *_jit, uint32_t inst) { @@ -401,6 +407,12 @@ patch_jcc_offset(uint32_t *loc, int32_t v) write_wide_thumb(loc, patch_thumb_cc_jump(read_wide_thumb(loc), v)); } +static void +patch_veneer_jcc_offset(uint32_t *loc, int32_t v) +{ + patch_jcc_offset(loc, v); +} + static jit_reloc_t emit_thumb_cc_jump(jit_state_t *_jit, uint32_t inst) { diff --git a/lightening/lightening.c b/lightening/lightening.c index 8d4c3d7cd..09402634b 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -107,9 +107,11 @@ static void emit_literal_pool(jit_state_t *_jit, enum guard_pool guard); static int32_t read_jmp_offset(uint32_t *loc); static int offset_in_jmp_range(ptrdiff_t offset); static void patch_jmp_offset(uint32_t *loc, ptrdiff_t offset); +static void patch_veneer_jmp_offset(uint32_t *loc, ptrdiff_t offset); static int32_t read_jcc_offset(uint32_t *loc); static int offset_in_jcc_range(ptrdiff_t offset); static void patch_jcc_offset(uint32_t *loc, ptrdiff_t offset); +static void patch_veneer_jcc_offset(uint32_t *loc, ptrdiff_t offset); static void patch_veneer(uint32_t *loc, jit_pointer_t addr); static int32_t read_load_from_pool_offset(uint32_t *loc); #endif @@ -1367,11 +1369,11 @@ emit_literal_pool(jit_state_t *_jit, enum guard_pool guard) switch (entry->reloc.kind & JIT_RELOC_MASK) { case JIT_RELOC_JMP_WITH_VENEER: - patch_jmp_offset((uint32_t*) loc, diff); + patch_veneer_jmp_offset((uint32_t*) loc, diff); emit_veneer(_jit, (void*) (uintptr_t) entry->value); break; case JIT_RELOC_JCC_WITH_VENEER: - patch_jcc_offset((uint32_t*) loc, diff); + patch_veneer_jcc_offset((uint32_t*) loc, diff); emit_veneer(_jit, (void*) (uintptr_t) entry->value); break; case JIT_RELOC_LOAD_FROM_POOL: