x86/kprobes: Add UNWIND_HINT_FUNC on kretprobe_trampoline()
authorJosh Poimboeuf <jpoimboe@redhat.com>
Tue, 14 Sep 2021 14:41:32 +0000 (23:41 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 1 Oct 2021 01:24:07 +0000 (21:24 -0400)
Add UNWIND_HINT_FUNC on __kretprobe_trampoline() code so that ORC
information is generated on the __kretprobe_trampoline() correctly.
Also, this uses STACK_FRAME_NON_STANDARD_FP(), CONFIG_FRAME_POINTER-
-specific version of STACK_FRAME_NON_STANDARD().

Link: https://lkml.kernel.org/r/163163049242.489837.11970969750993364293.stgit@devnote2
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
arch/x86/include/asm/unwind_hints.h
arch/x86/kernel/kprobes/core.c

index 8e574c0..8b33674 100644 (file)
        UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
 .endm
 
+#else
+
+#define UNWIND_HINT_FUNC \
+       UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0)
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_X86_UNWIND_HINTS_H */
index 79cd23d..d1436d7 100644 (file)
@@ -1025,6 +1025,7 @@ asm(
        /* We don't bother saving the ss register */
 #ifdef CONFIG_X86_64
        "       pushq %rsp\n"
+       UNWIND_HINT_FUNC
        "       pushfq\n"
        SAVE_REGS_STRING
        "       movq %rsp, %rdi\n"
@@ -1035,6 +1036,7 @@ asm(
        "       popfq\n"
 #else
        "       pushl %esp\n"
+       UNWIND_HINT_FUNC
        "       pushfl\n"
        SAVE_REGS_STRING
        "       movl %esp, %eax\n"
@@ -1048,8 +1050,15 @@ asm(
        ".size __kretprobe_trampoline, .-__kretprobe_trampoline\n"
 );
 NOKPROBE_SYMBOL(__kretprobe_trampoline);
-STACK_FRAME_NON_STANDARD(__kretprobe_trampoline);
-
+/*
+ * __kretprobe_trampoline() skips updating frame pointer. The frame pointer
+ * saved in trampoline_handler() points to the real caller function's
+ * frame pointer. Thus the __kretprobe_trampoline() doesn't have a
+ * standard stack frame with CONFIG_FRAME_POINTER=y.
+ * Let's mark it non-standard function. Anyway, FP unwinder can correctly
+ * unwind without the hint.
+ */
+STACK_FRAME_NON_STANDARD_FP(__kretprobe_trampoline);
 
 /*
  * Called from __kretprobe_trampoline