diff mbox series

ARM: asm: Rewrite get_thread_info using BIC

Message ID 20200527122201.124090-1-linus.walleij@linaro.org (mailing list archive)
State New, archived
Headers show
Series ARM: asm: Rewrite get_thread_info using BIC | expand

Commit Message

Linus Walleij May 27, 2020, 12:22 p.m. UTC
By using two BIC instructions we can replace the ARM/thumb
split instructions with something that works on either
and also save one instruction.

Based on code from proc-macros.S and an idea from Ard
Biesheuvel.

We need to include <linux/const.h> to expand the
THREAD_SIZE definition properly in the preprocessor.

Suggested-by: Russell King <linux@armlinux.org.uk>
Suggested-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 arch/arm/include/asm/assembler.h | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Comments

Russell King (Oracle) May 27, 2020, 1:13 p.m. UTC | #1
On Wed, May 27, 2020 at 02:22:01PM +0200, Linus Walleij wrote:
> By using two BIC instructions we can replace the ARM/thumb
> split instructions with something that works on either
> and also save one instruction.
> 
> Based on code from proc-macros.S and an idea from Ard
> Biesheuvel.
> 
> We need to include <linux/const.h> to expand the
> THREAD_SIZE definition properly in the preprocessor.
> 
> Suggested-by: Russell King <linux@armlinux.org.uk>
> Suggested-by: Ard Biesheuvel <ardb@kernel.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

Looks good to me, thanks.

