All of lore.kernel.org
 help / color / mirror / Atom feed
From: dave.long@linaro.org (David Long)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 13/16] ARM: Add an emulate flag to the kprobes/uprobes instruction decode functions
Date: Wed, 15 Jan 2014 14:31:10 -0500	[thread overview]
Message-ID: <52D6E1FE.8000303@linaro.org> (raw)
In-Reply-To: <1387551482.3404.63.camel@linaro1.home>

On 12/20/13 09:58, Jon Medhurst (Tixy) wrote:
> On Sun, 2013-12-15 at 23:08 -0500, David Long wrote:
>> From: "David A. Long" <dave.long@linaro.org>
>>
>> Add an emulate flag into the instruction interpreter, primarily for uprobes
>> support.
>>
>> Signed-off-by: David A. Long <dave.long@linaro.org>
>> ---
>>   arch/arm/kernel/kprobes.c      |  3 ++-
>>   arch/arm/kernel/kprobes.h      |  1 +
>>   arch/arm/kernel/probes-arm.c   |  4 ++--
>>   arch/arm/kernel/probes-arm.h   |  2 +-
>>   arch/arm/kernel/probes-thumb.c |  8 ++++----
>>   arch/arm/kernel/probes-thumb.h |  4 ++--
>>   arch/arm/kernel/probes.c       | 32 +++++++++++++++++++++++---------
>>   arch/arm/kernel/probes.h       |  2 +-
>>   8 files changed, 36 insertions(+), 20 deletions(-)
>>
>> diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c
>> index 0d9d49b..04690f9 100644
>> --- a/arch/arm/kernel/kprobes.c
>> +++ b/arch/arm/kernel/kprobes.c
>> @@ -87,7 +87,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
>>   	p->opcode = insn;
>>   	p->ainsn.insn = tmp_insn;
>>
>> -	switch ((*decode_insn)(insn, &p->ainsn, actions)) {
>> +	switch ((*decode_insn)(insn, &p->ainsn,
>> +			       true, actions)) {
>
> Any reason why the function args need splitting over two lines?

I undid the that change.

>>   	case INSN_REJECTED:	/* not supported */
>>   		return -EINVAL;
>>
>
> [...]
>
>> --- a/arch/arm/kernel/probes.c
>> +++ b/arch/arm/kernel/probes.c
>> @@ -193,7 +193,7 @@ void __kprobes probes_emulate_none(probes_opcode_t opcode,
>>    */
>>   static probes_opcode_t __kprobes
>>   prepare_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -								bool thumb)
>> +			bool thumb)
>
> Seems like a spurious indentation change.

Fixed.

>>   {
>>   #ifdef CONFIG_THUMB2_KERNEL
>>   	if (thumb) {
>> @@ -218,7 +218,7 @@ prepare_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>    */
>>   static void  __kprobes
>>   set_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -								bool thumb)
>> +			bool thumb)
>
> Another spurious whitespace change.

Fixed.

>>   {
>>   #ifdef CONFIG_THUMB2_KERNEL
>>   	if (thumb) {
>> @@ -253,7 +253,7 @@ set_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>    * non-zero value, the corresponding nibble in pinsn is validated and modified
>>    * according to the type.
>>    */
>> -static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs)
>> +static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs, bool modify)
>>   {
>>   	probes_opcode_t insn = *pinsn;
>>   	probes_opcode_t mask = 0xf; /* Start at least significant nibble */
>> @@ -317,9 +317,16 @@ static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs)
>>   		/* Replace value of nibble with new register number... */
>>   		insn &= ~mask;
>>   		insn |= new_bits & mask;
>> +		if (modify) {
>> +			/* Replace value of nibble with new register number */
>> +			insn &= ~mask;
>> +			insn |= new_bits & mask;
>> +		}
>
> Huh? As is, the above addition doesn't do anything because insn has
> already been modified. I guess you played with the idea that you needed
> to avoid changing insn (you don't) and then didn't undo the experiment
> quite right. :-)
>

The conditional modification of the instruction was part of Rabin's 
original work for uprobes, but I messed up the merge from an earlier 
working version of my patches.  My intention was/is to delete the old 
unconditional code.  Sounds like maybe you disagree though.  The intent 
is to only modify the instruction in the kprobes case.

>>   	}
>>
>> -	*pinsn = insn;
>> +	if (modify)
>> +		*pinsn = insn;
>> +
>>   	return true;
>>
>>   reject:
>> @@ -380,14 +387,15 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = {
>>    */
>>   int __kprobes
>>   probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -				const union decode_item *table, bool thumb,
>> -				const union decode_item *actions)
>> +		   const union decode_item *table, bool thumb,
>> +		   bool emulate, const union decode_item *actions)
>>   {
>>   	struct decode_header *h = (struct decode_header *)table;
>>   	struct decode_header *next;
>>   	bool matched = false;
>>
>> -	insn = prepare_emulated_insn(insn, asi, thumb);
>> +	if (emulate)
>> +		insn = prepare_emulated_insn(insn, asi, thumb);
>>
>>   	for (;; h = next) {
>>   		enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
>> @@ -402,7 +410,7 @@ probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>   		if (!matched && (insn & h->mask.bits) != h->value.bits)
>>   			continue;
>>
>> -		if (!decode_regs(&insn, regs))
>> +		if (!decode_regs(&insn, regs, emulate))
>>   			return INSN_REJECTED;
>>
>>   		switch (type) {
>> @@ -415,7 +423,8 @@ probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>
>>   		case DECODE_TYPE_CUSTOM: {
>>   			struct decode_custom *d = (struct decode_custom *)h;
>> -			return actions[d->decoder.bits].decoder(insn, asi, h);
>> +			return actions[d->decoder.bits].decoder(insn,
>> +					asi, h);
>
> No need to split the above line, you haven't changed it and it doesn't
> exceed 80 characters anyway.

Fixed.

> [Rest of patch cut]
>

-dl

WARNING: multiple messages have this Message-ID (diff)
From: David Long <dave.long@linaro.org>
To: "Jon Medhurst (Tixy)" <tixy@linaro.org>
Cc: linux-arm-kernel@lists.infradead.org,
	Russell King <linux@arm.linux.org.uk>,
	Rabin Vincent <rabin@rab.in>, 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
Subject: Re: [PATCH v4 13/16] ARM: Add an emulate flag to the kprobes/uprobes instruction decode functions
Date: Wed, 15 Jan 2014 14:31:10 -0500	[thread overview]
Message-ID: <52D6E1FE.8000303@linaro.org> (raw)
In-Reply-To: <1387551482.3404.63.camel@linaro1.home>

On 12/20/13 09:58, Jon Medhurst (Tixy) wrote:
> On Sun, 2013-12-15 at 23:08 -0500, David Long wrote:
>> From: "David A. Long" <dave.long@linaro.org>
>>
>> Add an emulate flag into the instruction interpreter, primarily for uprobes
>> support.
>>
>> Signed-off-by: David A. Long <dave.long@linaro.org>
>> ---
>>   arch/arm/kernel/kprobes.c      |  3 ++-
>>   arch/arm/kernel/kprobes.h      |  1 +
>>   arch/arm/kernel/probes-arm.c   |  4 ++--
>>   arch/arm/kernel/probes-arm.h   |  2 +-
>>   arch/arm/kernel/probes-thumb.c |  8 ++++----
>>   arch/arm/kernel/probes-thumb.h |  4 ++--
>>   arch/arm/kernel/probes.c       | 32 +++++++++++++++++++++++---------
>>   arch/arm/kernel/probes.h       |  2 +-
>>   8 files changed, 36 insertions(+), 20 deletions(-)
>>
>> diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c
>> index 0d9d49b..04690f9 100644
>> --- a/arch/arm/kernel/kprobes.c
>> +++ b/arch/arm/kernel/kprobes.c
>> @@ -87,7 +87,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
>>   	p->opcode = insn;
>>   	p->ainsn.insn = tmp_insn;
>>
>> -	switch ((*decode_insn)(insn, &p->ainsn, actions)) {
>> +	switch ((*decode_insn)(insn, &p->ainsn,
>> +			       true, actions)) {
>
> Any reason why the function args need splitting over two lines?

I undid the that change.

>>   	case INSN_REJECTED:	/* not supported */
>>   		return -EINVAL;
>>
>
> [...]
>
>> --- a/arch/arm/kernel/probes.c
>> +++ b/arch/arm/kernel/probes.c
>> @@ -193,7 +193,7 @@ void __kprobes probes_emulate_none(probes_opcode_t opcode,
>>    */
>>   static probes_opcode_t __kprobes
>>   prepare_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -								bool thumb)
>> +			bool thumb)
>
> Seems like a spurious indentation change.

Fixed.

>>   {
>>   #ifdef CONFIG_THUMB2_KERNEL
>>   	if (thumb) {
>> @@ -218,7 +218,7 @@ prepare_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>    */
>>   static void  __kprobes
>>   set_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -								bool thumb)
>> +			bool thumb)
>
> Another spurious whitespace change.

Fixed.

>>   {
>>   #ifdef CONFIG_THUMB2_KERNEL
>>   	if (thumb) {
>> @@ -253,7 +253,7 @@ set_emulated_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>    * non-zero value, the corresponding nibble in pinsn is validated and modified
>>    * according to the type.
>>    */
>> -static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs)
>> +static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs, bool modify)
>>   {
>>   	probes_opcode_t insn = *pinsn;
>>   	probes_opcode_t mask = 0xf; /* Start at least significant nibble */
>> @@ -317,9 +317,16 @@ static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs)
>>   		/* Replace value of nibble with new register number... */
>>   		insn &= ~mask;
>>   		insn |= new_bits & mask;
>> +		if (modify) {
>> +			/* Replace value of nibble with new register number */
>> +			insn &= ~mask;
>> +			insn |= new_bits & mask;
>> +		}
>
> Huh? As is, the above addition doesn't do anything because insn has
> already been modified. I guess you played with the idea that you needed
> to avoid changing insn (you don't) and then didn't undo the experiment
> quite right. :-)
>

The conditional modification of the instruction was part of Rabin's 
original work for uprobes, but I messed up the merge from an earlier 
working version of my patches.  My intention was/is to delete the old 
unconditional code.  Sounds like maybe you disagree though.  The intent 
is to only modify the instruction in the kprobes case.

>>   	}
>>
>> -	*pinsn = insn;
>> +	if (modify)
>> +		*pinsn = insn;
>> +
>>   	return true;
>>
>>   reject:
>> @@ -380,14 +387,15 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = {
>>    */
>>   int __kprobes
>>   probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>> -				const union decode_item *table, bool thumb,
>> -				const union decode_item *actions)
>> +		   const union decode_item *table, bool thumb,
>> +		   bool emulate, const union decode_item *actions)
>>   {
>>   	struct decode_header *h = (struct decode_header *)table;
>>   	struct decode_header *next;
>>   	bool matched = false;
>>
>> -	insn = prepare_emulated_insn(insn, asi, thumb);
>> +	if (emulate)
>> +		insn = prepare_emulated_insn(insn, asi, thumb);
>>
>>   	for (;; h = next) {
>>   		enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
>> @@ -402,7 +410,7 @@ probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>   		if (!matched && (insn & h->mask.bits) != h->value.bits)
>>   			continue;
>>
>> -		if (!decode_regs(&insn, regs))
>> +		if (!decode_regs(&insn, regs, emulate))
>>   			return INSN_REJECTED;
>>
>>   		switch (type) {
>> @@ -415,7 +423,8 @@ probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
>>
>>   		case DECODE_TYPE_CUSTOM: {
>>   			struct decode_custom *d = (struct decode_custom *)h;
>> -			return actions[d->decoder.bits].decoder(insn, asi, h);
>> +			return actions[d->decoder.bits].decoder(insn,
>> +					asi, h);
>
> No need to split the above line, you haven't changed it and it doesn't
> exceed 80 characters anyway.

Fixed.

> [Rest of patch cut]
>

-dl


  reply	other threads:[~2014-01-15 19:31 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-16  4:08 [PATCH v4 00/16] uprobes: Add uprobes support for ARM David Long
2013-12-16  4:08 ` David Long
2013-12-16  4:08 ` [PATCH v4 01/16] uprobes: allow ignoring of probe hits David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 02/16] ARM: move shared uprobe/kprobe definitions into new include file David Long
2013-12-16  4:08   ` David Long
2013-12-20 12:46   ` Jon Medhurst (Tixy)
2013-12-20 12:46     ` Jon Medhurst (Tixy)
2014-01-15 16:43     ` David Long
2014-01-15 16:43       ` David Long
2013-12-16  4:08 ` [PATCH v4 03/16] ARM: Move generic arm instruction parsing code to new files for sharing between features David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 04/16] ARM: move generic thumb instruction parsing code to new files for use by other feature David Long
2013-12-16  4:08   ` David Long
2013-12-20 12:46   ` Jon Medhurst (Tixy)
2013-12-20 12:46     ` Jon Medhurst (Tixy)
2014-01-15 16:41     ` David Long
2014-01-15 16:41       ` David Long
2013-12-16  4:08 ` [PATCH v4 05/16] ARM: use a function table for determining instruction interpreter actions David Long
2013-12-16  4:08   ` David Long
2013-12-20 12:45   ` Jon Medhurst (Tixy)
2013-12-20 12:45     ` Jon Medhurst (Tixy)
2014-01-15 16:25     ` David Long
2014-01-15 16:25       ` David Long
2013-12-16  4:08 ` [PATCH v4 06/16] ARM: Disable jprobes test when built into thumb-mode kernel David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 07/16] ARM: Remove use of struct kprobe from generic probes code David Long
2013-12-16  4:08   ` David Long
2013-12-20 13:55   ` Jon Medhurst (Tixy)
2013-12-20 13:55     ` Jon Medhurst (Tixy)
2014-01-15 16:44     ` David Long
2014-01-15 16:44       ` David Long
2013-12-16  4:08 ` [PATCH v4 08/16] ARM: Use new opcode type in ARM kprobes/uprobes code David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 09/16] ARM: Make the kprobes condition_check symbol names more generic David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 10/16] ARM: Change more ARM kprobes symbol names to something more David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 11/16] ARM: Rename the shared kprobes/uprobe return value enum David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 12/16] ARM: Change the remaining shared kprobes/uprobes symbols to something generic David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 13/16] ARM: Add an emulate flag to the kprobes/uprobes instruction decode functions David Long
2013-12-16  4:08   ` David Long
2013-12-20 14:58   ` Jon Medhurst (Tixy)
2013-12-20 14:58     ` Jon Medhurst (Tixy)
2014-01-15 19:31     ` David Long [this message]
2014-01-15 19:31       ` David Long
2014-01-16  9:18       ` Jon Medhurst (Tixy)
2014-01-16  9:18         ` Jon Medhurst (Tixy)
2014-01-16 18:12         ` David Long
2014-01-16 18:12           ` David Long
2013-12-16  4:08 ` [PATCH v4 14/16] ARM: Make arch_specific_insn a define for new arch_probes_insn structure David Long
2013-12-16  4:08   ` David Long
2013-12-16  4:08 ` [PATCH v4 15/16] ARM: add uprobes support David Long
2013-12-16  4:08   ` David Long
2013-12-20 18:34   ` Jon Medhurst (Tixy)
2013-12-20 18:34     ` Jon Medhurst (Tixy)
2013-12-20 19:00     ` Rabin Vincent
2013-12-20 19:00       ` Rabin Vincent
2013-12-20 19:47       ` Jon Medhurst (Tixy)
2013-12-20 19:47         ` Jon Medhurst (Tixy)
2013-12-23 15:32     ` Oleg Nesterov
2013-12-23 15:32       ` Oleg Nesterov
2014-01-21 16:51     ` David Long
2014-01-21 16:51       ` David Long
2013-12-16  4:08 ` [PATCH v4 16/16] ARM: Remove uprobes dependency on kprobes David Long
2013-12-16  4:08   ` David Long

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=52D6E1FE.8000303@linaro.org \
    --to=dave.long@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.