mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: LKML <linux-kernel@vger.kernel.org>,
	"Masami Hiramatsu" <mhiramat@redhat.com>,
	"Ananth N Mavinakayanahalli" <ananth@in.ibm.com>,
	"Avi Kivity" <avi@redhat.com>, "Andi Kleen" <ak@linux.intel.com>,
	"Christoph Hellwig" <hch@infradead.org>,
	"Frank Ch. Eigler" <fche@redhat.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "Ingo Molnar" <mingo@elte.hu>,
	"Jason Baron" <jbaron@redhat.com>,
	"Jim Keniston" <jkenisto@us.ibm.com>,
	"K.Prasad" <prasad@linux.vnet.ibm.com>,
	"Lai Jiangshan" <laijs@cn.fujitsu.com>,
	"Li Zefan" <lizf@cn.fujitsu.com>,
	"Przemysław Pawełczyk" <przemyslaw@pawelczyk.it>,
	"Roland McGrath" <roland@redhat.com>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	"Srikar Dronamraju" <srikar@linux.vnet.ibm.com>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	"Tom Zanussi" <tzanussi@gmail.com>,
	"Vegard Nossum" <vegard.nossum@gmail.com>,
	"Frederic Weisbecker" <fweisbec@gmail.com>
Subject: [PATCH 04/18] kprobes: Cleanup fix_riprel() using insn decoder on x86
Date: Thu, 27 Aug 2009 04:32:03 +0200	[thread overview]
Message-ID: <1251340337-5640-5-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1251340337-5640-1-git-send-email-fweisbec@gmail.com>

From: Masami Hiramatsu <mhiramat@redhat.com>

Cleanup fix_riprel() in arch/x86/kernel/kprobes.c by using the new x86
instruction decoder instead of using comparisons with raw ad hoc numeric
opcodes.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Przemysław Pawełczyk <przemyslaw@pawelczyk.it>
Cc: Roland McGrath <roland@redhat.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Vegard Nossum <vegard.nossum@gmail.com>
LKML-Reference: <20090813203436.31965.34374.stgit@localhost.localdomain>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 arch/x86/kernel/kprobes.c |  128 ++++++++-------------------------------------
 1 files changed, 23 insertions(+), 105 deletions(-)

diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
index aa15f3e..16ae961 100644
--- a/arch/x86/kernel/kprobes.c
+++ b/arch/x86/kernel/kprobes.c
@@ -108,50 +108,6 @@ static const u32 twobyte_is_boostable[256 / 32] = {
 	/*      -----------------------------------------------         */
 	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
 };