> ---
>  arch/arm/include/asm/assembler.h | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 99929122dad7..f218e8cf7f88 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -17,6 +17,7 @@
>  #error "Only include this from assembly code"
>  #endif
>  
> +#include <linux/const.h>
>  #include <asm/ptrace.h>
>  #include <asm/domain.h>
>  #include <asm/opcodes-virt.h>
> @@ -203,10 +204,8 @@
>   * Get current thread_info.
>   */
>  	.macro	get_thread_info, rd
> - ARM(	mov	\rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> - THUMB(	mov	\rd, sp			)
> - THUMB(	lsr	\rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> -	mov	\rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT
> +	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
> +	bic	\rd, \rd, #63
>  	.endm
>  
>  /*
> -- 
> 2.25.4
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
Dmitry Osipenko July 21, 2020, 1:37 p.m. UTC | #2
27.05.2020 15:22, Linus Walleij пишет:
> By using two BIC instructions we can replace the ARM/thumb
> split instructions with something that works on either
> and also save one instruction.
> 
> Based on code from proc-macros.S and an idea from Ard
> Biesheuvel.
> 
> We need to include <linux/const.h> to expand the
> THREAD_SIZE definition properly in the preprocessor.
> 
> Suggested-by: Russell King <linux@armlinux.org.uk>
> Suggested-by: Ard Biesheuvel <ardb@kernel.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  arch/arm/include/asm/assembler.h | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 99929122dad7..f218e8cf7f88 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -17,6 +17,7 @@
>  #error "Only include this from assembly code"
>  #endif
>  
> +#include <linux/const.h>
>  #include <asm/ptrace.h>
>  #include <asm/domain.h>
>  #include <asm/opcodes-virt.h>
> @@ -203,10 +204,8 @@
>   * Get current thread_info.
>   */
>  	.macro	get_thread_info, rd
> - ARM(	mov	\rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> - THUMB(	mov	\rd, sp			)
> - THUMB(	lsr	\rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> -	mov	\rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT
> +	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
> +	bic	\rd, \rd, #63
>  	.endm
>  
>  /*
> 

Hello, Linus!

This patch was merged into a recent linux-next, unfortunately it breaks
CONFIG_THUMB2_KERNEL=y compilation:

arch/arm/kernel/entry-common.S: Assembler messages:
arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic
tsk,sp,#(((1<<12)<<1)-1)&~63'
arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic
tsk,sp,#(((1<<12)<<1)-1)&~63'
make[2]: *** [scripts/Makefile.build:361:
arch/arm/kernel/entry-common.o] Error 1
Russell King (Oracle) July 21, 2020, 1:38 p.m. UTC | #3
On Tue, Jul 21, 2020 at 04:37:09PM +0300, Dmitry Osipenko wrote:
> 27.05.2020 15:22, Linus Walleij пишет:
> > By using two BIC instructions we can replace the ARM/thumb
> > split instructions with something that works on either
> > and also save one instruction.
> > 
> > Based on code from proc-macros.S and an idea from Ard
> > Biesheuvel.
> > 
> > We need to include <linux/const.h> to expand the
> > THREAD_SIZE definition properly in the preprocessor.
> > 
> > Suggested-by: Russell King <linux@armlinux.org.uk>
> > Suggested-by: Ard Biesheuvel <ardb@kernel.org>
> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> > ---
> >  arch/arm/include/asm/assembler.h | 7 +++----
> >  1 file changed, 3 insertions(+), 4 deletions(-)
> > 
> > diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> > index 99929122dad7..f218e8cf7f88 100644
> > --- a/arch/arm/include/asm/assembler.h
> > +++ b/arch/arm/include/asm/assembler.h
> > @@ -17,6 +17,7 @@
> >  #error "Only include this from assembly code"
> >  #endif
> >  
> > +#include <linux/const.h>
> >  #include <asm/ptrace.h>
> >  #include <asm/domain.h>
> >  #include <asm/opcodes-virt.h>
> > @@ -203,10 +204,8 @@
> >   * Get current thread_info.
> >   */
> >  	.macro	get_thread_info, rd
> > - ARM(	mov	\rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> > - THUMB(	mov	\rd, sp			)
> > - THUMB(	lsr	\rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT	)
> > -	mov	\rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT
> > +	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
> > +	bic	\rd, \rd, #63
> >  	.endm
> >  
> >  /*
> > 
> 
> Hello, Linus!
> 
> This patch was merged into a recent linux-next, unfortunately it breaks
> CONFIG_THUMB2_KERNEL=y compilation:
> 
> arch/arm/kernel/entry-common.S: Assembler messages:
> arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic
> tsk,sp,#(((1<<12)<<1)-1)&~63'
> arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic
> tsk,sp,#(((1<<12)<<1)-1)&~63'
> make[2]: *** [scripts/Makefile.build:361:
> arch/arm/kernel/entry-common.o] Error 1

I've dropped it before you sent this email...
Dmitry Osipenko July 21, 2020, 1:39 p.m. UTC | #4
21.07.2020 16:38, Russell King - ARM Linux admin пишет:
> On Tue, Jul 21, 2020 at 04:37:09PM +0300, Dmitry Osipenko wrote:
>> 27.05.2020 15:22, Linus Walleij пишет:
>>> By using two BIC instructions we can replace the ARM/thumb
>>> split instructions with something that works on either
>>> and also save one instruction.
>>>
>>> Based on code from proc-macros.S and an idea from Ard
>>> Biesheuvel.
>>>
>>> We need to include <linux/const.h> to expand the
>>> THREAD_SIZE definition properly in the preprocessor.
>>>
>>> Suggested-by: Russell King <linux@armlinux.org.uk>
>>> Suggested-by: Ard Biesheuvel <ardb@kernel.org>
>>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>>> ---
>>>  arch/arm/include/asm/assembler.h | 7 +++----
>>>  1 file changed, 3 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
>>> index 99929122dad7..f218e8cf7f88 100644
>>> --- a/arch/arm/include/asm/assembler.h
>>> +++ b/arch/arm/include/asm/assembler.h
>>> @@ -17,6 +17,7 @@
>>>  #error "Only include this from assembly code"
>>>  #endif
>>>  
>>> +#include <linux/const.h>
>>>  #include <asm/ptrace.h>
>>>  #include <asm/domain.h>
>>>  #include <asm/opcodes-virt.h>
>>> @@ -203,10 +204,8 @@
>>>   * Get current thread_info.
>>>   */
>>>  	.macro	get_thread_info, rd
>>> - ARM(	mov	\rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT	)
>>> - THUMB(	mov	\rd, sp			)
>>> - THUMB(	lsr	\rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT	)
>>> -	mov	\rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT
>>> +	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
>>> +	bic	\rd, \rd, #63
>>>  	.endm
>>>  
>>>  /*
>>>
>>
>> Hello, Linus!
>>
>> This patch was merged into a recent linux-next, unfortunately it breaks
>> CONFIG_THUMB2_KERNEL=y compilation:
>>
>> arch/arm/kernel/entry-common.S: Assembler messages:
>> arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic
>> tsk,sp,#(((1<<12)<<1)-1)&~63'
>> arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic
>> tsk,sp,#(((1<<12)<<1)-1)&~63'
>> make[2]: *** [scripts/Makefile.build:361:
>> arch/arm/kernel/entry-common.o] Error 1
> 
> I've dropped it before you sent this email...

Hello, Russell!

Good to know, thank you!
Linus Walleij July 21, 2020, 1:54 p.m. UTC | #5
On Tue, Jul 21, 2020 at 3:37 PM Dmitry Osipenko <digetx@gmail.com> wrote:

> This patch was merged into a recent linux-next, unfortunately it breaks
> CONFIG_THUMB2_KERNEL=y compilation:
>
> arch/arm/kernel/entry-common.S: Assembler messages:
> arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic
> tsk,sp,#(((1<<12)<<1)-1)&~63'
> arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic
> tsk,sp,#(((1<<12)<<1)-1)&~63'
> make[2]: *** [scripts/Makefile.build:361:
> arch/arm/kernel/entry-common.o] Error 1

Ah how typical. I suppose we simply need to give up on this
idea to simplify using BIC. It was worth a try.

Yours,
Linus Walleij
diff mbox series

Patch

diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 99929122dad7..f218e8cf7f88 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -17,6 +17,7 @@ 
 #error "Only include this from assembly code"
 #endif
 
+#include <linux/const.h>
 #include <asm/ptrace.h>
 #include <asm/domain.h>
 #include <asm/opcodes-virt.h>
@@ -203,10 +204,8 @@ 
  * Get current thread_info.
  */
 	.macro	get_thread_info, rd
- ARM(	mov	\rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT	)
- THUMB(	mov	\rd, sp			)
- THUMB(	lsr	\rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT	)
-	mov	\rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT
+	bic	\rd, sp, #(THREAD_SIZE - 1) & ~63
+	bic	\rd, \rd, #63
 	.endm
 
 /*