Messages in this thread | | | Date | Wed, 8 Jan 2020 09:16:28 -0500 | From | Steven Rostedt <> | Subject | Re: [PATCH -v5mkII 13/17] arm/ftrace: Use __patch_text() |
| |
On Wed, 8 Jan 2020 13:22:52 +0100 Arnd Bergmann <arnd@arndb.de> wrote:
> 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)
If we change the above to:
if (IS_ENABLED(CONFIG_THUMB2_KERNEL) && thumb2)
Would the compiler optmize out __opcode_to_mem_thumb32(). We would need to add a declaration for it, but wont need to define it. At least we wont have nasty #ifdef logic in the code.
-- Steve
> insn = __opcode_to_mem_thumb32(insn); > else > +#endif > insn = __opcode_to_mem_arm(insn); > > *(u32 *)waddr = insn; > > > Any other suggestions? > > Arnd
| |