58 lines
1.6 KiB
Diff
58 lines
1.6 KiB
Diff
From adafc04638712b7227328e44c0e023b5d3c46f53 Mon Sep 17 00:00:00 2001
|
|
From: Zhipeng Xie <xiezhipeng1@huawei.com>
|
|
Date: Sun, 14 Nov 2021 17:26:59 +0800
|
|
Subject: [PATCH 03/37] create-diff-object:support
|
|
kpatch_line_macro_change_only on aarch64
|
|
|
|
implement kpatch_line_macro_change_only on aarch64
|
|
|
|
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
|
|
---
|
|
kpatch-build/create-diff-object.c | 16 ++++++++++++++++
|
|
1 file changed, 16 insertions(+)
|
|
|
|
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
|
|
index 3b677d3..2ad0791 100644
|
|
--- a/kpatch-build/create-diff-object.c
|
|
+++ b/kpatch-build/create-diff-object.c
|
|
@@ -647,6 +647,17 @@ static bool insn_is_load_immediate(struct kpatch_elf *kelf, void *addr)
|
|
|
|
break;
|
|
|
|
+ case ARM64:
|
|
+ /*
|
|
+ * aarch64 immediate move insns is Little-Endian:
|
|
+ *
|
|
+ * 52 80 00 41 mov w1, #0x2
|
|
+ */
|
|
+ if ((insn[3] & 0x7f) == 0x52 && (insn[2] & 0x80) == 0x80)
|
|
+ return true;
|
|
+
|
|
+ break;
|
|
+
|
|
case S390:
|
|
/* arg2: lghi %r3, imm */
|
|
if (insn[0] == 0xa7 && insn[1] == 0x39)
|
|
@@ -698,6 +709,7 @@ static bool kpatch_line_macro_change_only(struct kpatch_elf *kelf,
|
|
void *data1, *data2, *insn1, *insn2;
|
|
struct rela *r, *rela;
|
|
bool found, found_any = false;
|
|
+ unsigned int mov_imm_mask = ((1<<16) - 1)<<5;
|
|
|
|
if (sec->status != CHANGED ||
|
|
is_rela_section(sec) ||
|
|
@@ -743,6 +755,10 @@ static bool kpatch_line_macro_change_only(struct kpatch_elf *kelf,
|
|
!insn_is_load_immediate(kelf, insn2))
|
|
return false;
|
|
|
|
+ if ((*(int *)(insn1) & ~mov_imm_mask) !=
|
|
+ (*(int *)(insn2) & ~mov_imm_mask))
|
|
+ return false;
|
|
+
|
|
found = false;
|
|
list_for_each_entry(r, &sec->rela->relas, list) {
|
|
|
|
--
|
|
2.33.0
|
|
|