[PATCH 26/27] x86: debugctlmsr kprobes

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Roland McGrath
Date: Sunday, November 25, 2007 - 3:08 pm

This adjusts the x86 kprobes implementation to cope with per-thread
MSR_IA32_DEBUGCTLMSR being set for user mode.  I haven't delved deep
enough into the kprobes code to be really sure this covers all the
cases where the user-mode BTF setting needs to be cleared or restored.
It looks about right to me.

Signed-off-by: Roland McGrath <roland@redhat.com>
---
 arch/x86/kernel/kprobes_32.c |   15 +++++++++++++++
 arch/x86/kernel/kprobes_64.c |   15 +++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/kprobes_32.c b/arch/x86/kernel/kprobes_32.c
index d87a523..f151f06 100644
--- a/arch/x86/kernel/kprobes_32.c
+++ b/arch/x86/kernel/kprobes_32.c
@@ -217,8 +217,21 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
 		kcb->kprobe_saved_eflags &= ~IF_MASK;
 }
 
+static __always_inline void clear_btf(void)
+{
+	if (test_thread_flag(TIF_DEBUGCTLMSR))
+		wrmsr(MSR_IA32_DEBUGCTLMSR, 0, 0);
+}
+
+static __always_inline void restore_btf(void)
+{
+	if (test_thread_flag(TIF_DEBUGCTLMSR))
+		wrmsr(MSR_IA32_DEBUGCTLMSR, current->thread.debugctlmsr, 0);
+}
+
 static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
 {
+	clear_btf();
 	regs->eflags |= TF_MASK;
 	regs->eflags &= ~IF_MASK;
 	/*single step inline if the instruction is an int3*/
@@ -542,6 +555,8 @@ static void __kprobes resume_execution(struct kprobe *p,
 	regs->eip = orig_eip + (regs->eip - copy_eip);
 
 no_change:
+	restore_btf();
+
 	return;
 }
 
diff --git a/arch/x86/kernel/kprobes_64.c b/arch/x86/kernel/kprobes_64.c
index 3db3611..d3be418 100644
--- a/arch/x86/kernel/kprobes_64.c
+++ b/arch/x86/kernel/kprobes_64.c
@@ -256,8 +256,21 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
 		kcb->kprobe_saved_rflags &= ~IF_MASK;
 }
 
+static __always_inline void clear_btf(void)
+{
+	if (test_thread_flag(TIF_DEBUGCTLMSR))
+		wrmsrl(MSR_IA32_DEBUGCTLMSR, 0);
+}
+
+static __always_inline void restore_btf(void)
+{
+	if (test_thread_flag(TIF_DEBUGCTLMSR))
+		wrmsrl(MSR_IA32_DEBUGCTLMSR, current->thread.debugctlmsr);
+}
+
 static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
 {
+	clear_btf();
 	regs->eflags |= TF_MASK;
 	regs->eflags &= ~IF_MASK;
 	/*single step inline if the instruction is an int3*/
@@ -534,6 +547,8 @@ static void __kprobes resume_execution(struct kprobe *p,
 	} else {
 		regs->rip = orig_rip + (regs->rip - copy_rip);
 	}
+
+	restore_btf();
 }
 
 int __kprobes post_kprobe_handler(struct pt_regs *regs)
