From: taras.kondratiuk@linaro.org (Taras Kondratiuk)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 00/15] uprobes: Add uprobes support for ARM
Date: Wed, 04 Dec 2013 19:51:04 +0200 [thread overview]
Message-ID: <529F6B88.2050005@linaro.org> (raw)
In-Reply-To: <1385520814-10663-1-git-send-email-dave.long@linaro.org>
On 11/27/2013 04:53 AM, David Long wrote:
> From: "David A. Long" <dave.long@linaro.org>
>
> This patch series adds basic uprobes support to ARM. It is based on patches
> developed earlier by Rabin Vincent. That approach of adding hooks into
> the kprobes instruction parsing code was not well received. This approach
> separates the ARM instruction parsing code in kprobes out into a separate set
> of functions which can be used by both kprobes and uprobes. Both kprobes and
> uprobes then provide their own semantic action tables to process the results of
> the parsing.
>
> The following are noteworthy changes made for v3:
>
> 1) The ARM uprobes functionality no longer depends on kprobes. As
> a side effect of this there are no longer any changes to the common
> kprobes include file (or any other common kprobes files).
> 2) A couple large patches have been broken down into more smaller
> patches.
> 3) A problem with uretprobes has been fixed.
> 4) The kprobes-test module has been made more useable for thumb tests.
> 5) The argument list to the "action" functions has been shrunk.
> 6) Alignment with a few recent patches that were made to common
> uprobes code specifically to support this patchset.
>
> This patchset is based on v3.13-rc1
Hi Dave
I've tested this series in big-endian mode.
There is an issue within __create_xol_area() function.
It writes UPROBE_SWBP_INSN directly to memory, but UPROBE_SWBP_INSN
stores canonical opcode, which leads to a wrong instruction endianness
if CPU runs in BE.
I think the easies way to fix it without touching generic uprobes code
is to store opcode in native endianness in UPROBE_SWBP_INSN, and use
another macro for canonical form in ARM specific code.
Please check a diff below. With this diff plus addressed comment for
patch 14/15 plus fixed Ben's BE kprobes series I have uprobes working
on LE and BE.
diff --git a/arch/arm/include/asm/uprobes.h b/arch/arm/include/asm/uprobes.h
index e5acaa3..5313418 100644
--- a/arch/arm/include/asm/uprobes.h
+++ b/arch/arm/include/asm/uprobes.h
@@ -2,14 +2,16 @@
#define _ASM_UPROBES_H
#include <asm/probes.h>
+#include <asm/opcodes.h>
typedef u32 uprobe_opcode_t;
#define MAX_UINSN_BYTES 4
#define UPROBE_XOL_SLOT_BYTES 64
-#define UPROBE_SWBP_INSN 0xe7f001f9
-#define UPROBE_SS_INSN 0xe7f001fa
+#define UPROBE_SWBP_ARM_INSN 0xe7f001f9
+#define UPROBE_SS_ARM_INSN 0xe7f001fa
+#define UPROBE_SWBP_INSN __opcode_to_mem_arm(UPROBE_SWBP_ARM_INSN)
#define UPROBE_SWBP_INSN_SIZE 4
struct arch_uprobe_task {
diff --git a/arch/arm/kernel/uprobes.c b/arch/arm/kernel/uprobes.c
index d9873ef..ae18549 100644
--- a/arch/arm/kernel/uprobes.c
+++ b/arch/arm/kernel/uprobes.c
@@ -22,7 +22,7 @@
bool is_swbp_insn(uprobe_opcode_t *insn)
{
return (__mem_to_opcode_arm(*insn) & 0x0fffffff) ==
- (UPROBE_SWBP_INSN & 0x0fffffff);
+ (UPROBE_SWBP_ARM_INSN & 0x0fffffff);
}
int set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm,
@@ -83,7 +83,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
insn = __mem_to_opcode_arm(*(unsigned int *)auprobe->insn);
auprobe->ixol[0] = __opcode_to_mem_arm(insn);
- auprobe->ixol[1] = __opcode_to_mem_arm(UPROBE_SS_INSN);
+ auprobe->ixol[1] = __opcode_to_mem_arm(UPROBE_SS_ARM_INSN);
ret = arm_probes_decode_insn(insn, &auprobe->asi, false,
uprobes_probes_actions);
@@ -100,7 +100,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
break;
}
- bpinsn = UPROBE_SWBP_INSN & 0x0fffffff;
+ bpinsn = UPROBE_SWBP_ARM_INSN & 0x0fffffff;
if (insn >= 0xe0000000)
bpinsn |= 0xe0000000; /* Unconditional instruction */
else
@@ -158,9 +158,9 @@ static int uprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
local_irq_save(flags);
instr &= 0x0fffffff;
- if (instr == (UPROBE_SWBP_INSN & 0x0fffffff))
+ if (instr == (UPROBE_SWBP_ARM_INSN & 0x0fffffff))
uprobe_pre_sstep_notifier(regs);
- else if (instr == (UPROBE_SS_INSN & 0x0fffffff))
+ else if (instr == (UPROBE_SS_ARM_INSN & 0x0fffffff))
uprobe_post_sstep_notifier(regs);
local_irq_restore(flags);
@@ -174,7 +174,7 @@ unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
static struct undef_hook uprobes_arm_break_hook = {
.instr_mask = 0x0fffffff,
- .instr_val = (UPROBE_SWBP_INSN & 0x0fffffff),
+ .instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff),
.cpsr_mask = MODE_MASK,
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
@@ -182,7 +182,7 @@ static struct undef_hook uprobes_arm_break_hook = {
static struct undef_hook uprobes_arm_ss_hook = {
.instr_mask = 0x0fffffff,
- .instr_val = (UPROBE_SS_INSN & 0x0fffffff),
+ .instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff),
.cpsr_mask = MODE_MASK,
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
--
Taras Kondratiuk
WARNING: multiple messages have this Message-ID (diff)
From: Taras Kondratiuk <taras.kondratiuk@linaro.org>
To: David Long <dave.long@linaro.org>,
linux-arm-kernel@lists.infradead.org,
Russell King <linux@arm.linux.org.uk>
Cc: Rabin Vincent <rabin@rab.in>,
"Jon Medhurst (Tixy)" <tixy@linaro.org>,
Oleg Nesterov <oleg@redhat.com>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>,
davem@davemloft.net, Peter Zijlstra <a.p.zijlstra@chello.nl>,
Paul Mackerras <paulus@samba.org>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
linux-kernel@vger.kernel.org,
Linaro Networking <linaro-networking@linaro.org>
Subject: Re: [PATCH v3 00/15] uprobes: Add uprobes support for ARM
Date: Wed, 04 Dec 2013 19:51:04 +0200 [thread overview]
Message-ID: <529F6B88.2050005@linaro.org> (raw)
In-Reply-To: <1385520814-10663-1-git-send-email-dave.long@linaro.org>
On 11/27/2013 04:53 AM, David Long wrote:
> From: "David A. Long" <dave.long@linaro.org>
>
> This patch series adds basic uprobes support to ARM. It is based on patches
> developed earlier by Rabin Vincent. That approach of adding hooks into
> the kprobes instruction parsing code was not well received. This approach
> separates the ARM instruction parsing code in kprobes out into a separate set
> of functions which can be used by both kprobes and uprobes. Both kprobes and
> uprobes then provide their own semantic action tables to process the results of
> the parsing.
>
> The following are noteworthy changes made for v3:
>
> 1) The ARM uprobes functionality no longer depends on kprobes. As
> a side effect of this there are no longer any changes to the common
> kprobes include file (or any other common kprobes files).
> 2) A couple large patches have been broken down into more smaller
> patches.
> 3) A problem with uretprobes has been fixed.
> 4) The kprobes-test module has been made more useable for thumb tests.
> 5) The argument list to the "action" functions has been shrunk.
> 6) Alignment with a few recent patches that were made to common
> uprobes code specifically to support this patchset.
>
> This patchset is based on v3.13-rc1
Hi Dave
I've tested this series in big-endian mode.
There is an issue within __create_xol_area() function.
It writes UPROBE_SWBP_INSN directly to memory, but UPROBE_SWBP_INSN
stores canonical opcode, which leads to a wrong instruction endianness
if CPU runs in BE.
I think the easies way to fix it without touching generic uprobes code
is to store opcode in native endianness in UPROBE_SWBP_INSN, and use
another macro for canonical form in ARM specific code.
Please check a diff below. With this diff plus addressed comment for
patch 14/15 plus fixed Ben's BE kprobes series I have uprobes working
on LE and BE.
diff --git a/arch/arm/include/asm/uprobes.h b/arch/arm/include/asm/uprobes.h
index e5acaa3..5313418 100644
--- a/arch/arm/include/asm/uprobes.h
+++ b/arch/arm/include/asm/uprobes.h
@@ -2,14 +2,16 @@
#define _ASM_UPROBES_H
#include <asm/probes.h>
+#include <asm/opcodes.h>
typedef u32 uprobe_opcode_t;
#define MAX_UINSN_BYTES 4
#define UPROBE_XOL_SLOT_BYTES 64
-#define UPROBE_SWBP_INSN 0xe7f001f9
-#define UPROBE_SS_INSN 0xe7f001fa
+#define UPROBE_SWBP_ARM_INSN 0xe7f001f9
+#define UPROBE_SS_ARM_INSN 0xe7f001fa
+#define UPROBE_SWBP_INSN __opcode_to_mem_arm(UPROBE_SWBP_ARM_INSN)
#define UPROBE_SWBP_INSN_SIZE 4
struct arch_uprobe_task {
diff --git a/arch/arm/kernel/uprobes.c b/arch/arm/kernel/uprobes.c
index d9873ef..ae18549 100644
--- a/arch/arm/kernel/uprobes.c
+++ b/arch/arm/kernel/uprobes.c
@@ -22,7 +22,7 @@
bool is_swbp_insn(uprobe_opcode_t *insn)
{
return (__mem_to_opcode_arm(*insn) & 0x0fffffff) ==
- (UPROBE_SWBP_INSN & 0x0fffffff);
+ (UPROBE_SWBP_ARM_INSN & 0x0fffffff);
}
int set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm,
@@ -83,7 +83,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
insn = __mem_to_opcode_arm(*(unsigned int *)auprobe->insn);
auprobe->ixol[0] = __opcode_to_mem_arm(insn);
- auprobe->ixol[1] = __opcode_to_mem_arm(UPROBE_SS_INSN);
+ auprobe->ixol[1] = __opcode_to_mem_arm(UPROBE_SS_ARM_INSN);
ret = arm_probes_decode_insn(insn, &auprobe->asi, false,
uprobes_probes_actions);
@@ -100,7 +100,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
break;
}
- bpinsn = UPROBE_SWBP_INSN & 0x0fffffff;
+ bpinsn = UPROBE_SWBP_ARM_INSN & 0x0fffffff;
if (insn >= 0xe0000000)
bpinsn |= 0xe0000000; /* Unconditional instruction */
else
@@ -158,9 +158,9 @@ static int uprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
local_irq_save(flags);
instr &= 0x0fffffff;
- if (instr == (UPROBE_SWBP_INSN & 0x0fffffff))
+ if (instr == (UPROBE_SWBP_ARM_INSN & 0x0fffffff))
uprobe_pre_sstep_notifier(regs);
- else if (instr == (UPROBE_SS_INSN & 0x0fffffff))
+ else if (instr == (UPROBE_SS_ARM_INSN & 0x0fffffff))
uprobe_post_sstep_notifier(regs);
local_irq_restore(flags);
@@ -174,7 +174,7 @@ unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
static struct undef_hook uprobes_arm_break_hook = {
.instr_mask = 0x0fffffff,
- .instr_val = (UPROBE_SWBP_INSN & 0x0fffffff),
+ .instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff),
.cpsr_mask = MODE_MASK,
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
@@ -182,7 +182,7 @@ static struct undef_hook uprobes_arm_break_hook = {
static struct undef_hook uprobes_arm_ss_hook = {
.instr_mask = 0x0fffffff,
- .instr_val = (UPROBE_SS_INSN & 0x0fffffff),
+ .instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff),
.cpsr_mask = MODE_MASK,
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
--
Taras Kondratiuk
next prev parent reply other threads:[~2013-12-04 17:51 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-27 2:53 [PATCH v3 00/15] uprobes: Add uprobes support for ARM David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 01/15] uprobes: allow ignoring of probe hits David Long
2013-11-27 2:53 ` David Long
2013-11-28 18:41 ` Oleg Nesterov
2013-11-28 18:41 ` Oleg Nesterov
2013-11-27 2:53 ` [PATCH v3 02/15] ARM: move shared uprobe/kprobe definitions into new include file David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 03/15] ARM: Move generic arm instruction parsing code to new files for sharing between features David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 04/15] ARM: move generic thumb instruction parsing code to new files for use by other feature David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 05/15] ARM: use a function table for determining instruction interpreter actions David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 06/15] ARM: Disable jprobes test when built into thumb-mode kernel David Long
2013-11-27 2:53 ` David Long
2013-11-27 10:16 ` Masami Hiramatsu
2013-11-27 10:16 ` Masami Hiramatsu
2013-11-27 10:41 ` Jon Medhurst (Tixy)
2013-11-27 2:53 ` [PATCH v3 07/15] ARM: Remove use of struct kprobe from generic probes code David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 08/15] ARM: Use new opcode type in ARM kprobes/uprobes code David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 09/15] ARM: Make the kprobes condition_check symbol names more generic David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 10/15] ARM: Change more ARM kprobes symbol names to something more David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 11/15] ARM: Rename the shared kprobes/uprobe return value enum David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 12/15] ARM: Change the remaining shared kprobes/uprobes symbols to something generic David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 13/15] ARM: Add an emulate flag to the kprobes/uprobes instruction decode functions David Long
2013-11-27 2:53 ` David Long
2013-11-27 2:53 ` [PATCH v3 14/15] ARM: add uprobes support David Long
2013-11-27 2:53 ` David Long
2013-12-04 17:23 ` Taras Kondratiuk
2013-12-04 17:23 ` Taras Kondratiuk
2013-11-27 2:53 ` [PATCH v3 15/15] ARM: Remove uprobes dependency on kprobes David Long
2013-11-27 2:53 ` David Long
2013-12-04 17:51 ` Taras Kondratiuk [this message]
2013-12-04 17:51 ` [PATCH v3 00/15] uprobes: Add uprobes support for ARM Taras Kondratiuk
2013-12-05 19:48 ` David Long
2013-12-05 19:48 ` David Long
2013-12-05 20:17 ` David Long
2013-12-05 20:17 ` David Long
2013-12-20 16:10 ` Jon Medhurst (Tixy)
2013-12-20 16:10 ` Jon Medhurst (Tixy)
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=529F6B88.2050005@linaro.org \
--to=taras.kondratiuk@linaro.org \
--cc=linux-arm-kernel@lists.infradead.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 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.