[PATCH] ARM: fix Thumb-2 bug in AES assembler code

Dave P Martin Dave.Martin at arm.com
Wed Sep 18 09:32:25 EDT 2013


On Tue, Sep 17, 2013 at 05:41:04PM +0100, Ard Biesheuvel wrote:
> On 17 September 2013 18:35, Nicolas Pitre <nicolas.pitre at 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 at 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
> >>
> 



More information about the linux-arm-kernel mailing list