On 4 December 2015 at 16:47, Yvan Roux <yvan.r...@linaro.org> wrote:
> Hi Robert,
>
>
>
> On 4 December 2015 at 15:13, Robert Schiele <rschi...@gmail.com> wrote:
>> Hi,
>>
>> when working with the Linaro patches I found that a particular commit
>> breaks our aarch64 kernel build.
>>
>> The patch in question is that one:
>>
>> commit be09330da9d0777c4a58568d137e3f8a3dbe0a0b
>> Author: Yvan Roux <yvan.r...@linaro.org>
>> Date:   Tue Oct 27 21:18:19 2015 +0100
>>
>> One of the things it attempts to change apparently is moving the .arch
>> specifiers in the assembler file from a global scope to individual
>> functions. What also happens though is that they seem to lose some
>> information after that transformation.
>>
>> I observed that when building arch/arm64/crypto/aes-ce-cipher.c from
>> the Linux kernel. This code contains inline assembly like this:
>>
>> static void aes_cipher_decrypt(struct crypto_tfm *tfm, u8 dst[], u8 const 
>> src[])
>> {
>>         struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
>>         struct aes_block *out = (struct aes_block *)dst;
>>         struct aes_block const *in = (struct aes_block *)src;
>>         void *dummy0;
>>         int dummy1;
>>
>>         kernel_neon_begin_partial(4);
>>
>>         __asm__("       ld1     {v0.16b}, %[in]                 ;"
>>                 "       ld1     {v1.2d}, [%[key]], #16          ;"
>>                 "       cmp     %w[rounds], #10                 ;"
>>                 "       bmi     0f                              ;"
>>                 "       bne     3f                              ;"
>>                 "       mov     v3.16b, v1.16b                  ;"
>>                 "       b       2f                              ;"
>>                 "0:     mov     v2.16b, v1.16b                  ;"
>>                 "       ld1     {v3.2d}, [%[key]], #16          ;"
>>                 "1:     aesd    v0.16b, v2.16b                  ;"
>>                 "       aesimc  v0.16b, v0.16b                  ;"
>>                 "2:     ld1     {v1.2d}, [%[key]], #16          ;"
>>                 "       aesd    v0.16b, v3.16b                  ;"
>>                 "       aesimc  v0.16b, v0.16b                  ;"
>>                 "3:     ld1     {v2.2d}, [%[key]], #16          ;"
>>                 "       subs    %w[rounds], %w[rounds], #3      ;"
>>                 "       aesd    v0.16b, v1.16b                  ;"
>>                 "       aesimc  v0.16b, v0.16b                  ;"
>>                 "       ld1     {v3.2d}, [%[key]], #16          ;"
>>                 "       bpl     1b                              ;"
>>                 "       aesd    v0.16b, v2.16b                  ;"
>>                 "       eor     v0.16b, v0.16b, v3.16b          ;"
>>                 "       st1     {v0.16b}, %[out]                ;"
>>
>>         :       [out]           "=Q"(*out),
>>                 [key]           "=r"(dummy0),
>>                 [rounds]        "=r"(dummy1)
>>         :       [in]            "Q"(*in),
>>                                 "1"(ctx->key_dec),
>>                                 "2"(num_rounds(ctx) - 2)
>>         :       "cc");
>>
>>         kernel_neon_end();
>> }
>>
>> Now without this patch the compiler behaved like the following. It was
>> invoked with:
>>
>>   aarch64-linux-gnu-gcc -Wp,-MD,arch/arm64/crypto/.aes-ce-cipher.o.d
>> -nostdinc -isystem
>> /var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/bin/../lib/gcc/aarch64-linux-gnu/5.2.1/include
>> -I/var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/arch/arm64/include
>> -Iarch/arm64/include/generated/uapi -Iarch/arm64/include/generated
>> -I/var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/include
>> -Iinclude 
>> -I/var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/arch/arm64/include/uapi
>> -Iarch/arm64/include/generated/uapi
>> -I/var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/include/uapi
>> -Iinclude/generated/uapi -include
>> /var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/include/linux/kconfig.h
>>  
>> -I/var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/arch/arm64/crypto
>> -Iarch/arm64/crypto -D__KERNEL__ -mlittle-endian -Wall -Wundef
>> -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common
>> -Werror-implicit-function-declaration -Wno-format-security -std=gnu89
>> -mgeneral-regs-only -fno-delete-null-pointer-checks -O2
>> --param=allow-store-data-races=0 -Wframe-larger-than=2048
>> -fno-stack-protector -Wno-unused-but-set-variable
>> -fno-omit-frame-pointer -fno-optimize-sibling-calls
>> -fno-var-tracking-assignments -g -Wdeclaration-after-statement
>> -Wno-pointer-sign -fno-strict-overflow -fconserve-stack
>> -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time
>> -DCC_HAVE_ASM_GOTO -Werror -march=armv8-a+crypto
>> -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(aes_ce_cipher)"
>> -D"KBUILD_MODNAME=KBUILD_STR(aes_ce_cipher)" -c -o
>> arch/arm64/crypto/aes-ce-cipher.o
>> /var/fpwork/rschiele/crossbuild/builds/aarch64-linux-gnu/linux-next/srcdir/src/linux/arch/arm64/crypto/aes-ce-cipher.c
>>
>> As a result it created a file for the assembler with the global
>>
>> .arch armv8-a+fp+simd+crypto
>>
>> at the beginning of the file.
>>
>> After the patch it created individual
>>
>> .arch armv8-a
>>
>> at individual places.
>>
>> It is not clear to me, why the extensions (fp+simd+crypto) got lost.
>> Is that intended, such that the code needs special adaption for inline
>> assembly using those extensions or is that loss of extensions a bug of
>> that patch?
>
> Hmmm, this seems to be triggered by -mgeneral-regs-only flag, at least
> on my side, I've to investigate more to give you a real answer, this
> backport is not a small one ;)  But do you confirm that if you remove
> that flag the .arch are correct ?

Kyrill submitted a patch for that issue which was lost in the pile and
approved today:

https://gcc.gnu.org/ml/gcc-patches/2015-12/msg00576.html

I'll backport it in our branch as soon as it is committed on trunk.

Thanks,
Yvan
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to