From: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Anton Arapov <anton@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Roland McGrath <roland@hack.frob.com>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 6/7] uprobes: Xol should send SIGTRAP if X86_EFLAGS_TF was set
Date: Wed, 12 Sep 2012 17:38:57 +0530 [thread overview]
Message-ID: <20120912120857.GA9582@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120903152616.GA9081@redhat.com>
* Oleg Nesterov <oleg@redhat.com> [2012-09-03 17:26:16]:
> arch_uprobe_disable_step() correctly preserves X86_EFLAGS_TF and
> returns to user-mode. But this means the application gets SIGTRAP
> only after the next insn.
>
Agree.
> This means that UPROBE_CLEAR_TF logic is not really right. _enable
> should only record the state of X86_EFLAGS_TF, and _disable should
> check it separately from UPROBE_FIX_SETF.
>
> Remove arch_uprobe_task->restore_flags, add ->saved_tf instead, and
> change enable/disable accordingly.
>
> arch_uprobe_skip_sstep() logic has the same problem, change it to
> check X86_EFLAGS_TF and send SIGTRAP as well. We will cleanup this
> all after we fold enable/disable_step into pre/post_hol hooks.
>
> Note: send_sig(SIGTRAP) is not actually right, we need send_sigtrap().
Are you pointing to the info field not being filled? or are there other
problems?
> But this needs more changes, handle_swbp() does the same and this is
> equally wrong.
send_sigtrap() is arch specific and defined for only few archs.
we would have to force. But these are not related to the patch.
>
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
> ---
> arch/x86/include/asm/uprobes.h | 3 +--
> arch/x86/kernel/uprobes.c | 19 +++++++++++++------
> 2 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/arch/x86/include/asm/uprobes.h b/arch/x86/include/asm/uprobes.h
> index cee5862..d561ff5 100644
> --- a/arch/x86/include/asm/uprobes.h
> +++ b/arch/x86/include/asm/uprobes.h
> @@ -46,8 +46,7 @@ struct arch_uprobe_task {
> #ifdef CONFIG_X86_64
> unsigned long saved_scratch_register;
> #endif
> -#define UPROBE_CLEAR_TF (1 << 0)
> - unsigned int restore_flags;
> + unsigned int saved_tf;
> };
>
> extern int arch_uprobe_analyze_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long addr);
> diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
> index 3b4aae6..7e993d1 100644
> --- a/arch/x86/kernel/uprobes.c
> +++ b/arch/x86/kernel/uprobes.c
> @@ -653,7 +653,7 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
> * Skip these instructions as per the currently known x86 ISA.
> * 0x66* { 0x90 | 0x0f 0x1f | 0x0f 0x19 | 0x87 0xc0 }
> */
> -bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
> +static bool __skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
> {
> int i;
>
> @@ -681,16 +681,21 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
> return false;
> }
>
> +bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
> +{
> + bool ret = __skip_sstep(auprobe, regs);
Should we add a comment here saying ptrace or some debugger wants to
trace this instruction and we singlestepped and hence we want to inform
them now and otherwise they would only know one instruction later?
> + if (ret && (regs->flags & X86_EFLAGS_TF))
> + send_sig(SIGTRAP, current, 0);
> + return ret;
> +}
> +
> void arch_uprobe_enable_step(struct arch_uprobe *auprobe)
> {
> struct task_struct *task = current;
> struct arch_uprobe_task *autask = &task->utask->autask;
> struct pt_regs *regs = task_pt_regs(task);
>
> - autask->restore_flags = 0;
> - if (!(regs->flags & X86_EFLAGS_TF) &&
> - !(auprobe->fixups & UPROBE_FIX_SETF))
> - autask->restore_flags |= UPROBE_CLEAR_TF;
> + autask->saved_tf = !!(regs->flags & X86_EFLAGS_TF);
>
> regs->flags |= X86_EFLAGS_TF;
> if (test_tsk_thread_flag(task, TIF_BLOCKSTEP))
> @@ -707,6 +712,8 @@ void arch_uprobe_disable_step(struct arch_uprobe *auprobe)
> * SIGTRAP if we do not clear TF. We need to examine the opcode to
> * make it right.
> */
> - if (autask->restore_flags & UPROBE_CLEAR_TF)
> + if (autask->saved_tf)
> + send_sig(SIGTRAP, task, 0);
> + else if (!(auprobe->fixups & UPROBE_FIX_SETF))
> regs->flags &= ~X86_EFLAGS_TF;
> }
> --
> 1.5.5.1
>
next prev parent reply other threads:[~2012-09-12 12:13 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-03 15:25 [PATCH 0/7] uprobes: single-step fixes Oleg Nesterov
2012-09-03 15:25 ` [PATCH 1/7] uprobes: Introduce arch_uprobe_enable/disable_step() Oleg Nesterov
2012-09-07 14:57 ` Srikar Dronamraju
2012-09-03 15:26 ` [PATCH 2/7] uprobes: x86: Implement x86 specific arch_uprobe_*_step Oleg Nesterov
2012-09-07 14:59 ` Srikar Dronamraju
2012-09-03 15:26 ` [PATCH 3/7] ptrace: Introduce set_task_blockstep() helper Oleg Nesterov
2012-09-07 15:00 ` Srikar Dronamraju
2012-09-03 15:26 ` [PATCH 4/7] ptrace: Partly fix set_task_blockstep()->update_debugctlmsr() logic Oleg Nesterov
2012-09-07 15:14 ` Srikar Dronamraju
2012-09-10 16:57 ` Sebastian Andrzej Siewior
2012-09-10 17:45 ` Peter Zijlstra
2012-09-10 17:27 ` Oleg Nesterov
2012-09-03 15:26 ` [PATCH 5/7] uprobes: Do not (ab)use TIF_SINGLESTEP/user_*_single_step() for single-stepping Oleg Nesterov
2012-09-07 15:11 ` Srikar Dronamraju
2012-09-07 15:50 ` Oleg Nesterov
2012-09-08 7:49 ` Srikar Dronamraju
2012-09-03 15:26 ` [PATCH 6/7] uprobes: Xol should send SIGTRAP if X86_EFLAGS_TF was set Oleg Nesterov
2012-09-12 12:08 ` Srikar Dronamraju [this message]
2012-09-12 14:45 ` Oleg Nesterov
2012-09-03 15:26 ` [PATCH 7/7] uprobes: Make arch_uprobe_task->saved_trap_nr "unsigned int" Oleg Nesterov
2012-09-12 12:27 ` Srikar Dronamraju
2012-09-08 17:06 ` [PATCH 0/7] uprobes: single-step fixes Oleg Nesterov
2012-09-12 12:33 ` Srikar Dronamraju
2012-09-08 17:06 ` [PATCH 8/7] uprobes: Fix arch_uprobe_disable_step() && UTASK_SSTEP_TRAPPED interaction Oleg Nesterov
2012-09-12 12:36 ` Srikar Dronamraju
2012-09-10 16:57 ` [PATCH 0/7] uprobes: single-step fixes Sebastian Andrzej Siewior
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=20120912120857.GA9582@linux.vnet.ibm.com \
--to=srikar@linux.vnet.ibm.com \
--cc=ananth@in.ibm.com \
--cc=anton@redhat.com \
--cc=bigeasy@linutronix.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=roland@hack.frob.com \
--cc=torvalds@linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).