summaryrefslogtreecommitdiff
path: root/arch/arm64/mm/ktext.c
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2023-10-11 18:12:53 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2024-01-08 12:32:59 +0000
commita1cc8f6f851d6a4480781dcb431eacedee476cb8 (patch)
treecd45adf8a31a50d7cfb9b48f5b99094f0629bbfb /arch/arm64/mm/ktext.c
parent13cd9286564983305e5ca137d964d7781bacfcaa (diff)
arm64: text replication: handle aarch64_insn_write_literal_u64()
aarch64_insn_write_literal_u64() was introduced in v6.3-rc1 for updating ftrace ops pointers in the kernel text. This needs to be fixed up for kernel text replication, so provide a version that will update the mapping. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch/arm64/mm/ktext.c')
-rw-r--r--arch/arm64/mm/ktext.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/arm64/mm/ktext.c b/arch/arm64/mm/ktext.c
index 04b5ceddae4e..0017e7760d36 100644
--- a/arch/arm64/mm/ktext.c
+++ b/arch/arm64/mm/ktext.c
@@ -17,6 +17,27 @@
static void *kernel_texts[MAX_NUMNODES];
+noinstr void ktext_replication_write(void *addr, void *data, size_t size)
+{
+ unsigned long offset;
+ void *ptr;
+ int nid;
+
+ if (!is_kernel_text((unsigned long)addr))
+ return;
+
+ offset = (unsigned long)addr - (unsigned long)_stext;
+
+ for_each_node(nid) {
+ if (!kernel_texts[nid] || !nid)
+ continue;
+
+ ptr = kernel_texts[nid] + offset;
+
+ memcpy(ptr, data, size);
+ }
+}
+
void __kprobes ktext_replication_patch(u32 *tp, __le32 insn)
{
unsigned long offset;