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 v8 2/7] arm64: Add more test functions to insn.c
Date: Thu, 13 Aug 2015 00:23:03 -0400	[thread overview]
Message-ID: <55CC1BA7.7040200@linaro.org> (raw)
In-Reply-To: <20150811180012.GE29880@arm.com>

On 08/11/15 14:00, Will Deacon wrote:
> On Tue, Aug 11, 2015 at 01:52:39AM +0100, David Long wrote:
>> From: "David A. Long" <dave.long@linaro.org>
>>
>> Certain instructions are hard to execute correctly out-of-line (as in
>> kprobes).  Test functions are added to insn.[hc] to identify these.  The
>> instructions include any that use PC-relative addressing, change the PC,
>> or change interrupt masking. For efficiency and simplicity test
>> functions are also added for small collections of related instructions.
>>
>> Signed-off-by: David A. Long <dave.long@linaro.org>
>> ---
>>   arch/arm64/include/asm/insn.h | 18 ++++++++++++++++++
>>   arch/arm64/kernel/insn.c      | 28 ++++++++++++++++++++++++++++
>>   2 files changed, 46 insertions(+)
>>
>> diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h
>> index 30e50eb..66bfb21 100644
>> --- a/arch/arm64/include/asm/insn.h
>> +++ b/arch/arm64/include/asm/insn.h
>> @@ -223,8 +223,13 @@ static __always_inline bool aarch64_insn_is_##abbr(u32 code) \
>>   static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \
>>   { return (val); }
>>
>> +__AARCH64_INSN_FUNCS(adr_adrp,	0x1F000000, 0x10000000)
>> +__AARCH64_INSN_FUNCS(prfm_lit,	0xFF000000, 0xD8000000)
>>   __AARCH64_INSN_FUNCS(str_reg,	0x3FE0EC00, 0x38206800)
>>   __AARCH64_INSN_FUNCS(ldr_reg,	0x3FE0EC00, 0x38606800)
>> +__AARCH64_INSN_FUNCS(ldr_lit,	0xBF000000, 0x18000000)
>> +__AARCH64_INSN_FUNCS(ldrsw_lit,	0xFF000000, 0x98000000)
>> +__AARCH64_INSN_FUNCS(exclusive,	0x3F000000, 0x08000000)
>
> Hmm, so this class also pulls in load-acquire and store-release, which
> we *should* be able to single-step, no? Maybe it's worth splitting this
> category up (or at least changing aarch64_insn_is_exclusive to be more
> permissive).

I was not confident that this was the case. After reading the relevant 
parts of the v8 ARM yet again I think I see your point.

>
>>   __AARCH64_INSN_FUNCS(stp_post,	0x7FC00000, 0x28800000)
>>   __AARCH64_INSN_FUNCS(ldp_post,	0x7FC00000, 0x28C00000)
>>   __AARCH64_INSN_FUNCS(stp_pre,	0x7FC00000, 0x29800000)
>> @@ -264,19 +269,29 @@ __AARCH64_INSN_FUNCS(ands,	0x7F200000, 0x6A000000)
>>   __AARCH64_INSN_FUNCS(bics,	0x7F200000, 0x6A200000)
>>   __AARCH64_INSN_FUNCS(b,		0xFC000000, 0x14000000)
>>   __AARCH64_INSN_FUNCS(bl,	0xFC000000, 0x94000000)
>> +__AARCH64_INSN_FUNCS(b_bl,	0x7C000000, 0x14000000)
>
> Why do we need this when we already have checks for b and bl?

I was trying to avoid doing multiple checks for different variants of 
similar instructions.

>
>> +__AARCH64_INSN_FUNCS(cb,	0x7E000000, 0x34000000)
>
> Likewise for cbz and cbnz...
>
>>   __AARCH64_INSN_FUNCS(cbz,	0x7F000000, 0x34000000)
>>   __AARCH64_INSN_FUNCS(cbnz,	0x7F000000, 0x35000000)
>> +__AARCH64_INSN_FUNCS(tb,	0x7E000000, 0x36000000)
>
> ... there's a pattern here!
>

^^

