ARM: ftrace MODULE_PLTS warning fixes
cover ARM: ftrace MODULE_PLTS warning fixes
This patch series is present in v5.14 and fixes warnings seen at insmod with FTRACE and MODULE_PLTS enabled on ARM/Linux.
Alex Sverdlin (3):
ARM: 9077/1: PLT: Move struct plt_entries definition to header
ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
ARM: 9079/1: ftrace: Add MODULE_PLTS support
arch/arm/include/asm/ftrace.h | 3 +++ arch/arm/include/asm/insn.h | 8 +++--- arch/arm/include/asm/module.h | 10 +++++++ arch/arm/kernel/ftrace.c | 46 ++++++++++++++++++++++++++------ arch/arm/kernel/insn.c | 19 +++++++------- arch/arm/kernel/module-plts.c | 49 +++++++++++++++++++++++++++-------- 6 files changed, 103 insertions(+), 32 deletions(-)
Signature · 1 line
2.25.1
PATCH 1/3 ARM: 9077/1: PLT: Move struct plt_entries definition to header
From: Alex Sverdlin <[email protected]>
commit 4e271701c17dee70c6e1351c4d7d42e70405c6a9 upstream upstream
No functional change, later it will be re-used in several files.
--- arch/arm/include/asm/module.h | 9 +++++++++ arch/arm/kernel/module-plts.c | 9 --------- 2 files changed, 9 insertions(+), 9 deletions(-)
arch/arm/include/asm/module.h +9 -0
@@ -19,6 +19,15 @@ enum { };#endif +#define PLT_ENT_STRIDE L1_CACHE_BYTES +#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) +#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) + +struct plt_entries { +u32 ldr[PLT_ENT_COUNT ]; +u32 lit[PLT_ENT_COUNT ]; +}; +struct mod_plt_sec {struct elf32_shdr *plt;int plt_count;
arch/arm/kernel/module-plts.c +0 -9
@@ -12,10 +12,6 @@#include <asm/cache.h> #include <asm/opcodes.h> -#define PLT_ENT_STRIDE L1_CACHE_BYTES -#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) -#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) -#ifdef CONFIG_THUMB2_KERNEL #define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \ (PLT_ENT_STRIDE - 4))
@@ -24,11 +20,6 @@ (PLT_ENT_STRIDE - 8))#endif -struct plt_entries { -u32 ldr[PLT_ENT_COUNT ]; -u32 lit[PLT_ENT_COUNT ]; -}; -static bool in_init (const struct module *mod,unsigned long loc) {return loc - (u32 )mod->init_layout.base < mod->init_layout.size;
Signature · 1 line
2.25.1
PATCH 2/3 ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
In reply to Florian FainelliFrom: Alex Sverdlin <[email protected]>
commit 890cb057a46d323fd8c77ebecb6485476614cd21 upstream
Will be used in the following patch. No functional change.
--- arch/arm/include/asm/insn.h | 8 ++++---- arch/arm/kernel/ftrace.c | 2 +- arch/arm/kernel/insn.c | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-)
arch/arm/include/asm/insn.h +4 -4
@@ -13,18 +13,18 @@ arm_gen_nop(void) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link); +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn);static inline unsigned long arm_gen_branch (unsigned long pc,unsigned long addr) { -return __arm_gen_branch (pc, addr, false); +return __arm_gen_branch (pc, addr, false, true); }static inline unsigned long -arm_gen_branch_link (unsigned long pc,unsigned long addr) +arm_gen_branch_link (unsigned long pc,unsigned long addr,bool warn) { -return __arm_gen_branch (pc, addr, true); +return __arm_gen_branch (pc, addr, true, warn); }#endif
arch/arm/kernel/ftrace.c +1 -1
@@ -70,7 +70,7 @@ int ftrace_arch_code_modify_post_process(void)static unsigned long ftrace_call_replace (unsigned long pc,unsigned long addr) { -return arm_gen_branch_link (pc, addr); +return arm_gen_branch_link (pc, addr, true); } static int ftrace_modify_code(unsigned long pc, unsigned long old,
arch/arm/kernel/insn.c +10 -9
@@ -3,8 +3,9 @@#include <linux/kernel.h> #include <asm/opcodes.h> -static unsigned long -__arm_gen_branch_thumb2 (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_thumb2 (unsigned long pc, +unsigned long addr,bool link, +bool warn) {unsigned long s, j1, j2, i1, i2, imm10, imm11;unsigned long first, second;
@@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +4 );if (offset <-16777216 || offset >16777214 ) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)return __opcode_thumb32_compose (first, second); } -static unsigned long -__arm_gen_branch_arm (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_arm (unsigned long pc,unsigned long addr, +bool link,bool warn) {unsigned long opcode =0xea000000 ;long offset;
@@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +8 );if (unlikely (offset <-33554432 || offset >33554428 )) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link) +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn) {if (IS_ENABLED (CONFIG_THUMB2_KERNEL )) -return __arm_gen_branch_thumb2 (pc, addr, link); +return __arm_gen_branch_thumb2 (pc, addr, link, warn);else -return __arm_gen_branch_arm (pc, addr, link); +return __arm_gen_branch_arm (pc, addr, link, warn); }
Signature · 1 line
2.25.1
PATCH 3/3 ARM: 9079/1: ftrace: Add MODULE_PLTS support
In reply to Florian FainelliFrom: Alex Sverdlin <[email protected]>
commit 79f32b221b18c15a98507b101ef4beb52444cc6f upstream
Teach ftrace_make_call() and ftrace_make_nop() about PLTs. Teach PLT code about FTRACE and all its callbacks. Otherwise the following might happen:
------------[ cut here ]------------ WARNING: CPU: 14 PID: 2265 at .../arch/arm/kernel/insn.c:14 __arm_gen_branch+0x83/0x8c() ... Hardware name: LSI Axxia AXM55XX [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14) [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8) [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90) [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c) [<c03218f3>] (warn_slowpath_null) from [<c03143cf>] (__arm_gen_branch+0x83/0x8c) [<c03143cf>] (__arm_gen_branch) from [<c0314337>] (ftrace_make_nop+0xf/0x24) [<c0314337>] (ftrace_make_nop) from [<c038ebcb>] (ftrace_process_locs+0x27b/0x3e8) [<c038ebcb>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44) [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84) [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18) ---[ end trace e1b64ced7a89adcc ]--- ------------[ cut here ]------------ WARNING: CPU: 14 PID: 2265 at .../kernel/trace/ftrace.c:1979 ftrace_bug+0x1b1/0x234() ... Hardware name: LSI Axxia AXM55XX [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14) [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8) [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90) [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c) [<c03218f3>] (warn_slowpath_null) from [<c038e87d>] (ftrace_bug+0x1b1/0x234) [<c038e87d>] (ftrace_bug) from [<c038ebd5>] (ftrace_process_locs+0x285/0x3e8) [<c038ebd5>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44) [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84) [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18) ---[ end trace e1b64ced7a89adcd ]---
ftrace failed to modify [<e9ef7006>] 0xe9ef7006
actual: 02:f0:3b:fa
ftrace record flags: 0
(0) expected tramp: c0314265
--- arch/arm/include/asm/ftrace.h | 3 +++ arch/arm/include/asm/module.h | 1 + arch/arm/kernel/ftrace.c | 46 +++++++++++++++++++++++++++++------ arch/arm/kernel/module-plts.c | 44 ++++++++++++++++++++++++++++++--- 4 files changed, 82 insertions(+), 12 deletions(-)
arch/arm/include/asm/ftrace.h +3 -0
@@ -15,6 +15,9 @@ extern void __gnu_mcount_nc(void);#ifdef CONFIG_DYNAMIC_FTRACE struct dyn_arch_ftrace { +#ifdef CONFIG_ARM_MODULE_PLTS +struct module *mod; +#endif };static inline unsigned long ftrace_call_adjust (unsigned long addr)
arch/arm/include/asm/module.h +1 -0
@@ -30,6 +30,7 @@ struct plt_entries {struct mod_plt_sec {struct elf32_shdr *plt; +struct plt_entries *plt_ent;int plt_count; };
arch/arm/kernel/ftrace.c +38 -8
92 lines not on this page · raw message
arch/arm/kernel/module-plts.c +40 -4
85 lines not on this page · raw message
Signature · 1 line
2.25.1
Re: [PATCH stable 5.10 3/3] ARM: 9079/1: ftrace: Add MODULE_PLTS support
Hello Florian,
Quoted 6 lines · Florian Fainelli
From: Alex Sverdlin <[email protected]>
commit
79f32b221b18c15a98507b101ef4beb52444cc6fupstreamTeach
ftrace_make_call()andftrace_make_nop()about PLTs. Teach PLT code about FTRACE and all its callbacks.
sorry for inconvenience, but I'd propose to add 6fa630bf473827ae "ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE" to all series on this topic, because of the below chunk which might lead to build issues on some exotic configurations.
Quoted 16 lines
arch/arm/kernel/module-plts.c +7
-0@@ -20,19 +21,52 @@ (PLT_ENT_STRIDE - 8))#endif +static const u32 fixed_plts[] = { +#ifdef CONFIG_FUNCTION_TRACER +FTRACE_ADDR , +MCOUNT_ADDR , +#endif +}; +static bool in_init (const struct module *mod,unsigned long loc) {return loc - (u32 )mod->init_layout.base < mod->init_layout.size;
Signature · 2 lines
Best regards, Alexander Sverdlin.
Re: [PATCH stable 5.10 3/3] ARM: 9079/1: ftrace: Add MODULE_PLTS support
Hi Alex,
Quoted 10 lines · Alexander Sverdlin
Hello Florian,
Quoted 6 lines · Florian Fainelli
From: Alex Sverdlin <[email protected]>
commit
79f32b221b18c15a98507b101ef4beb52444cc6fupstreamTeach
ftrace_make_call()andftrace_make_nop()about PLTs. Teach PLT code about FTRACE and all its callbacks.
Quoted 6 lines
sorry for inconvenience, but I'd propose to add
6fa630bf473827ae"ARM: 9098/1: ftrace:MODULE_PLT: Fix build problem withoutDYNAMIC_FTRACE" to all series on this topic, because of the below chunk which might lead to build issues on some exotic configurations.
Good point, missed that one, I will add it to the stable submission and resend, thanks!
Signature · 1 line
Florian