Re: [PATCH -v5mkII 13/17] arm/ftrace: Use __patch_text()

Arnd Bergmann
2020-01-08T12:23:12Z

On Wed, Nov 13, 2019 at 10:29 AM Peter Zijlstra <peterz@infradead.org> wrote:
> @@ -49,8 +49,8 @@ obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
> obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o
> obj-$(CONFIG_ARM_ARCH_TIMER) += arch_timer.o
> obj-$(CONFIG_FUNCTION_TRACER) += entry-ftrace.o
> -obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o
> -obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o
> +obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o patch.o
> +obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o patch.o
> obj-$(CONFIG_JUMP_LABEL) += jump_label.o insn.o patch.o
> obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o

This broke randconfig builds with big-endian ARMv5:

../arch/arm/kernel/patch.c: In function '__patch_text_real':
../arch/arm/kernel/patch.c:94:11: error: implicit declaration of
function '__opcode_to_mem_thumb32'
[-Werror=implicit-function-declaration]
insn = __opcode_to_mem_thumb32(insn);
^~~~~~~~~~~~~~~~~~~~~~~

The problem is that we don't have a BE32 definition of
__opcode_to_mem_thumb32, mostly because no hardware
supports that.

One possible workaround is a big ugly:

diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
index d0a05a3bdb96..1067fd122897 100644
--- a/arch/arm/kernel/patch.c
+++ b/arch/arm/kernel/patch.c
@@ -90,9 +90,11 @@ void __kprobes __patch_text_real(void *addr,
unsigned int insn, bool remap)

size = sizeof(u32);
} else {
+#ifdef CONFIG_THUMB2_KERNEL
if (thumb2)
insn = __opcode_to_mem_thumb32(insn);
else
+#endif
insn = __opcode_to_mem_arm(insn);

*(u32 *)waddr = insn;

Any other suggestions?

Arnd