From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
linux-kernel@vger.kernel.org, x86@kernel.org,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
Roland McGrath <roland@redhat.com>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
stan_shebs@mentor.com
Subject: [PATCH v3] x86/uprobes: implement x86 specific arch_uprobe_*_step
Date: Mon, 20 Aug 2012 12:47:34 +0200 [thread overview]
Message-ID: <20120820104734.GA17034@linutronix.de> (raw)
In-Reply-To: <20120814142736.GA8123@redhat.com>
The arch specific implementation behaves like user_enable_single_step()
except that it does not disable single stepping if it was already
enabled. This allows the debugger to single step over an uprobe.
The state of block stepping is not restored. It makes only sense
together with TF and if that was enabled then the debugger is notified.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
v2..v3: don't introduce a bool var in prepare_fixups(), do it in within
case switch
v1..v2: re-use auprobe->fixups for fixups
arch/x86/include/asm/uprobes.h | 2 ++
arch/x86/kernel/uprobes.c | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/arch/x86/include/asm/uprobes.h b/arch/x86/include/asm/uprobes.h
index f3971bb..cee5862 100644
--- a/arch/x86/include/asm/uprobes.h
+++ b/arch/x86/include/asm/uprobes.h
@@ -46,6 +46,8 @@ struct arch_uprobe_task {
#ifdef CONFIG_X86_64
unsigned long saved_scratch_register;
#endif
+#define UPROBE_CLEAR_TF (1 << 0)
+ unsigned int restore_flags;
};
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 36fd420..54182bd 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -41,6 +41,9 @@
/* Adjust the return address of a call insn */
#define UPROBE_FIX_CALL 0x2
+/* Instruction will modify TF, don't change it */
+#define UPROBE_TF_CHANGES 0x4
+
#define UPROBE_FIX_RIP_AX 0x8000
#define UPROBE_FIX_RIP_CX 0x4000
@@ -239,6 +242,10 @@ static void prepare_fixups(struct arch_uprobe *auprobe, struct insn *insn)
insn_get_opcode(insn); /* should be a nop */
switch (OPCODE1(insn)) {
+ case 0x9d:
+ /* popf */
+ auprobe->fixups |= UPROBE_TF_CHANGES;
+ break;
case 0xc3: /* ret/lret */
case 0xcb:
case 0xc2:
@@ -673,3 +680,33 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
}
return false;
}
+
+void arch_uprobe_enable_step(struct arch_uprobe *auprobe)
+{
+ struct uprobe_task *utask = current->utask;
+ struct arch_uprobe_task *autask = &utask->autask;
+
+ autask->restore_flags = 0;
+ if (!test_tsk_thread_flag(current, TIF_SINGLESTEP) &&
+ !(auprobe->fixups & UPROBE_TF_CHANGES))
+ autask->restore_flags |= UPROBE_CLEAR_TF;
+ /*
+ * The state of TIF_BLOCKSTEP is not saved. With the TF flag set we
+ * would to examine the opcode and the flags to make it right. Without
+ * TF block stepping makes no sense. Instead we wakeup the debugger via
+ * SIGTRAP in case TF was set. This has the side effect that the
+ * debugger gets woken up even if the opcode normally wouldn't do so.
+ */
+ user_enable_single_step(current);
+}
+
+void arch_uprobe_disable_step(struct arch_uprobe *auprobe)
+{
+ struct uprobe_task *utask = current->utask;
+ struct arch_uprobe_task *autask = &utask->autask;
+
+ if (autask->restore_flags & UPROBE_CLEAR_TF)
+ user_disable_single_step(current);
+ else
+ send_sig(SIGTRAP, current, 0);
+}
--
1.7.10.4
next prev parent reply other threads:[~2012-08-20 10:47 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-07 16:12 uprobe: single step over uprobe & global breakpoints Sebastian Andrzej Siewior
2012-08-07 16:12 ` [PATCH 1/5] uprobes: Use a helper instead of ptrace's single step enable Sebastian Andrzej Siewior
2012-08-07 16:12 ` [PATCH 2/5] x86/uprobes: implement x86 specific arch_uprobe_*_step Sebastian Andrzej Siewior
2012-08-08 12:57 ` Oleg Nesterov
2012-08-08 13:17 ` Sebastian Andrzej Siewior
2012-08-08 14:53 ` Oleg Nesterov
2012-08-08 15:02 ` Sebastian Andrzej Siewior
2012-08-09 4:43 ` Ananth N Mavinakayanahalli
2012-08-09 17:09 ` [PATCH v2 " Sebastian Andrzej Siewior
2012-08-13 13:24 ` Oleg Nesterov
2012-08-14 8:28 ` Sebastian Andrzej Siewior
2012-08-14 14:27 ` Oleg Nesterov
2012-08-20 10:47 ` Sebastian Andrzej Siewior [this message]
2012-08-22 14:03 ` [PATCH v3] " Oleg Nesterov
2012-08-22 14:11 ` Sebastian Andrzej Siewior
2012-08-22 15:59 ` Oleg Nesterov
2012-08-29 17:37 ` Oleg Nesterov
2012-08-30 8:47 ` Ananth N Mavinakayanahalli
2012-08-30 11:18 ` [PATCH] x86/uprobes: don't disable single stepping if it was already on Sebastian Andrzej Siewior
2012-08-30 14:37 ` [PATCH v3] x86/uprobes: implement x86 specific arch_uprobe_*_step Oleg Nesterov
2012-08-30 15:03 ` Ananth N Mavinakayanahalli
2012-08-30 15:11 ` Oleg Nesterov
2012-08-07 16:12 ` [PATCH 3/5] uprobes: remove check for uprobe variable in handle_swbp() Sebastian Andrzej Siewior
2012-08-08 9:10 ` Suzuki K. Poulose
2012-08-08 9:35 ` Sebastian Andrzej Siewior
2012-08-10 5:23 ` Suzuki K. Poulose
2012-08-08 12:58 ` Oleg Nesterov
2012-08-07 16:12 ` [PATCH 4/5] uprobes: probe definiton can only start with 'p' and '-' Sebastian Andrzej Siewior
2012-08-07 16:12 ` [RFC 5/5] uprobes: add global breakpoints Sebastian Andrzej Siewior
2012-08-08 13:14 ` Oleg Nesterov
2012-08-09 17:18 ` Sebastian Andrzej Siewior
2012-08-13 13:16 ` Oleg Nesterov
2012-08-14 11:43 ` Sebastian Andrzej Siewior
2012-08-13 11:34 ` Peter Zijlstra
2012-08-20 15:26 ` Sebastian Andrzej Siewior
2012-08-21 19:42 ` [RFC 5/5 v2] " Sebastian Andrzej Siewior
2012-08-22 13:48 ` Oleg Nesterov
2012-08-27 18:56 ` Sebastian Andrzej Siewior
2012-08-29 15:49 ` Oleg Nesterov
2012-08-30 20:42 ` 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=20120820104734.GA17034@linutronix.de \
--to=bigeasy@linutronix.de \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=ananth@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=roland@redhat.com \
--cc=srikar@linux.vnet.ibm.com \
--cc=stan_shebs@mentor.com \
--cc=x86@kernel.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).