>>   __AARCH64_INSN_FUNCS(tbz,	0x7F000000, 0x36000000)
>>   __AARCH64_INSN_FUNCS(tbnz,	0x7F000000, 0x37000000)
>> +__AARCH64_INSN_FUNCS(b_bl_cb_tb, 0x5C000000, 0x14000000)
>
> I must be missing something :)

^^

>
>>   __AARCH64_INSN_FUNCS(bcond,	0xFF000010, 0x54000000)
>>   __AARCH64_INSN_FUNCS(svc,	0xFFE0001F, 0xD4000001)
>>   __AARCH64_INSN_FUNCS(hvc,	0xFFE0001F, 0xD4000002)
>>   __AARCH64_INSN_FUNCS(smc,	0xFFE0001F, 0xD4000003)
>>   __AARCH64_INSN_FUNCS(brk,	0xFFE0001F, 0xD4200000)
>> +__AARCH64_INSN_FUNCS(exception,	0xFF000000, 0xD4000000)
>>   __AARCH64_INSN_FUNCS(hint,	0xFFFFF01F, 0xD503201F)
>>   __AARCH64_INSN_FUNCS(br,	0xFFFFFC1F, 0xD61F0000)
>>   __AARCH64_INSN_FUNCS(blr,	0xFFFFFC1F, 0xD63F0000)
>> +__AARCH64_INSN_FUNCS(br_blr,	0xFFDFFC1F, 0xD61F0000)
>>   __AARCH64_INSN_FUNCS(ret,	0xFFFFFC1F, 0xD65F0000)
>> +__AARCH64_INSN_FUNCS(msr_imm,	0xFFF8F01F, 0xD500401F)
>> +__AARCH64_INSN_FUNCS(msr_reg,	0xFFF00000, 0xD5100000)
>> +__AARCH64_INSN_FUNCS(set_clr_daif, 0xFFFFF0DF, 0xD50340DF)
>> +__AARCH64_INSN_FUNCS(rd_wr_daif, 0xFFDFFFE0, 0xD51B4220)
>
> I think I'd rather have separate decoders to decode the register field
> of an mrs/msr instruction than overload each encoding here.
>
> Anyway, on the whole this looks pretty good, I'd just prefer not to build
> compound instruction checks at the encoding level (even though it looks
> like you did a good job on the values).
>

OK, easy enough to just add to the if statements where these are getting 
used.  May be getting a little bloated looking there though.

-dl

WARNING: multiple messages have this Message-ID (diff)
From: David Long <dave.long@linaro.org>
To: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <Catalin.Marinas@arm.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	Russell King <linux@arm.linux.org.uk>,
	"sandeepa.s.prabhu@gmail.com" <sandeepa.s.prabhu@gmail.com>,
	William Cohen <wcohen@redhat.com>,
	Steve Capper <steve.capper@linaro.org>,
	"Jon Medhurst (Tixy)" <tixy@linaro.org>,
	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" <davem@davemloft.net>,
	Mark Brown <broonie@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v8 2/7] arm64: Add more test functions to insn.c
Date: Thu, 13 Aug 2015 00:23:03 -0400	[thread overview]
Message-ID: <55CC1BA7.7040200@linaro.org> (raw)
In-Reply-To: <20150811180012.GE29880@arm.com>

