| From 672f6fc2486745d0cabc3aaeb4e0a3cd13b37b12 Mon Sep 17 00:00:00 2001 |
| From: David Benjamin <davidben@google.com> |
| Date: Wed, 21 Feb 2018 16:22:34 -0500 |
| Subject: [PATCH] Always use adr with __thumb2__. |
| |
| Thumb2 addresses are a bit a mess, depending on whether a label is |
| interpreted as a function pointer value (for use with BX and BLX) or as |
| a program counter value (for use with PC-relative addressing). Clang's |
| integrated assembler mis-assembles this code. See |
| https://crbug.com/124610#c54 for details. |
| |
| Instead, use the ADR pseudo-instruction which has clear semantics and |
| should be supported by every assembler that handles the OpenSSL Thumb2 |
| code. (In other files, the ADR vs SUB conditionals are based on |
| __thumb2__ already. For some reason, this one is based on __APPLE__, I'm |
| guessing to deal with an older version of clang assembler.) |
| |
| It's unclear to me which of clang or binutils is "correct" or if this is |
| even a well-defined notion beyond "whatever binutils does". But I will |
| note that https://github.com/openssl/openssl/pull/4669 suggests binutils |
| has also changed behavior around this before. |
| |
| See also https://github.com/openssl/openssl/pull/5431 in OpenSSL. |
| |
| Bug: chromium:124610 |
| Change-Id: I5e7a0c8c0f54a3f65cc324ad599a41883675f368 |
| Reviewed-on: https://boringssl-review.googlesource.com/26164 |
| Commit-Queue: Steven Valdez <svaldez@google.com> |
| Reviewed-by: Steven Valdez <svaldez@google.com> |
| CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> |
| --- |
| |
| diff --git a/crypto/fipsmodule/aes/asm/aes-armv4.pl b/crypto/fipsmodule/aes/asm/aes-armv4.pl |
| index 466a4ba..4b507dd 100644 |
| --- a/crypto/fipsmodule/aes/asm/aes-armv4.pl |
| +++ b/crypto/fipsmodule/aes/asm/aes-armv4.pl |
| @@ -208,7 +208,7 @@ |
| adr r3,. |
| #endif |
| stmdb sp!,{r1,r4-r12,lr} |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $tbl,AES_Te |
| #else |
| sub $tbl,r3,#asm_AES_encrypt-AES_Te @ Te |
| @@ -486,7 +486,7 @@ |
| mov lr,r1 @ bits |
| mov $key,r2 @ key |
| |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $tbl,AES_Te+1024 @ Te4 |
| #else |
| sub $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4 |
| @@ -984,7 +984,7 @@ |
| adr r3,. |
| #endif |
| stmdb sp!,{r1,r4-r12,lr} |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $tbl,AES_Td |
| #else |
| sub $tbl,r3,#asm_AES_decrypt-AES_Td @ Td |
| diff --git a/crypto/fipsmodule/aes/asm/bsaes-armv7.pl b/crypto/fipsmodule/aes/asm/bsaes-armv7.pl |
| index fa1e434..775dbd5 100644 |
| --- a/crypto/fipsmodule/aes/asm/bsaes-armv7.pl |
| +++ b/crypto/fipsmodule/aes/asm/bsaes-armv7.pl |
| @@ -742,7 +742,7 @@ |
| _bsaes_decrypt8: |
| adr $const,. |
| vldmia $key!, {@XMM[9]} @ round 0 key |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $const,.LM0ISR |
| #else |
| add $const,$const,#.LM0ISR-_bsaes_decrypt8 |
| @@ -841,7 +841,7 @@ |
| _bsaes_encrypt8: |
| adr $const,. |
| vldmia $key!, {@XMM[9]} @ round 0 key |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $const,.LM0SR |
| #else |
| sub $const,$const,#_bsaes_encrypt8-.LM0SR |
| @@ -949,7 +949,7 @@ |
| _bsaes_key_convert: |
| adr $const,. |
| vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key |
| -#ifdef __APPLE__ |
| +#if defined(__thumb2__) || defined(__APPLE__) |
| adr $const,.LM0 |
| #else |
| sub $const,$const,#_bsaes_key_convert-.LM0 |