diff options
Diffstat (limited to '')
-rw-r--r-- | lib/arm/arch-dis.h | 4 | ||||
-rw-r--r-- | lib/arm64/arch-dis.h | 4 | ||||
-rw-r--r-- | lib/arm64/jump-patch.h | 5 |
3 files changed, 11 insertions, 2 deletions
diff --git a/lib/arm/arch-dis.h b/lib/arm/arch-dis.h index bc98cb9..8f2400b 100644 --- a/lib/arm/arch-dis.h +++ b/lib/arm/arch-dis.h @@ -39,6 +39,10 @@ static inline void arch_dis_ctx_init(struct arch_dis_ctx *ctx) { memset(ctx->it_conds, 0xe, 5); } +static inline int arch_code_alignment(struct arch_dis_ctx ctx) { + return ctx.pc_low_bit ? 2 : 4; +} + static inline void advance_it_cond(struct arch_dis_ctx *ctx) { ctx->it_conds[0] = ctx->it_conds[1]; ctx->it_conds[1] = ctx->it_conds[2]; diff --git a/lib/arm64/arch-dis.h b/lib/arm64/arch-dis.h index 2990f5a..f5b0518 100644 --- a/lib/arm64/arch-dis.h +++ b/lib/arm64/arch-dis.h @@ -26,6 +26,10 @@ static inline void arch_dis_ctx_init(struct arch_dis_ctx *ctx) { ctx->regs_possibly_written = 0; } +static inline int arch_code_alignment(UNUSED struct arch_dis_ctx ctx) { + return 4; +} + static inline int arm64_get_unwritten_temp_reg(struct arch_dis_ctx *ctx) { uint32_t avail = ~ctx->regs_possibly_written & ((1 << 19) - (1 << 9)); if (!avail) diff --git a/lib/arm64/jump-patch.h b/lib/arm64/jump-patch.h index 3d3d653..0a276ba 100644 --- a/lib/arm64/jump-patch.h +++ b/lib/arm64/jump-patch.h @@ -1,12 +1,13 @@ #pragma once #include "arm64/assemble.h" -#define MAX_JUMP_PATCH_SIZE 12 +#define MAX_JUMP_PATCH_SIZE 20 + static inline int jump_patch_size(uintptr_t pc, uintptr_t dpc, UNUSED struct arch_dis_ctx arch, bool force) { intptr_t diff = (dpc & ~0xfff) - (pc & ~0xfff); if (!(diff >= -0x100000000 && diff < 0x100000000)) - return force ? 16 : -1; + return force ? (size_of_MOVi64(dpc) + 4) : -1; else if (!(dpc & 0xfff)) return 8; else |