On 08/11/15 14:00, Will Deacon wrote:
> On Tue, Aug 11, 2015 at 01:52:39AM +0100, David Long wrote:
>> From: "David A. Long" <dave.long@linaro.org>
>>
>> Certain instructions are hard to execute correctly out-of-line (as in
>> kprobes).  Test functions are added to insn.[hc] to identify these.  The
>> instructions include any that use PC-relative addressing, change the PC,
>> or change interrupt masking. For efficiency and simplicity test
>> functions are also added for small collections of related instructions.
>>
>> Signed-off-by: David A. Long <dave.long@linaro.org>
>> ---
>>   arch/arm64/include/asm/insn.h | 18 ++++++++++++++++++
>>   arch/arm64/kernel/insn.c      | 28 ++++++++++++++++++++++++++++
>>   2 files changed, 46 insertions(+)
>>
>> diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h
>> index 30e50eb..66bfb21 100644
>> --- a/arch/arm64/include/asm/insn.h
>> +++ b/arch/arm64/include/asm/insn.h
>> @@ -223,8 +223,13 @@ static __always_inline bool aarch64_insn_is_##abbr(u32 code) \
>>   static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \
>>   { return (val); }
>>
>> +__AARCH64_INSN_FUNCS(adr_adrp,	0x1F000000, 0x10000000)
>> +__AARCH64_INSN_FUNCS(prfm_lit,	0xFF000000, 0xD8000000)
>>   __AARCH64_INSN_FUNCS(str_reg,	0x3FE0EC00, 0x38206800)
>>   __AARCH64_INSN_FUNCS(ldr_reg,	0x3FE0EC00, 0x38606800)
>> +__AARCH64_INSN_FUNCS(ldr_lit,	0xBF000000, 0x18000000)
>> +__AARCH64_INSN_FUNCS(ldrsw_lit,	0xFF000000, 0x98000000)
>> +__AARCH64_INSN_FUNCS(exclusive,	0x3F000000, 0x08000000)
>
> Hmm, so this class also pulls in load-acquire and store-release, which
> we *should* be able to single-step, no? Maybe it's worth splitting this
> category up (or at least changing aarch64_insn_is_exclusive to be more
> permissive).

I was not confident that this was the case. After reading the relevant 
parts of the v8 ARM yet again I think I see your point.

>
>>   __AARCH64_INSN_FUNCS(stp_post,	0x7FC00000, 0x28800000)
>>   __AARCH64_INSN_FUNCS(ldp_post,	0x7FC00000, 0x28C00000)
>>   __AARCH64_INSN_FUNCS(stp_pre,	0x7FC00000, 0x29800000)
>> @@ -264,19 +269,29 @@ __AARCH64_INSN_FUNCS(ands,	0x7F200000, 0x6A000000)
>>   __AARCH64_INSN_FUNCS(bics,	0x7F200000, 0x6A200000)
>>   __AARCH64_INSN_FUNCS(b,		0xFC000000, 0x14000000)
>>   __AARCH64_INSN_FUNCS(bl,	0xFC000000, 0x94000000)
>> +__AARCH64_INSN_FUNCS(b_bl,	0x7C000000, 0x14000000)
>
> Why do we need this when we already have checks for b and bl?

I was trying to avoid doing multiple checks for different variants of 
similar instructions.

>
>> +__AARCH64_INSN_FUNCS(cb,	0x7E000000, 0x34000000)
>
> Likewise for cbz and cbnz...
>
>>   __AARCH64_INSN_FUNCS(cbz,	0x7F000000, 0x34000000)
>>   __AARCH64_INSN_FUNCS(cbnz,	0x7F000000, 0x35000000)
>> +__AARCH64_INSN_FUNCS(tb,	0x7E000000, 0x36000000)
>
> ... there's a pattern here!
>

^^

>>   __AARCH64_INSN_FUNCS(tbz,	0x7F000000, 0x36000000)
>>   __AARCH64_INSN_FUNCS(tbnz,	0x7F000000, 0x37000000)
>> +__AARCH64_INSN_FUNCS(b_bl_cb_tb, 0x5C000000, 0x14000000)
>
> I must be missing something :)

^^

