This commit is contained in:
liankong
2025-03-30 02:12:49 +08:00
parent 1306acc017
commit 2c4103bcc3

View File

@@ -406,15 +406,8 @@ typedef enum {
RELOC_OP_PAGE RELOC_OP_PAGE
} reloc_op_t; } reloc_op_t;
typedef enum {
AARCH64_INSN_IMM_16, // 16-bit 立即数MOVZ/MOVK
AARCH64_INSN_IMM_26, // 26-bit 跳转偏移B/BL
AARCH64_INSN_IMM_ADR, // 21-bit 页偏移ADR/ADRP
AARCH64_INSN_IMM_19 // 19-bit 条件跳转
} aarch64_insn_imm_type;
/* 编码立即数到指令 */ /* 编码立即数到指令 */
static u32 aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bits) static u32 K_aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bits)
{ {
u32 mask = (BIT(bits) - 1) << shift; u32 mask = (BIT(bits) - 1) << shift;
return (insn & ~mask) | ((imm & (BIT(bits) - 1)) << shift); return (insn & ~mask) | ((imm & (BIT(bits) - 1)) << shift);
@@ -429,19 +422,19 @@ int aarch64_insn_patch_imm(void *addr, aarch64_insn_imm_type type, s64 imm)
switch (type) { switch (type) {
case AARCH64_INSN_IMM_16: case AARCH64_INSN_IMM_16:
/* MOVZ/MOVK: imm[15:0] → shift=5, bits=16 */ /* MOVZ/MOVK: imm[15:0] → shift=5, bits=16 */
new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 16); new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 16);
break; break;
case AARCH64_INSN_IMM_26: case AARCH64_INSN_IMM_26:
/* B/BL: offset[25:0] → shift=0, bits=26 */ /* B/BL: offset[25:0] → shift=0, bits=26 */
new_insn = aarch64_insn_encode_immediate(insn, imm, 0, 26); new_insn = K_aarch64_insn_encode_immediate(insn, imm, 0, 26);
break; break;
case AARCH64_INSN_IMM_ADR: case AARCH64_INSN_IMM_ADR:
/* ADR/ADRP: imm[20:0] → shift=5, bits=21 */ /* ADR/ADRP: imm[20:0] → shift=5, bits=21 */
new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 21); new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 21);
break; break;
case AARCH64_INSN_IMM_19: case AARCH64_INSN_IMM_19:
/* 条件跳转: offset[18:0] → shift=5, bits=19 */ /* 条件跳转: offset[18:0] → shift=5, bits=19 */
new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 19); new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 19);
break; break;
default: default:
return -EINVAL; return -EINVAL;