x86/stackframe, x86/kprobes: Fix frame pointer annotations
authorPeter Zijlstra <peterz@infradead.org>
Tue, 7 May 2019 21:25:46 +0000 (23:25 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 25 Jun 2019 08:23:46 +0000 (10:23 +0200)
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.

Change it to mark the pt_regs frame as per the ENCODE_FRAME_POINTER
from the respective entry_*.S.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/kprobes/common.h

index 2b949f4fd4d86d02ac20199872a625c7cab965e4..2e25f5f3fa1f469f43e7a10417d13f9e3e1da794 100644 (file)
@@ -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"               \
        "       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"                    \
        /* 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"                    \