>
>>   __AARCH64_INSN_FUNCS(bcond,	0xFF000010, 0x54000000)
>>   __AARCH64_INSN_FUNCS(svc,	0xFFE0001F, 0xD4000001)
>>   __AARCH64_INSN_FUNCS(hvc,	0xFFE0001F, 0xD4000002)
>>   __AARCH64_INSN_FUNCS(smc,	0xFFE0001F, 0xD4000003)
>>   __AARCH64_INSN_FUNCS(brk,	0xFFE0001F, 0xD4200000)
>> +__AARCH64_INSN_FUNCS(exception,	0xFF000000, 0xD4000000)
>>   __AARCH64_INSN_FUNCS(hint,	0xFFFFF01F, 0xD503201F)
>>   __AARCH64_INSN_FUNCS(br,	0xFFFFFC1F, 0xD61F0000)
>>   __AARCH64_INSN_FUNCS(blr,	0xFFFFFC1F, 0xD63F0000)
>> +__AARCH64_INSN_FUNCS(br_blr,	0xFFDFFC1F, 0xD61F0000)
>>   __AARCH64_INSN_FUNCS(ret,	0xFFFFFC1F, 0xD65F0000)
>> +__AARCH64_INSN_FUNCS(msr_imm,	0xFFF8F01F, 0xD500401F)
>> +__AARCH64_INSN_FUNCS(msr_reg,	0xFFF00000, 0xD5100000)
>> +__AARCH64_INSN_FUNCS(set_clr_daif, 0xFFFFF0DF, 0xD50340DF)
>> +__AARCH64_INSN_FUNCS(rd_wr_daif, 0xFFDFFFE0, 0xD51B4220)
>
> I think I'd rather have separate decoders to decode the register field
> of an mrs/msr instruction than overload each encoding here.
>
> Anyway, on the whole this looks pretty good, I'd just prefer not to build
> compound instruction checks at the encoding level (even though it looks
> like you did a good job on the values).
>

OK, easy enough to just add to the if statements where these are getting 
used.  May be getting a little bloated looking there though.

-dl


  reply	other threads:[~2015-08-13  4:23 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-11  0:52 [PATCH v8 0/7] arm64: Add kernel probes (kprobes) support David Long
2015-08-11  0:52 ` David Long
2015-08-11  0:52 ` [PATCH v8 1/7] arm64: Add HAVE_REGS_AND_STACK_ACCESS_API feature David Long
2015-08-11  0:52   ` David Long
2015-08-11 17:31   ` Will Deacon
2015-08-11 17:31     ` Will Deacon
2015-08-13  3:50     ` David Long
2015-08-13  3:50       ` David Long
2015-08-18  9:38       ` Will Deacon
2015-08-18  9:38         ` Will Deacon
2015-08-11  0:52 ` [PATCH v8 2/7] arm64: Add more test functions to insn.c David Long
2015-08-11  0:52   ` David Long
2015-08-11 18:00   ` Will Deacon
2015-08-11 18:00     ` Will Deacon
2015-08-13  4:23     ` David Long [this message]
2015-08-13  4:23       ` David Long
2015-08-11  0:52 ` [PATCH v8 3/7] arm64: Kprobes with single stepping support David Long
2015-08-11  0:52   ` David Long
2015-08-12 13:37   ` Will Deacon
2015-08-12 13:37     ` Will Deacon
2015-12-08  6:05     ` David Long
2015-12-08  6:05       ` David Long
2015-08-13 11:42   ` Steve Capper
2015-08-13 11:42     ` Steve Capper
2015-08-11  0:52 ` [PATCH v8 4/7] arm64: kprobes instruction simulation support David Long
2015-08-11  0:52   ` David Long
2015-08-12 14:29   ` Will Deacon
2015-08-12 14:29     ` Will Deacon
2015-08-11  0:52 ` [PATCH v8 5/7] arm64: Add trampoline code for kretprobes David Long
2015-08-11  0:52   ` David Long
2015-08-12 14:47   ` Will Deacon
2015-08-12 14:47     ` Will Deacon
2015-08-11  0:52 ` [PATCH v8 6/7] arm64: Add kernel return probes support (kretprobes) David Long
2015-08-11  0:52   ` David Long
2015-08-11  0:52 ` [PATCH v8 7/7] kprobes: Add arm64 case in kprobe example module David Long
2015-08-11  0:52   ` David Long
2015-08-12 16:22   ` Steve Capper
2015-08-12 16:22     ` Steve Capper
2015-08-11 16:56 ` [PATCH v8 0/7] arm64: Add kernel probes (kprobes) support Will Deacon
2015-08-11 16:56   ` Will Deacon
2015-08-11 17:03   ` David Long
2015-08-11 17:03     ` David Long
2015-08-11 17:36     ` Will Deacon
2015-08-11 17:36       ` Will Deacon

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=55CC1BA7.7040200@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.