-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 01/27] ptrace: arch_has_single_step, Roland McGrath, (Sun Nov 25, 2:55 pm)
[PATCH 02/27] x86: segment selector macros, Roland McGrath, (Sun Nov 25, 2:58 pm)
[PATCH 03/27] x86: remove TRAP_FLAG, Roland McGrath, (Sun Nov 25, 2:58 pm)
[PATCH 04/27] x86: arch_has_single_step, Roland McGrath, (Sun Nov 25, 2:59 pm)
[PATCH 05/27] x86: single_step moved, Roland McGrath, (Sun Nov 25, 2:59 pm)
[PATCH 06/27] x86: single_step segment macros, Roland McGrath, (Sun Nov 25, 2:59 pm)
[PATCH 07/27] x86: single_step 0xf0, Roland McGrath, (Sun Nov 25, 3:00 pm)
[PATCH 08/27] x86: single_step: share code, Roland McGrath, (Sun Nov 25, 3:00 pm)
[PATCH 10/27] ptrace: generic resume, Roland McGrath, (Sun Nov 25, 3:01 pm)
[PATCH 11/27] x86-64: ptrace generic resume, Roland McGrath, (Sun Nov 25, 3:01 pm)
[PATCH 12/27] x86-32: ptrace generic resume, Roland McGrath, (Sun Nov 25, 3:01 pm)
[PATCH 13/27] powerpc: arch_has_single_step, Roland McGrath, (Sun Nov 25, 3:03 pm)
[PATCH 14/27] powerpc: ptrace generic resume, Roland McGrath, (Sun Nov 25, 3:04 pm)
[PATCH 15/27] x86-32 ptrace: use task_pt_regs, Roland McGrath, (Sun Nov 25, 3:04 pm)
[PATCH 16/27] x86-64 ptrace: use task_pt_regs, Roland McGrath, (Sun Nov 25, 3:04 pm)
[PATCH 17/27] x86-64 ptrace debugreg cleanup, Roland McGrath, (Sun Nov 25, 3:04 pm)
[PATCH 18/27] x86-64 ia32 ptrace debugreg cleanup, Roland McGrath, (Sun Nov 25, 3:05 pm)
[PATCH 19/27] x86-32 ptrace debugreg cleanup, Roland McGrath, (Sun Nov 25, 3:05 pm)
[PATCH 21/27] ptrace: generic PTRACE_SINGLEBLOCK, Roland McGrath, (Sun Nov 25, 3:06 pm)
[PATCH 22/27] x86: debugctlmsr constants, Roland McGrath, (Sun Nov 25, 3:06 pm)
[PATCH 23/27] x86: debugctlmsr kconfig, Roland McGrath, (Sun Nov 25, 3:08 pm)
[PATCH 24/27] x86: debugctlmsr context switch, Roland McGrath, (Sun Nov 25, 3:08 pm)
[PATCH 26/27] x86: debugctlmsr kprobes, Roland McGrath, (Sun Nov 25, 3:08 pm)
[PATCH 27/27] x86: PTRACE_SINGLEBLOCK, Roland McGrath, (Sun Nov 25, 3:08 pm)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Christoph Hellwig, (Sun Nov 25, 3:22 pm)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Roland McGrath, (Sun Nov 25, 3:59 pm)
Re: [PATCH 23/27] x86: debugctlmsr kconfig, Denys Vlasenko, (Sun Nov 25, 6:09 pm)
Re: [PATCH 23/27] x86: debugctlmsr kconfig, Roland McGrath, (Mon Nov 26, 12:51 am)
Re: [PATCH 23/27] x86: debugctlmsr kconfig, Roland McGrath, (Mon Nov 26, 1:06 am)
Re: [PATCH 23/27] x86: debugctlmsr kconfig, Denys Vlasenko, (Mon Nov 26, 3:52 pm)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Andrew Morton, (Tue Nov 27, 1:53 am)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Ingo Molnar, (Tue Nov 27, 3:38 am)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Roland McGrath, (Tue Nov 27, 4:05 pm)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Ingo Molnar, (Tue Nov 27, 4:58 pm)
Re: [PATCH 01/27] ptrace: arch_has_single_step, Roland McGrath, (Tue Nov 27, 5:08 pm)
Re: [PATCH 20/27] ptrace: arch_has_block_step, David Wilder, (Wed Nov 28, 4:39 pm)
Re: [PATCH 20/27] ptrace: arch_has_block_step, Roland McGrath, (Wed Nov 28, 4:58 pm)
Re: [PATCH 14/27] powerpc: ptrace generic resume, Srinivasa Ds, (Mon Dec 3, 1:12 am)