From: Masami Hiramatsu (Google) <mhira...@kernel.org> Fix a compile error about get_kernel_nofault() which is defined in the linux/uaccess.h. Since asm/ftrace.h is widely used, including linux/uaccess.h in asm/ftrace.h caused another error. Thus this moves arch_ftrace_get_symaddr() into arch/x86/kernel/ftrace.c.
The original errors look like: In file included from ./arch/x86/include/asm/asm-prototypes.h:2, from <stdin>:3: ./arch/x86/include/asm/ftrace.h: In function 'arch_ftrace_get_symaddr': ./arch/x86/include/asm/ftrace.h:46:21: error: implicit declaration of function 'get_kernel_nofault' [-Werror=implicit-function-declaration] 46 | if (get_kernel_nofault(instr, (u32 *)(fentry_ip - ENDBR_INSN_SIZE))) | ^~~~~~~~~~~~~~~~~~ This also makes ftrace_get_symaddr() available only when CONFIG_HAVE_FENTRY=y on x86. Reported-by: Gabriel de Perthuis <g2p.c...@gmail.com> Closes: https://lore.kernel.org/all/a87f98bf-45b1-4ef5-aa77-02f7e6120...@gmail.com/ Reported-by: Haiyue Wang <haiyu...@163.com> Closes: https://lore.kernel.org/all/20250205180116.88644-1-haiyu...@163.com/ Fixes: 2bc56fdae1ba ("ftrace: Add ftrace_get_symaddr to convert fentry_ip to symaddr") Signed-off-by: Masami Hiramatsu (Google) <mhira...@kernel.org> --- arch/x86/include/asm/ftrace.h | 23 ++++------------------- arch/x86/kernel/ftrace.c | 26 +++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index f9cb4d07df58..1ed08f2de366 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h @@ -34,26 +34,11 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) return addr; } -static inline unsigned long arch_ftrace_get_symaddr(unsigned long fentry_ip) -{ -#ifdef CONFIG_X86_KERNEL_IBT - u32 instr; - - /* We want to be extra safe in case entry ip is on the page edge, - * but otherwise we need to avoid get_kernel_nofault()'s overhead. - */ - if ((fentry_ip & ~PAGE_MASK) < ENDBR_INSN_SIZE) { - if (get_kernel_nofault(instr, (u32 *)(fentry_ip - ENDBR_INSN_SIZE))) - return fentry_ip; - } else { - instr = *(u32 *)(fentry_ip - ENDBR_INSN_SIZE); - } - if (is_endbr(instr)) - fentry_ip -= ENDBR_INSN_SIZE; -#endif - return fentry_ip; -} +/* This does not support mcount. */ +#ifdef CONFIG_HAVE_FENTRY +unsigned long arch_ftrace_get_symaddr(unsigned long fentry_ip); #define ftrace_get_symaddr(fentry_ip) arch_ftrace_get_symaddr(fentry_ip) +#endif #ifdef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 166bc0ea3bdf..7250118005fc 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -29,11 +29,35 @@ #include <trace/syscall.h> -#include <asm/kprobes.h> #include <asm/ftrace.h> +#include <asm/ibt.h> +#include <asm/kprobes.h> #include <asm/nops.h> #include <asm/text-patching.h> +#ifdef CONFIG_HAVE_FENTRY +/* Convert fentry address to the symbol address. */ +unsigned long arch_ftrace_get_symaddr(unsigned long fentry_ip) +{ +#ifdef CONFIG_X86_KERNEL_IBT + u32 instr; + + /* We want to be extra safe in case entry ip is on the page edge, + * but otherwise we need to avoid get_kernel_nofault()'s overhead. + */ + if ((fentry_ip & ~PAGE_MASK) < ENDBR_INSN_SIZE) { + if (get_kernel_nofault(instr, (u32 *)(fentry_ip - ENDBR_INSN_SIZE))) + return fentry_ip; + } else { + instr = *(u32 *)(fentry_ip - ENDBR_INSN_SIZE); + } + if (is_endbr(instr)) + fentry_ip -= ENDBR_INSN_SIZE; +#endif + return fentry_ip; +} +#endif + #ifdef CONFIG_DYNAMIC_FTRACE static int ftrace_poke_late = 0;