On Wed, 05 Jun 2019 15:07:56 +0200 Peter Zijlstra <[email protected]> wrote:
> The kprobe trampolines have a FRAME_POINTER annotation that makes no > sense. It marks the frame in the middle of pt_regs, at the place of > saving BP. commit ee213fc72fd67 introduced this code, and this is for unwinder which uses frame pointer. I think current code stores the address of previous (original context's) frame pointer into %rbp. So with that, if unwinder tries to decode frame pointer, it can get the original %rbp value, instead of &pt_regs from current %rbp. > > Change it to mark the pt_regs frame as per the ENCODE_FRAME_POINTER > from the respective entry_*.S. > With this change, I think stack unwinder can not get the original %rbp value. Peter, could you check the above commit? Thank you, > Signed-off-by: Peter Zijlstra (Intel) <[email protected]> > --- > arch/x86/kernel/kprobes/common.h | 24 ++++++++++++------------ > 1 file changed, 12 insertions(+), 12 deletions(-) > > --- a/arch/x86/kernel/kprobes/common.h > +++ b/arch/x86/kernel/kprobes/common.h > @@ -5,15 +5,10 @@ > /* Kprobes and Optprobes common header */ > > #include <asm/asm.h> > - > -#ifdef CONFIG_FRAME_POINTER > -# define SAVE_RBP_STRING " push %" _ASM_BP "\n" \ > - " mov %" _ASM_SP ", %" _ASM_BP "\n" > -#else > -# define SAVE_RBP_STRING " push %" _ASM_BP "\n" > -#endif > +#include <asm/frame.h> > > #ifdef CONFIG_X86_64 > + > #define SAVE_REGS_STRING \ > /* Skip cs, ip, orig_ax. */ \ > " subq $24, %rsp\n" \ > @@ -27,11 +22,13 @@ > " pushq %r10\n" \ > " pushq %r11\n" \ > " pushq %rbx\n" \ > - SAVE_RBP_STRING \ > + " pushq %rbp\n" \ > " pushq %r12\n" \ > " pushq %r13\n" \ > " pushq %r14\n" \ > - " pushq %r15\n" > + " pushq %r15\n" \ > + ENCODE_FRAME_POINTER > + > #define RESTORE_REGS_STRING \ > " popq %r15\n" \ > " popq %r14\n" \ > @@ -51,19 +48,22 @@ > /* Skip orig_ax, ip, cs */ \ > " addq $24, %rsp\n" > #else > + > #define SAVE_REGS_STRING \ > /* Skip cs, ip, orig_ax and gs. */ \ > - " subl $16, %esp\n" \ > + " subl $4*4, %esp\n" \ > " pushl %fs\n" \ > " pushl %es\n" \ > " pushl %ds\n" \ > " pushl %eax\n" \ > - SAVE_RBP_STRING \ > + " pushl %ebp\n" \ > " pushl %edi\n" \ > " pushl %esi\n" \ > " pushl %edx\n" \ > " pushl %ecx\n" \ > - " pushl %ebx\n" > + " pushl %ebx\n" \ > + ENCODE_FRAME_POINTER > + > #define RESTORE_REGS_STRING \ > " popl %ebx\n" \ > " popl %ecx\n" \ > > -- Masami Hiramatsu <[email protected]>