-static const u32 onebyte_has_modrm[256 / 32] = {
-	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
-	/*      -----------------------------------------------         */
-	W(0x00, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 00 */
-	W(0x10, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) , /* 10 */
-	W(0x20, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 20 */
-	W(0x30, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) , /* 30 */
-	W(0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 40 */
-	W(0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 50 */
-	W(0x60, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0) | /* 60 */
-	W(0x70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 70 */
-	W(0x80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */
-	W(0x90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 90 */
-	W(0xa0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* a0 */
-	W(0xb0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* b0 */
-	W(0xc0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0) | /* c0 */
-	W(0xd0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */
-	W(0xe0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* e0 */
-	W(0xf0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1)   /* f0 */
-	/*      -----------------------------------------------         */
-	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
-};
-static const u32 twobyte_has_modrm[256 / 32] = {
-	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
-	/*      -----------------------------------------------         */
-	W(0x00, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1) | /* 0f */
-	W(0x10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0) , /* 1f */
-	W(0x20, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1) | /* 2f */
-	W(0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 3f */
-	W(0x40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 4f */
-	W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 5f */
-	W(0x60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 6f */
-	W(0x70, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1) , /* 7f */
-	W(0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 8f */
-	W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 9f */
-	W(0xa0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1) | /* af */
-	W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1) , /* bf */
-	W(0xc0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0) | /* cf */
-	W(0xd0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* df */
-	W(0xe0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* ef */
-	W(0xf0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)   /* ff */
-	/*      -----------------------------------------------         */
-	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
-};
 #undef W
 
 struct kretprobe_blackpoint kretprobe_blacklist[] = {
@@ -348,68 +304,30 @@ static int __kprobes is_IF_modifier(kprobe_opcode_t *insn)
 static void __kprobes fix_riprel(struct kprobe *p)
 {
 #ifdef CONFIG_X86_64
-	u8 *insn = p->ainsn.insn;
-	s64 disp;
-	int need_modrm;
-
-	/* Skip legacy instruction prefixes.  */
-	while (1) {
-		switch (*insn) {
-		case 0x66:
-		case 0x67:
-		case 0x2e:
-		case 0x3e:
-		case 0x26:
-		case 0x64:
-		case 0x65:
-		case 0x36:
-		case 0xf0:
-		case 0xf3:
-		case 0xf2:
-			++insn;
-			continue;
-		}
-		break;
-	}
+	struct insn insn;
+	kernel_insn_init(&insn, p->ainsn.insn);
 
-	/* Skip REX instruction prefix.  */
-	if (is_REX_prefix(insn))
-		++insn;
-
-	if (*insn == 0x0f) {
-		/* Two-byte opcode.  */
-		++insn;
-		need_modrm = test_bit(*insn,
-				      (unsigned long *)twobyte_has_modrm);
-	} else
-		/* One-byte opcode.  */
-		need_modrm = test_bit(*insn,
-				      (unsigned long *)onebyte_has_modrm);
-
-	if (need_modrm) {
-		u8 modrm = *++insn;
-		if ((modrm & 0xc7) == 0x05) {
-			/* %rip+disp32 addressing mode */
-			/* Displacement follows ModRM byte.  */
-			++insn;
-			/*
-			 * The copied instruction uses the %rip-relative
-			 * addressing mode.  Adjust the displacement for the
-			 * difference between the original location of this
-			 * instruction and the location of the copy that will
-			 * actually be run.  The tricky bit here is making sure
-			 * that the sign extension happens correctly in this
-			 * calculation, since we need a signed 32-bit result to
-			 * be sign-extended to 64 bits when it's added to the
-			 * %rip value and yield the same 64-bit result that the
-			 * sign-extension of the original signed 32-bit
-			 * displacement would have given.
-			 */
-			disp = (u8 *) p->addr + *((s32 *) insn) -
-			       (u8 *) p->ainsn.insn;
-			BUG_ON((s64) (s32) disp != disp); /* Sanity check.  */
-			*(s32 *)insn = (s32) disp;
-		}
+	if (insn_rip_relative(&insn)) {
+		s64 newdisp;
+		u8 *disp;
+		insn_get_displacement(&insn);
+		/*
+		 * The copied instruction uses the %rip-relative addressing
+		 * mode.  Adjust the displacement for the difference between
+		 * the original location of this instruction and the location
+		 * of the copy that will actually be run.  The tricky bit here
+		 * is making sure that the sign extension happens correctly in
+		 * this calculation, since we need a signed 32-bit result to
+		 * be sign-extended to 64 bits when it's added to the %rip
+		 * value and yield the same 64-bit result that the sign-
+		 * extension of the original signed 32-bit displacement would
+		 * have given.
+		 */
+		newdisp = (u8 *) p->addr + (s64) insn.displacement.value -
+			  (u8 *) p->ainsn.insn;
+		BUG_ON((s64) (s32) newdisp != newdisp); /* Sanity check.  */
+		disp = (u8 *) p->ainsn.insn + insn_offset_displacement(&insn);
+		*(s32 *) disp = (s32) newdisp;
 	}
 #endif
 }
-- 
1.6.2.3


  parent reply	other threads:[~2009-08-27  2:32 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-27  2:31 [GIT PULL] tracing/kprobes: Add dynamic tracepoints + instruction decoder Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 01/18] x86: Instruction decoder API Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 02/18] x86: X86 instruction decoder build-time selftest Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 03/18] kprobes: Checks probe address is instruction boudary on x86 Frederic Weisbecker
2009-08-27  2:32 ` Frederic Weisbecker [this message]
2009-08-27  2:32 ` [PATCH 05/18] x86: Add pt_regs register and stack access APIs Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 06/18] tracing: Ftrace dynamic ftrace_event_call support Frederic Weisbecker
2009-08-27  2:47   ` Li Zefan
2009-08-27  2:56     ` Frederic Weisbecker
2009-08-27 15:07       ` Masami Hiramatsu
2009-08-27  2:32 ` [PATCH 07/18] tracing: Introduce TRACE_FIELD_ZERO() macro Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 08/18] tracing: Add kprobe-based event tracer Frederic Weisbecker
2009-08-27  7:31   ` Ingo Molnar
2009-08-27 13:48     ` Frederic Weisbecker
2009-08-27 15:38       ` Masami Hiramatsu
2009-08-27  2:32 ` [PATCH 09/18] tracing: Add kprobe-based event tracer documentation Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 10/18] tracing: Kprobe-tracer supports more than 6 arguments Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 11/18] tracing: Generate names for each kprobe event automatically Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 12/18] tracing: Kprobe tracer assigns new event ids for each event Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 13/18] tracing: Add kprobes event profiling interface Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 14/18] x86: Fix x86 instruction decoder selftest to check only .text Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 15/18] x86: Check awk features before generating inat-tables.c Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 16/18] tracing/kprobes: Fix format typo in trace_kprobes Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 17/18] tracing/kprobes: Change trace_arg to probe_arg Frederic Weisbecker
2009-08-27  2:32 ` [PATCH 18/18] tracing/kprobes: Dump the culprit kprobe in case of kprobe recursion Frederic Weisbecker
2009-08-27 15:30   ` Masami Hiramatsu
2009-08-27 15:34     ` Frederic Weisbecker
2009-08-27 15:52       ` Masami Hiramatsu
2009-08-27 16:30         ` Frederic Weisbecker
2009-08-27 16:45           ` Masami Hiramatsu
2009-08-27 16:45             ` Frederic Weisbecker
2009-08-27  3:34 ` [GIT PULL v2] tracing/kprobes: v1 + two fixes Frederic Weisbecker
2009-08-27 15:24   ` Ingo Molnar
2009-08-27 15:40     ` Frederic Weisbecker
2009-08-27 15:59     ` Frederic Weisbecker
2009-08-27 16:17       ` [PATCH] tracing: Undef TRACE_EVENT_FN between trace events headers inclusion Frederic Weisbecker
2009-08-27 16:36         ` [tip:tracing/core] " tip-bot for Frederic Weisbecker
2009-08-27 16:12     ` [GIT PULL v2] tracing/kprobes: v1 + two fixes Masami Hiramatsu
2009-08-27 16:35       ` Ingo Molnar
2009-08-27 16:52         ` Masami Hiramatsu
2009-08-29 11:02           ` Ingo Molnar
2009-08-28 22:13         ` [PATCH -tip tracing/kprobes 1/2] x86: Allow x86-32 instruction decoder selftest on x86-64 Masami Hiramatsu
2009-08-30  1:35           ` Frederic Weisbecker
2009-10-17  9:58           ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-28 22:13         ` [PATCH -tip tracing/kprobes 2/2] x86: Remove unused config macros from instruction decoder selftest Masami Hiramatsu
2009-10-17  9:58           ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 15:26   ` [GIT PULL v2] tracing/kprobes: v1 + two fixes Ingo Molnar
2009-09-16  5:30     ` Frederic Weisbecker
2009-08-27  3:34 ` [PATCH 19/18] tracing: Restore the const qualifier for field names and types definition Frederic Weisbecker
2009-08-27 15:07   ` Masami Hiramatsu
2009-08-27  3:34 ` [PATCH 20/18] tracing: Remove unneeded pointer casts Frederic Weisbecker
2009-08-27 15:08   ` Masami Hiramatsu
2009-08-27 15:00 ` [GIT PULL] tracing/kprobes: Add dynamic tracepoints + instruction decoder Masami Hiramatsu
2009-08-27 15:25   ` Frederic Weisbecker
2009-08-27 17:22     ` [PATCH -tip tracing/kprobes 1/6] kprobes/x86: Call BUG() when reentering probe into KPROBES_HIT_SS Masami Hiramatsu
2009-08-28  4:38       ` Ananth N Mavinakayanahalli
2009-08-30  1:25       ` Frederic Weisbecker
2009-10-17  9:56       ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 17:23     ` [PATCH -tip tracing/kprobes 2/6] kprobes/x86-64: Allow to reenter probe on post_handler Masami Hiramatsu
2009-08-28  4:39       ` Ananth N Mavinakayanahalli
2009-10-17  9:57       ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 17:23     ` [PATCH -tip tracing/kprobes 3/6] kprobes/x86: Fix to add __kprobes to in-kernel fault handing functions Masami Hiramatsu
2009-08-28  4:40       ` Ananth N Mavinakayanahalli
2009-08-30  0:50       ` Frederic Weisbecker
2009-08-30  2:43         ` Masami Hiramatsu
2009-08-30  0:53       ` Frederic Weisbecker
2009-08-30  2:49         ` Masami Hiramatsu
2009-08-30 16:09           ` Frederic Weisbecker
2009-08-31  4:00             ` Masami Hiramatsu
2009-09-01 20:09               ` Masami Hiramatsu
2009-09-02 12:58             ` Masami Hiramatsu
2009-09-03  5:46               ` Frederic Weisbecker
2009-09-04 19:06               ` Frederic Weisbecker
2009-09-04 22:29                 ` Masami Hiramatsu
2009-09-08 16:32                 ` [PATCH tracing/kprobes] x86: Add MMX support for instruction decoder Masami Hiramatsu
2009-09-10 22:57                   ` Frederic Weisbecker
2009-10-17  9:58                   ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-09-08 16:54           ` [RFC PATCH tracing/kprobes] kprobes: Call vmalloc_sync_all() for avoiding in-kernel paging on kprobes Masami Hiramatsu
     [not found]             ` <20090908165438.24437.40931.stgit@dhcp-100-2-132.bos.redhat .com>
2009-09-08 17:03               ` system hang - I suspect a sata problem - 2.6.30.5 debug kernel jeffunit
2009-10-17  9:57       ` [tip:perf/probes] kprobes/x86: Fix to add __kprobes to in-kernel fault handing functions tip-bot for Masami Hiramatsu
2009-08-27 17:23     ` [PATCH -tip tracing/kprobes 4/6] kprobes: Fix to add __kprobes to notify_die Masami Hiramatsu
2009-08-28  4:41       ` Ananth N Mavinakayanahalli
2009-10-17  9:57       ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 17:23     ` [PATCH -tip tracing/kprobes 5/6] kprobes/x86-64: Fix to move common_interrupt to .kprobes.text Masami Hiramatsu
2009-10-17  9:57       ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 17:23     ` [PATCH -tip tracing/kprobes 6/6] kprobes: Prohibit to probe native_get_debugreg Masami Hiramatsu
2009-08-28  4:41       ` Ananth N Mavinakayanahalli
2009-10-17  9:57       ` [tip:perf/probes] " tip-bot for Masami Hiramatsu
2009-08-27 17:32     ` [GIT PULL] tracing/kprobes: Add dynamic tracepoints + instruction decoder 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=1251340337-5640-5-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=ak@linux.intel.com \
    --cc=ananth@in.ibm.com \
    --cc=avi@redhat.com \
    --cc=fche@redhat.com \
    --cc=hch@infradead.org \
    --cc=hpa@zytor.com \
    --cc=jbaron@redhat.com \
    --cc=jkenisto@us.ibm.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=mhiramat@redhat.com \
    --cc=mingo@elte.hu \
    --cc=prasad@linux.vnet.ibm.com \
    --cc=przemyslaw@pawelczyk.it \
    --cc=roland@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=sam@ravnborg.org \
    --cc=srikar@linux.vnet.ibm.com \
    --cc=tzanussi@gmail.com \
    --cc=vegard.nossum@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®