x86_64 MULADDC assembly: add missing constraints about memory

MULADDC_CORE reads from (%%rsi) and writes to (%%rdi). This fragment is
repeated up to 16 times, and %%rsi and %%rdi are s and d on entry
respectively. Hence the complete asm statement reads 16 64-bit words
from memory starting at s, and writes 16 64-bit words starting at d.

Without any declaration of modified memory, Clang 12 and Clang 13 generated
non-working code for mbedtls_mpi_mod_exp. The constraints make the unit
tests pass with Clang 12.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
Gilles Peskine 2021-09-14 00:13:05 +02:00
parent 8e464c407a
commit c6d977eae5
2 changed files with 6 additions and 3 deletions

View file

@ -0,0 +1,3 @@
Bugfix
* Fix missing constraints on x86_64 assembly code for bignum multiplication
that broke some bignum operations with (at least) Clang 12. Fixes #4786.

View file

@ -189,9 +189,9 @@
"addq $8, %%rdi\n" "addq $8, %%rdi\n"
#define MULADDC_STOP \ #define MULADDC_STOP \
: "+c" (c), "+D" (d), "+S" (s) \ : "+c" (c), "+D" (d), "+S" (s), "+m" (*(uint64_t (*)[16]) d) \
: "b" (b) \ : "b" (b), "m" (*(const uint64_t (*)[16]) s) \
: "rax", "rdx", "r8" \ : "rax", "rdx", "r8" \
); );
#endif /* AMD64 */ #endif /* AMD64 */