From 2c4103bcc344395d7a203ce1d19d0c437aec21d0 Mon Sep 17 00:00:00 2001 From: liankong Date: Sun, 30 Mar 2025 02:12:49 +0800 Subject: [PATCH 1/2] 1 --- kernel/kpm/kpm.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 73545905..052e85c3 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -406,15 +406,8 @@ typedef enum { RELOC_OP_PAGE } 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; 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) { case AARCH64_INSN_IMM_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; case AARCH64_INSN_IMM_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; case AARCH64_INSN_IMM_ADR: /* 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; case AARCH64_INSN_IMM_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; default: return -EINVAL; From 6a6c460bd54676163628606f55787161841b57f2 Mon Sep 17 00:00:00 2001 From: liankong Date: Sun, 30 Mar 2025 02:17:27 +0800 Subject: [PATCH 2/2] 2 --- kernel/kpm/kpm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 052e85c3..eb67c9e6 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -414,7 +414,7 @@ static u32 K_aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bit } /* 修补指令中的立即数字段 */ -int aarch64_insn_patch_imm(void *addr, aarch64_insn_imm_type type, s64 imm) +int aarch64_insn_patch_imm(void *addr, enum aarch64_insn_imm_type type, s64 imm) { u32 insn = le32_to_cpu(*(u32 *)addr); u32 new_insn;