From: Masami Hiramatsu <mhiramat@kernel.org>
To: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
"H . Peter Anvin" <hpa@zytor.com>,
Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>,
"David S . Miller" <davem@davemloft.net>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Ye Xiaolong <xiaolong.ye@intel.com>,
mhiramat@kernel.org
Subject: [RFC PATCH tip/master V2 3/8] kprobes/x86: Use instruction decoder for booster
Date: Mon, 27 Mar 2017 16:52:17 +0900 [thread overview]
Message-ID: <149060112763.12303.4615300671782298564.stgit@devbox> (raw)
In-Reply-To: <149060091581.12303.13449343279538504544.stgit@devbox>
Use x86 instruction decoder for checking whether the probed
instruction is able to boost or not, instead of hand-written
code.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
arch/x86/kernel/kprobes/core.c | 39 ++++++++++++++++-----------------------
1 file changed, 16 insertions(+), 23 deletions(-)
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 81d4dc7..6327f95 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -169,35 +169,33 @@ NOKPROBE_SYMBOL(skip_prefixes);
*/
int can_boost(kprobe_opcode_t *opcodes, void *addr)
{
+ struct insn insn;
kprobe_opcode_t opcode;
- kprobe_opcode_t *orig_opcodes = opcodes;
if (search_exception_tables((unsigned long)addr))
return 0; /* Page fault may occur on this address. */
-retry:
- if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)
- return 0;
- opcode = *(opcodes++);
+ kernel_insn_init(&insn, (void *)opcodes, MAX_INSN_SIZE);
+ insn_get_opcode(&insn);
/* 2nd-byte opcode */
- if (opcode == 0x0f) {
- if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)
- return 0;
- return test_bit(*opcodes,
+ if (insn.opcode.nbytes == 2)
+ return test_bit(insn.opcode.bytes[1],
(unsigned long *)twobyte_is_boostable);
- }
+
+ if (insn.opcode.nbytes != 1)
+ return 0;
+
+ /* Can't boost Address-size override prefix */
+ if (unlikely(inat_is_address_size_prefix(insn.attr)))
+ return 0;
+
+ opcode = insn.opcode.bytes[0];
switch (opcode & 0xf0) {
-#ifdef CONFIG_X86_64
- case 0x40:
- goto retry; /* REX prefix is boostable */
-#endif
case 0x60:
- if (0x63 < opcode && opcode < 0x67)
- goto retry; /* prefixes */
- /* can't boost Address-size override and bound */
- return (opcode != 0x62 && opcode != 0x67);
+ /* can't boost "bound" */
+ return (opcode != 0x62);
case 0x70:
return 0; /* can't boost conditional jump */
case 0x90:
@@ -212,14 +210,9 @@ int can_boost(kprobe_opcode_t *opcodes, void *addr)
/* can boost in/out and absolute jmps */
return ((opcode & 0x04) || opcode == 0xea);
case 0xf0:
- if ((opcode & 0x0c) == 0 && opcode != 0xf1)
- goto retry; /* lock/rep(ne) prefix */
/* clear and set flags are boostable */
return (opcode == 0xf5 || (0xf7 < opcode && opcode < 0xfe));
default:
- /* segment override prefixes are boostable */
- if (opcode == 0x26 || opcode == 0x36 || opcode == 0x3e)
- goto retry; /* prefixes */
/* CS override prefix and call are not boostable */
return (opcode != 0x2e && opcode != 0x9a);
}
next prev parent reply other threads:[~2017-03-27 7:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-27 7:48 [RFC PATCH tip/master V2 0/8] kprobes/x86: Make kprobes instruction buffers read-only Masami Hiramatsu
2017-03-27 7:49 ` [RFC PATCH tip/master V2 1/8] kprobes/x86: Fix not to boost call far instruction Masami Hiramatsu
2017-03-27 7:51 ` [RFC PATCH tip/master V2 2/8] kprobes/x86: Fix the description of __copy_instruction() Masami Hiramatsu
2017-03-27 7:52 ` Masami Hiramatsu [this message]
2017-03-27 7:53 ` [RFC PATCH tip/master V2 4/8] kprobes/x86: Do not modify singlestep buffer while resuming Masami Hiramatsu
2017-03-28 7:04 ` Ingo Molnar
2017-03-28 15:28 ` Masami Hiramatsu
2017-03-27 7:54 ` [RFC PATCH tip/master V2 5/8] kprobes/x86: Make boostable flag boolean Masami Hiramatsu
2017-03-27 7:56 ` [RFC PATCH tip/master V2 6/8] kprobes/x86: Set kprobes pages readonly Masami Hiramatsu
2017-03-27 7:57 ` [RFC PATCH tip/master V2 7/8] kprobes/x86: Use probe_kernel_read instead of memcpy Masami Hiramatsu
2017-03-27 7:58 ` [RFC PATCH tip/master V2 8/8] kprobes/x86: Consolidate insn decoder users for copying code Masami Hiramatsu
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=149060112763.12303.4615300671782298564.stgit@devbox \
--to=mhiramat@kernel.org \
--cc=ananth@linux.vnet.ibm.com \
--cc=anil.s.keshavamurthy@intel.com \
--cc=aryabinin@virtuozzo.com \
--cc=davem@davemloft.net \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=xiaolong.ye@intel.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.