diff mbox

ARM: fix Thumb-2 bug in AES assembler code

Message ID 1379434519-23299-1-git-send-email-ard.biesheuvel@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Ard Biesheuvel Sept. 17, 2013, 4:15 p.m. UTC
Patch 638591c enabled building the AES assembler code in Thumb2 mode.
However, this code uses arithmetic involving PC rather than adr{l}
instructions to generate PC-relative references to the lookup tables,
and this needs to take into account the different PC offset when
running in Thumb mode.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---

This needs cc to stable for 3.10/3.11 as well.


 arch/arm/crypto/aes-armv4.S | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Nicolas Pitre Sept. 17, 2013, 4:35 p.m. UTC | #1
On Tue, 17 Sep 2013, Ard Biesheuvel wrote:

> Patch 638591c enabled building the AES assembler code in Thumb2 mode.
> However, this code uses arithmetic involving PC rather than adr{l}
> instructions to generate PC-relative references to the lookup tables,
> and this needs to take into account the different PC offset when
> running in Thumb mode.

Wouldn't it be better to fix this using adr instead?


> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
> 
> This needs cc to stable for 3.10/3.11 as well.
> 
> 
>  arch/arm/crypto/aes-armv4.S | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/crypto/aes-armv4.S b/arch/arm/crypto/aes-armv4.S
> index 19d6cd6..33c30ab 100644
> --- a/arch/arm/crypto/aes-armv4.S
> +++ b/arch/arm/crypto/aes-armv4.S
> @@ -148,7 +148,8 @@ AES_Te:
>  @ 		 const AES_KEY *key) {
>  .align	5
>  ENTRY(AES_encrypt)
> -	sub	r3,pc,#8		@ AES_encrypt
> +ARM(	sub	r3,pc,#8	)	@ AES_encrypt
> +THUMB(	sub	r3,pc,#4	)
>  	stmdb   sp!,{r1,r4-r12,lr}
>  	mov	r12,r0		@ inp
>  	mov	r11,r2
> @@ -381,7 +382,8 @@ _armv4_AES_encrypt:
>  .align	5
>  ENTRY(private_AES_set_encrypt_key)
>  _armv4_AES_set_encrypt_key:
> -	sub	r3,pc,#8		@ AES_set_encrypt_key
> +ARM(	sub	r3,pc,#8	)	@ AES_set_encrypt_key
> +THUMB(	sub	r3,pc,#4	)
>  	teq	r0,#0
>  	moveq	r0,#-1
>  	beq	.Labrt
> @@ -843,8 +845,9 @@ AES_Td:
>  @ 		 const AES_KEY *key) {
>  .align	5
>  ENTRY(AES_decrypt)
> -	sub	r3,pc,#8		@ AES_decrypt
> -	stmdb   sp!,{r1,r4-r12,lr}
> +ARM(	sub	r3,pc,#8	)	@ AES_decrypt
> +THUMB(	sub	r3,pc,#4	)
> +		stmdb   sp!,{r1,r4-r12,lr}
>  	mov	r12,r0		@ inp
>  	mov	r11,r2
>  	sub	r10,r3,#AES_decrypt-AES_Td		@ Td
> -- 
> 1.8.1.2
>
Ard Biesheuvel Sept. 17, 2013, 4:41 p.m. UTC | #2
On 17 September 2013 18:35, Nicolas Pitre <nicolas.pitre@linaro.org> wrote:
> On Tue, 17 Sep 2013, Ard Biesheuvel wrote:
>
>> Patch 638591c enabled building the AES assembler code in Thumb2 mode.
>> However, this code uses arithmetic involving PC rather than adr{l}
>> instructions to generate PC-relative references to the lookup tables,
>> and this needs to take into account the different PC offset when
>> running in Thumb mode.
>
> Wouldn't it be better to fix this using adr instead?
>

Excellent point. I am just being overly cautious perhaps, but my idea
was to stay as close as possible to the original.
Let me check if it builds with adr (no adrl in thumb), if so I will respin.
Dave Martin Sept. 18, 2013, 1:32 p.m. UTC | #3
On Tue, Sep 17, 2013 at 05:41:04PM +0100, Ard Biesheuvel wrote:
> On 17 September 2013 18:35, Nicolas Pitre <nicolas.pitre@linaro.org> wrote:
> > On Tue, 17 Sep 2013, Ard Biesheuvel wrote:
> >
> >> Patch 638591c enabled building the AES assembler code in Thumb2 mode.
> >> However, this code uses arithmetic involving PC rather than adr{l}
> >> instructions to generate PC-relative references to the lookup tables,
> >> and this needs to take into account the different PC offset when
> >> running in Thumb mode.
> >
> > Wouldn't it be better to fix this using adr instead?
> >
> 
> Excellent point. I am just being overly cautious perhaps, but my idea
> was to stay as close as possible to the original.
> Let me check if it builds with adr (no adrl in thumb), if so I will respin.

Explicit references to PC are often wrong (or at least, unless you Know
What You're Doing)

<shameless plug>

There's discussion of some of these issues here:

https://wiki.ubuntu.com/ARM/Thumb2PortingHowto

</shameless plug>

Cheers
---Dave

> 
> -- 
> Ard.
> 
> 
> >
> >>
> >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >> ---
> >>
> >> This needs cc to stable for 3.10/3.11 as well.
> >>
> >>
> >>  arch/arm/crypto/aes-armv4.S | 11 +++++++----
> >>  1 file changed, 7 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/arch/arm/crypto/aes-armv4.S b/arch/arm/crypto/aes-armv4.S
> >> index 19d6cd6..33c30ab 100644
> >> --- a/arch/arm/crypto/aes-armv4.S
> >> +++ b/arch/arm/crypto/aes-armv4.S
> >> @@ -148,7 +148,8 @@ AES_Te:
> >>  @             const AES_KEY *key) {
> >>  .align       5
> >>  ENTRY(AES_encrypt)
> >> -     sub     r3,pc,#8                @ AES_encrypt
> >> +ARM( sub     r3,pc,#8        )       @ AES_encrypt
> >> +THUMB(       sub     r3,pc,#4        )
> >>       stmdb   sp!,{r1,r4-r12,lr}
> >>       mov     r12,r0          @ inp
> >>       mov     r11,r2
> >> @@ -381,7 +382,8 @@ _armv4_AES_encrypt:
> >>  .align       5
> >>  ENTRY(private_AES_set_encrypt_key)
> >>  _armv4_AES_set_encrypt_key:
> >> -     sub     r3,pc,#8                @ AES_set_encrypt_key
> >> +ARM( sub     r3,pc,#8        )       @ AES_set_encrypt_key
> >> +THUMB(       sub     r3,pc,#4        )
> >>       teq     r0,#0
> >>       moveq   r0,#-1
> >>       beq     .Labrt
> >> @@ -843,8 +845,9 @@ AES_Td:
> >>  @             const AES_KEY *key) {
> >>  .align       5
> >>  ENTRY(AES_decrypt)
> >> -     sub     r3,pc,#8                @ AES_decrypt
> >> -     stmdb   sp!,{r1,r4-r12,lr}
> >> +ARM( sub     r3,pc,#8        )       @ AES_decrypt
> >> +THUMB(       sub     r3,pc,#4        )
> >> +             stmdb   sp!,{r1,r4-r12,lr}
> >>       mov     r12,r0          @ inp
> >>       mov     r11,r2
> >>       sub     r10,r3,#AES_decrypt-AES_Td              @ Td
> >> --
> >> 1.8.1.2
> >>
>
diff mbox

Patch

diff --git a/arch/arm/crypto/aes-armv4.S b/arch/arm/crypto/aes-armv4.S
index 19d6cd6..33c30ab 100644
--- a/arch/arm/crypto/aes-armv4.S
+++ b/arch/arm/crypto/aes-armv4.S
@@ -148,7 +148,8 @@  AES_Te:
 @ 		 const AES_KEY *key) {
 .align	5
 ENTRY(AES_encrypt)
-	sub	r3,pc,#8		@ AES_encrypt
+ARM(	sub	r3,pc,#8	)	@ AES_encrypt
+THUMB(	sub	r3,pc,#4	)
 	stmdb   sp!,{r1,r4-r12,lr}
 	mov	r12,r0		@ inp
 	mov	r11,r2
@@ -381,7 +382,8 @@  _armv4_AES_encrypt:
 .align	5
 ENTRY(private_AES_set_encrypt_key)
 _armv4_AES_set_encrypt_key:
-	sub	r3,pc,#8		@ AES_set_encrypt_key
+ARM(	sub	r3,pc,#8	)	@ AES_set_encrypt_key
+THUMB(	sub	r3,pc,#4	)
 	teq	r0,#0
 	moveq	r0,#-1
 	beq	.Labrt
@@ -843,8 +845,9 @@  AES_Td:
 @ 		 const AES_KEY *key) {
 .align	5
 ENTRY(AES_decrypt)
-	sub	r3,pc,#8		@ AES_decrypt
-	stmdb   sp!,{r1,r4-r12,lr}
+ARM(	sub	r3,pc,#8	)	@ AES_decrypt
+THUMB(	sub	r3,pc,#4	)
+		stmdb   sp!,{r1,r4-r12,lr}
 	mov	r12,r0		@ inp
 	mov	r11,r2
 	sub	r10,r3,#AES_decrypt-AES_Td		@ Td