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]>

Reply via email to