From: Oleg Nesterov <oleg@redhat.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: linux-kernel@vger.kernel.org, ananth@in.ibm.com,
a.p.zijlstra@chello.nl, mingo@redhat.com,
srikar@linux.vnet.ibm.com, roland@hack.frob.com
Subject: Re: [PATCH 2/2] x86/uprobes: implement x86 specific arch_uprobe_*_step
Date: Wed, 1 Aug 2012 14:26:16 +0200 [thread overview]
Message-ID: <20120801122616.GA32705@redhat.com> (raw)
In-Reply-To: <50183273.9070304@linutronix.de>
On 07/31, Sebastian Andrzej Siewior wrote:
>
> On 07/31/2012 07:51 PM, Oleg Nesterov wrote:
>> However, honestly I do not like it. I think we should change this
>> step-by-step, that is why I suggested to use TIF_SINGLESTEP and
>> user_enable_single_step() like your initial patch did. With this
>> patch at least the debugger doesn't lose the control over the tracee
>> if it steps over the probed insn, and this is the main (and known ;)
>> problem to me.
>
> I thought you did not like the nesting with TIF_SIGNLESTEP and the
> _FORCE and suggested to handle the complete state within uprobe.
Yes, but I suggested to do this in a separate patch.
In particular, because even if we do not care about DEBUGCTLMSR_BTF
after _disable, _enable has to clear it. See below.
>> Every change needs the discussion. For example, _enable should
>> clear DEBUGCTLMSR_BTF, this is obvious. But it is not clear to
>> me if _disable should restore it. What if the probed insn was
>> "jmp"? We need the additional complications to handle this case
>> really correctly, and for what? OK, gdb can get the extra SIGTRAP
>> from the tracee, but this is fine. And uprobes can confuse gdb
>> in many ways.
>
> I don't know if it is worth to have correct behavior here or rather go
> for the easy way which is either always do the wakeup or delay until
> the next jump.
This is debatable, personally I think it is fine to lose DEBUGCTLMSR_BTF.
Otherwise we need much more complications, not sure if it worth a trouble.
And an extra SIGTRAP for gdb is certainly better than the lost SIGTRAP.
However, once again, at least we should clear DEBUGCTLMSR_BTF
before the step. And I strongly believe we should not copy-and-paste
this code from step.c. This means we need something like the patch
below, before we teach uprobes to play with _TF directly, imho.
And btw, this is offtopic, but the usage of update_debugctlmsr()
doesn't look right to me (I can be easily wrong though). I'll write
another email.
Oleg.
--- x/arch/x86/kernel/step.c
+++ x/arch/x86/kernel/step.c
@@ -157,6 +157,21 @@ static int enable_single_step(struct tas
return 1;
}
+void enable_block_step(struct task_struct *child, bool on)
+{
+ unsigned long debugctl = get_debugctlmsr();
+
+ if (on) {
+ set_tsk_thread_flag(child, TIF_BLOCKSTEP);
+ debugctl |= DEBUGCTLMSR_BTF;
+ } else {
+ clear_tsk_thread_flag(child, TIF_BLOCKSTEP);
+ debugctl &= ~DEBUGCTLMSR_BTF;
+ }
+
+ update_debugctlmsr(debugctl);
+}
+
/*
* Enable single or block step.
*/
@@ -169,19 +184,10 @@ static void enable_step(struct task_stru
* So no one should try to use debugger block stepping in a program
* that uses user-mode single stepping itself.
*/
- if (enable_single_step(child) && block) {
- unsigned long debugctl = get_debugctlmsr();
-
- debugctl |= DEBUGCTLMSR_BTF;
- update_debugctlmsr(debugctl);
- set_tsk_thread_flag(child, TIF_BLOCKSTEP);
- } else if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) {
- unsigned long debugctl = get_debugctlmsr();
-
- debugctl &= ~DEBUGCTLMSR_BTF;
- update_debugctlmsr(debugctl);
- clear_tsk_thread_flag(child, TIF_BLOCKSTEP);
- }
+ if (enable_single_step(child) && block)
+ enable_block_step(true);
+ else if (test_tsk_thread_flag(child, TIF_BLOCKSTEP))
+ enable_block_step(false);
}
void user_enable_single_step(struct task_struct *child)
@@ -199,13 +205,8 @@ void user_disable_single_step(struct tas
/*
* Make sure block stepping (BTF) is disabled.
*/
- if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) {
- unsigned long debugctl = get_debugctlmsr();
-
- debugctl &= ~DEBUGCTLMSR_BTF;
- update_debugctlmsr(debugctl);
- clear_tsk_thread_flag(child, TIF_BLOCKSTEP);
- }
+ if (test_tsk_thread_flag(child, TIF_BLOCKSTEP))
+ enable_block_step(false);
/* Always clear TIF_SINGLESTEP... */
clear_tsk_thread_flag(child, TIF_SINGLESTEP);
next prev parent reply other threads:[~2012-08-01 12:29 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-26 15:20 [PATCH] uprobes: don't enable/disable signle step if the user did it Sebastian Andrzej Siewior
2012-07-26 17:31 ` Oleg Nesterov
2012-07-27 17:39 ` Sebastian Andrzej Siewior
2012-07-27 18:04 ` Oleg Nesterov
2012-07-26 17:38 ` Sebastian Andrzej Siewior
2012-07-30 11:06 ` Ananth N Mavinakayanahalli
2012-07-30 14:16 ` Oleg Nesterov
2012-07-30 15:15 ` Sebastian Andrzej Siewior
2012-07-31 4:01 ` Ananth N Mavinakayanahalli
2012-07-31 5:22 ` Srikar Dronamraju
2012-07-31 17:38 ` Oleg Nesterov
2012-07-31 11:52 ` [PATCH 1/2] uprobes: Use a helper instead of ptrace's single step enable Sebastian Andrzej Siewior
2012-07-31 11:52 ` [PATCH 2/2] x86/uprobes: implement x86 specific arch_uprobe_*_step Sebastian Andrzej Siewior
2012-07-31 17:51 ` Oleg Nesterov
2012-07-31 19:30 ` Sebastian Andrzej Siewior
2012-08-01 12:26 ` Oleg Nesterov [this message]
2012-08-01 13:01 ` Q: user_enable_single_step() && update_debugctlmsr() Oleg Nesterov
2012-08-01 13:32 ` Sebastian Andrzej Siewior
2012-08-01 13:46 ` Oleg Nesterov
2012-08-01 13:54 ` Sebastian Andrzej Siewior
2012-08-01 14:01 ` Oleg Nesterov
2012-08-01 14:21 ` Sebastian Andrzej Siewior
2012-08-01 14:31 ` Oleg Nesterov
2012-08-01 14:47 ` Oleg Nesterov
2012-08-01 14:51 ` Sebastian Andrzej Siewior
2012-08-01 15:01 ` Oleg Nesterov
2012-08-01 15:12 ` Sebastian Andrzej Siewior
2012-08-01 15:14 ` Oleg Nesterov
2012-08-01 18:46 ` Sebastian Andrzej Siewior
2012-08-02 13:05 ` Oleg Nesterov
2012-08-02 13:20 ` Sebastian Andrzej Siewior
2012-08-02 13:24 ` Oleg Nesterov
2012-08-01 13:43 ` [PATCH 2/2] x86/uprobes: implement x86 specific arch_uprobe_*_step Oleg Nesterov
2012-08-02 4:58 ` Ananth N Mavinakayanahalli
2012-07-31 17:40 ` [PATCH 1/2] uprobes: Use a helper instead of ptrace's single step enable Oleg Nesterov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120801122616.GA32705@redhat.com \
--to=oleg@redhat.com \
--cc=a.p.zijlstra@chello.nl \
--cc=ananth@in.ibm.com \
--cc=bigeasy@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=roland@hack.frob.com \
--cc=srikar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.