commit:     268f211d274fd5f502d17d16f0e50e12a4ded631
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed May 28 14:02:20 2025 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed May 28 14:02:20 2025 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=268f211d

ftrace: x86: Fix a compile error about get_kernel_nofault()

Bug: https://bugs.gentoo.org/956059
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README                                        |   4 +
 ...ce-x86-Fix-compile-err-get_kernel_nofault.patch | 119 +++++++++++++++++++++
 2 files changed, 123 insertions(+)

diff --git a/0000_README b/0000_README
index e3e2e7cb..459563fb 100644
--- a/0000_README
+++ b/0000_README
@@ -82,6 +82,10 @@ Patch:  1700_sparc-address-warray-bound-warnings.patch
 From:   https://github.com/KSPP/linux/issues/109
 Desc:   Address -Warray-bounds warnings 
 
+Patch:  1710_ftrace-x86-Fix-compile-err-get_kernel_nofault.patch
+From:   
https://lore.kernel.org/all/173881156244.211648.1242168038709680511.stgit@devnote2/
+Desc:   ftrace: x86: Fix a compile error about get_kernel_nofault()
+
 Patch:  1730_parisc-Disable-prctl.patch
 From:   https://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git
 Desc:   prctl: Temporarily disable prctl(PR_SET_MDWE) on parisc

diff --git a/1710_ftrace-x86-Fix-compile-err-get_kernel_nofault.patch 
b/1710_ftrace-x86-Fix-compile-err-get_kernel_nofault.patch
new file mode 100644
index 00000000..ad8cd545
--- /dev/null
+++ b/1710_ftrace-x86-Fix-compile-err-get_kernel_nofault.patch
@@ -0,0 +1,119 @@
+From git@z Thu Jan  1 00:00:00 1970
+Subject: [PATCH] ftrace: x86: Fix a compile error about
+ get_kernel_nofault()
+From: "Masami Hiramatsu (Google)" <[email protected]>
+Date: Thu, 06 Feb 2025 12:12:42 +0900
+Message-Id: <173881156244.211648.1242168038709680511.stgit@devnote2>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 7bit
+
+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 <[email protected]>
+Closes: 
https://lore.kernel.org/all/[email protected]/
+Reported-by: Haiyue Wang <[email protected]>
+Closes: https://lore.kernel.org/all/[email protected]/
+Fixes: 2bc56fdae1ba ("ftrace: Add ftrace_get_symaddr to convert fentry_ip to 
symaddr")
+Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
+Acked-by: Masami Hiramatsu (Google) <[email protected]>
+Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
+Acked-by: Alexei Starovoitov <[email protected]>
+Acked-by: Andrii Nakryiko <[email protected]>
+---
+ 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;
+

Reply via email to