Commit eb4a3f7d authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Steven Rostedt (VMware)
Browse files

x86/kprobes: Add UNWIND_HINT_FUNC on kretprobe_trampoline()

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: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Tested-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 5b284b19
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -52,6 +52,11 @@
	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 */
+11 −2
Original line number Diff line number Diff line
@@ -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