From: Oleg Nesterov <oleg@redhat.com>
To: Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: 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: [PATCH 6/7] uprobes: Xol should send SIGTRAP if X86_EFLAGS_TF was set
Date: Mon, 3 Sep 2012 17:26:16 +0200 [thread overview]
Message-ID: <20120903152616.GA9081@redhat.com> (raw)
In-Reply-To: <20120903152525.GA9028@redhat.com>
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.
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().
But this needs more changes, handle_swbp() does the same and this is
equally wrong.
Signed-off-by: Oleg Nesterov <oleg@redhat.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);
+ 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-03 15:24 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 ` Oleg Nesterov [this message]
2012-09-12 12:08 ` [PATCH 6/7] uprobes: Xol should send SIGTRAP if X86_EFLAGS_TF was set Srikar Dronamraju
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=20120903152616.GA9081@redhat.com \
--to=oleg@redhat.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=peterz@infradead.org \
--cc=roland@hack.frob.com \
--cc=srikar@linux.vnet.ibm.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
Powered by JetHome