| From 7159ebba55a4c431f4846f20a92c0b3f3d222e0c Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Tue, 7 May 2019 23:25:46 +0200 |
| Subject: [PATCH] x86/stackframe, x86/kprobes: Fix frame pointer annotations |
| |
| commit 4201311dae59781fb19c40adddda45bf3c562b63 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/kernel/kprobes/common.h b/arch/x86/kernel/kprobes/common.h |
| index 2b949f4fd4d8..2e25f5f3fa1f 100644 |
| --- 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" \ |
| -- |
| 2.7.4 |
| |