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: 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>
This commit is contained in:
committed by
Steven Rostedt (VMware)
parent
5b284b1933
commit
eb4a3f7d78
@@ -52,6 +52,11 @@
|
|||||||
UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
|
UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define UNWIND_HINT_FUNC \
|
||||||
|
UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0)
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _ASM_X86_UNWIND_HINTS_H */
|
#endif /* _ASM_X86_UNWIND_HINTS_H */
|
||||||
|
|||||||
@@ -1025,6 +1025,7 @@ asm(
|
|||||||
/* We don't bother saving the ss register */
|
/* We don't bother saving the ss register */
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
" pushq %rsp\n"
|
" pushq %rsp\n"
|
||||||
|
UNWIND_HINT_FUNC
|
||||||
" pushfq\n"
|
" pushfq\n"
|
||||||
SAVE_REGS_STRING
|
SAVE_REGS_STRING
|
||||||
" movq %rsp, %rdi\n"
|
" movq %rsp, %rdi\n"
|
||||||
@@ -1035,6 +1036,7 @@ asm(
|
|||||||
" popfq\n"
|
" popfq\n"
|
||||||
#else
|
#else
|
||||||
" pushl %esp\n"
|
" pushl %esp\n"
|
||||||
|
UNWIND_HINT_FUNC
|
||||||
" pushfl\n"
|
" pushfl\n"
|
||||||
SAVE_REGS_STRING
|
SAVE_REGS_STRING
|
||||||
" movl %esp, %eax\n"
|
" movl %esp, %eax\n"
|
||||||
@@ -1048,8 +1050,15 @@ asm(
|
|||||||
".size __kretprobe_trampoline, .-__kretprobe_trampoline\n"
|
".size __kretprobe_trampoline, .-__kretprobe_trampoline\n"
|
||||||
);
|
);
|
||||||
NOKPROBE_SYMBOL(__kretprobe_trampoline);
|
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
|
* Called from __kretprobe_trampoline
|
||||||
|
|||||||
Reference in New Issue
Block a user