From: Oleg Nesterov <oleg@redhat.com>
To: Ingo Molnar <mingo@elte.hu>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Anton Arapov <aarapov@redhat.com>,
David Long <dave.long@linaro.org>,
Denys Vlasenko <dvlasenk@redhat.com>,
"Frank Ch. Eigler" <fche@redhat.com>,
Jim Keniston <jkenisto@us.ibm.com>,
Jonathan Lebon <jlebon@redhat.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 4/9] uprobes/x86: Gather "riprel" functions together
Date: Fri, 4 Apr 2014 20:51:24 +0200 [thread overview]
Message-ID: <20140404185124.GA14726@redhat.com> (raw)
In-Reply-To: <20140404185038.GA14679@redhat.com>
Cosmetic. Move pre_xol_rip_insn() and handle_riprel_post_xol() up to
the closely related handle_riprel_insn(). This way it is simpler to
read and understand this code, and this lessens the number of ifdef's.
While at it, update the comment in handle_riprel_post_xol() as Jim
suggested.
TODO: rename them somehow to make the naming consistent.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Reviewed-by: Jim Keniston <jkenisto@us.ibm.com>
---
arch/x86/kernel/uprobes.c | 118 ++++++++++++++++++++-------------------------
1 files changed, 53 insertions(+), 65 deletions(-)
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index 963c121..c52c30f 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -313,6 +313,48 @@ handle_riprel_insn(struct arch_uprobe *auprobe, struct insn *insn)
}
}
+/*
+ * If we're emulating a rip-relative instruction, save the contents
+ * of the scratch register and store the target address in that register.
+ */
+static void
+pre_xol_rip_insn(struct arch_uprobe *auprobe, struct pt_regs *regs,
+ struct arch_uprobe_task *autask)
+{
+ if (auprobe->fixups & UPROBE_FIX_RIP_AX) {
+ autask->saved_scratch_register = regs->ax;
+ regs->ax = current->utask->vaddr;
+ regs->ax += auprobe->rip_rela_target_address;
+ } else if (auprobe->fixups & UPROBE_FIX_RIP_CX) {
+ autask->saved_scratch_register = regs->cx;
+ regs->cx = current->utask->vaddr;
+ regs->cx += auprobe->rip_rela_target_address;
+ }
+}
+
+static void
+handle_riprel_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs, long *correction)
+{
+ if (auprobe->fixups & (UPROBE_FIX_RIP_AX | UPROBE_FIX_RIP_CX)) {
+ struct arch_uprobe_task *autask;
+
+ autask = ¤t->utask->autask;
+ if (auprobe->fixups & UPROBE_FIX_RIP_AX)
+ regs->ax = autask->saved_scratch_register;
+ else
+ regs->cx = autask->saved_scratch_register;
+
+ /*
+ * The original instruction includes a displacement, and so
+ * is 4 bytes longer than what we've just single-stepped.
+ * Caller may need to apply other fixups to handle stuff
+ * like "jmpq *...(%rip)" and "callq *...(%rip)".
+ */
+ if (correction)
+ *correction += 4;
+ }
+}
+
static int validate_insn_64bits(struct arch_uprobe *auprobe, struct insn *insn)
{
insn_init(insn, auprobe->insn, true);
@@ -339,9 +381,19 @@ static int validate_insn_bits(struct arch_uprobe *auprobe, struct mm_struct *mm,
return validate_insn_64bits(auprobe, insn);
}
#else /* 32-bit: */
+/*
+ * No RIP-relative addressing on 32-bit
+ */
static void handle_riprel_insn(struct arch_uprobe *auprobe, struct insn *insn)
{
- /* No RIP-relative addressing on 32-bit */
+}
+static void pre_xol_rip_insn(struct arch_uprobe *auprobe, struct pt_regs *regs,
+ struct arch_uprobe_task *autask)
+{
+}
+static void handle_riprel_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs,
+ long *correction)
+{
}
static int validate_insn_bits(struct arch_uprobe *auprobe, struct mm_struct *mm, struct insn *insn)
@@ -415,34 +467,6 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
return 0;
}
-#ifdef CONFIG_X86_64
-/*
- * If we're emulating a rip-relative instruction, save the contents
- * of the scratch register and store the target address in that register.
- */
-static void
-pre_xol_rip_insn(struct arch_uprobe *auprobe, struct pt_regs *regs,
- struct arch_uprobe_task *autask)
-{
- if (auprobe->fixups & UPROBE_FIX_RIP_AX) {
- autask->saved_scratch_register = regs->ax;
- regs->ax = current->utask->vaddr;
- regs->ax += auprobe->rip_rela_target_address;
- } else if (auprobe->fixups & UPROBE_FIX_RIP_CX) {
- autask->saved_scratch_register = regs->cx;
- regs->cx = current->utask->vaddr;
- regs->cx += auprobe->rip_rela_target_address;
- }
-}
-#else
-static void
-pre_xol_rip_insn(struct arch_uprobe *auprobe, struct pt_regs *regs,
- struct arch_uprobe_task *autask)
-{
- /* No RIP-relative addressing on 32-bit */
-}
-#endif
-
/*
* arch_uprobe_pre_xol - prepare to execute out of line.
* @auprobe: the probepoint information.
@@ -492,42 +516,6 @@ static int adjust_ret_addr(unsigned long sp, long correction)
return 0;
}
-#ifdef CONFIG_X86_64
-static bool is_riprel_insn(struct arch_uprobe *auprobe)
-{
- return ((auprobe->fixups & (UPROBE_FIX_RIP_AX | UPROBE_FIX_RIP_CX)) != 0);
-}
-
-static void
-handle_riprel_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs, long *correction)
-{
- if (is_riprel_insn(auprobe)) {
- struct arch_uprobe_task *autask;
-
- autask = ¤t->utask->autask;
- if (auprobe->fixups & UPROBE_FIX_RIP_AX)
- regs->ax = autask->saved_scratch_register;
- else
- regs->cx = autask->saved_scratch_register;
-
- /*
- * The original instruction includes a displacement, and so
- * is 4 bytes longer than what we've just single-stepped.
- * Fall through to handle stuff like "jmpq *...(%rip)" and
- * "callq *...(%rip)".
- */
- if (correction)
- *correction += 4;
- }
-}
-#else
-static void
-handle_riprel_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs, long *correction)
-{
- /* No RIP-relative addressing on 32-bit */
-}
-#endif
-
/*
* If xol insn itself traps and generates a signal(Say,
* SIGILL/SIGSEGV/etc), then detect the case where a singlestepped
--
1.5.5.1
next prev parent reply other threads:[~2014-04-04 18:55 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-04 18:50 [PATCH v2 0/9] uprobes/x86: preparations to fix the reprel jmp/call handling Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 1/9] uprobes: Kill UPROBE_SKIP_SSTEP and can_skip_sstep() Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 2/9] uprobes/x86: Fold prepare_fixups() into arch_uprobe_analyze_insn() Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 3/9] uprobes/x86: Kill the "ia32_compat" check in handle_riprel_insn(), remove "mm" arg Oleg Nesterov
2014-04-04 18:51 ` Oleg Nesterov [this message]
2014-04-04 18:51 ` [PATCH v2 5/9] uprobes/x86: move the UPROBE_FIX_{RIP,IP,CALL} code at the end of pre/post hooks Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 6/9] uprobes/x86: Introduce uprobe_xol_ops and arch_uprobe->ops Oleg Nesterov
2014-04-08 9:10 ` Masami Hiramatsu
2014-04-08 16:10 ` Oleg Nesterov
2014-04-08 18:10 ` Oleg Nesterov
2014-04-09 12:58 ` Masami Hiramatsu
2014-04-09 16:55 ` Oleg Nesterov
2014-04-10 13:58 ` Masami Hiramatsu
2014-04-04 18:51 ` [PATCH v2 7/9] uprobes/x86: Conditionalize the usage of handle_riprel_insn() Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 8/9] uprobes/x86: Send SIGILL if arch_uprobe_post_xol() fails Oleg Nesterov
2014-04-04 18:51 ` [PATCH v2 9/9] uprobes/x86: Teach arch_uprobe_post_xol() to restart if possible Oleg Nesterov
2014-04-04 21:56 ` Jim Keniston
2014-04-05 12:46 ` Oleg Nesterov
2014-04-04 19:32 ` [PATCH v2 0/9] uprobes/x86: preparations to fix the reprel jmp/call handling Oleg Nesterov
2014-04-04 19:52 ` Oleg Nesterov
2014-04-04 23:44 ` Jim Keniston
2014-04-06 20:15 ` [RFC PATCH 0/6] uprobes/x86: " Oleg Nesterov
2014-04-06 20:16 ` [RFC PATCH 1/6] uprobes/x86: Emulate unconditional rip-relative jmp's Oleg Nesterov
2014-04-08 20:36 ` Jim Keniston
2014-04-09 14:47 ` Oleg Nesterov
2014-04-06 20:16 ` [RFC PATCH 2/6] uprobes/x86: Emulate nop's using ops->emulate() Oleg Nesterov
2014-04-06 20:16 ` [RFC PATCH 3/6] uprobes/x86: Introduce sizeof_long(), cleanup adjust_ret_addr() and arch_uretprobe_hijack_return_addr() Oleg Nesterov
2014-04-07 20:34 ` Jim Keniston
2014-04-07 20:42 ` Jim Keniston
2014-04-06 20:16 ` [RFC PATCH 4/6] uprobes/x86: Emulate rip-relative call's Oleg Nesterov
2014-04-08 22:26 ` Jim Keniston
2014-04-09 15:43 ` Oleg Nesterov
2014-04-09 21:25 ` Jim Keniston
2014-04-10 4:05 ` Jim Keniston
2014-04-10 13:41 ` Denys Vlasenko
2014-04-10 13:57 ` Masami Hiramatsu
2014-04-10 14:20 ` Denys Vlasenko
2014-04-11 3:03 ` Masami Hiramatsu
2014-04-11 12:23 ` Denys Vlasenko
2014-04-14 14:22 ` Masami Hiramatsu
2014-04-18 15:17 ` Denys Vlasenko
2014-04-10 14:28 ` Oleg Nesterov
2014-04-10 17:00 ` Oleg Nesterov
2014-04-11 2:38 ` Masami Hiramatsu
2014-04-11 1:29 ` Masami Hiramatsu
2014-04-10 14:18 ` Oleg Nesterov
2014-04-10 14:30 ` Denys Vlasenko
2014-04-10 17:02 ` Denys Vlasenko
2014-04-14 5:14 ` Masami Hiramatsu
2014-04-14 12:24 ` Denys Vlasenko
2014-04-14 14:05 ` Masami Hiramatsu
2014-04-06 20:16 ` [RFC PATCH 5/6] uprobes/x86: Emulate rip-relative conditional "short" jmp's Oleg Nesterov
2014-04-07 14:27 ` [RFC PATCH v2 " Oleg Nesterov
2014-04-07 16:41 ` Oleg Nesterov
2014-04-08 22:53 ` Jim Keniston
2014-04-09 16:42 ` Oleg Nesterov
2014-04-06 20:16 ` [RFC PATCH 6/6] uprobes/x86: Emulate rip-relative conditional "near" jmp's Oleg Nesterov
2014-04-07 14:28 ` Oleg Nesterov
2014-04-08 23:07 ` Jim Keniston
2014-04-09 16:50 ` Oleg Nesterov
2014-04-07 18:54 ` [RFC PATCH 0/6] uprobes/x86: fix the reprel jmp/call handling Jim Keniston
2014-04-08 11:43 ` Masami Hiramatsu
2014-04-08 16:28 ` Oleg Nesterov
2014-04-08 19:26 ` Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 " Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 1/6] uprobes/x86: Introduce sizeof_long(), cleanup adjust_ret_addr() and arch_uretprobe_hijack_return_addr() Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 2/6] uprobes/x86: Emulate unconditional rip-relative jmp's Oleg Nesterov
2014-04-10 12:37 ` Denys Vlasenko
2014-04-10 13:47 ` Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 3/6] uprobes/x86: Emulate nop's using ops->emulate() Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 4/6] uprobes/x86: Emulate rip-relative call's Oleg Nesterov
2014-04-10 12:53 ` Denys Vlasenko
2014-04-10 13:15 ` Masami Hiramatsu
2014-04-10 13:41 ` Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 5/6] uprobes/x86: Emulate rip-relative conditional "short" jmp's Oleg Nesterov
2014-04-09 19:44 ` [RFC PATCH v2 6/6] uprobes/x86: Emulate rip-relative conditional "near" jmp's Oleg Nesterov
2014-04-10 12:49 ` Denys Vlasenko
2014-04-09 21:34 ` [RFC PATCH v2 0/6] uprobes/x86: fix the reprel jmp/call handling Jim Keniston
2014-04-10 12:28 ` Denys Vlasenko
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=20140404185124.GA14726@redhat.com \
--to=oleg@redhat.com \
--cc=aarapov@redhat.com \
--cc=ananth@in.ibm.com \
--cc=dave.long@linaro.org \
--cc=dvlasenk@redhat.com \
--cc=fche@redhat.com \
--cc=jkenisto@us.ibm.com \
--cc=jlebon@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@elte.hu \
--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.