2016-05-15 8 views
2

Ich habe Schwierigkeiten, ARM-64-Funktionen plattformübergreifend (Linux, Apple, Windows Phone und Windows Store) und Toolchains (ARMCC, GCC, Clang, MSVC) zu bestimmen. Laut Dokumentation der ARM bei Compiler Toolchain für __ARM_FEATURE_CRYPTO:ARM-Crypto-Anweisungen und __ARM_FEATURE_CRYPTO Makro

Set to 1 if the target has crypto instructions. 

Zurück ein bisschen weiter, Verfolgung und nach dem ARM C Language Extensions 2.0 (ACLE):

6.5.7 Crypto Erweiterung

__ARM_FEATURE_CRYPTO definiert auf 1, wenn die Crypto-Anweisungen unterstützt werden und die in 12.3.14 definierten Eigen- schaften verfügbar sind. Diese Anweisungen umfassen AES {E, D}, {SHA1 C, P, M} etc. Dies ist nur verfügbar, wenn __ARM_ARCH> = 8.

Und:

2.3.14 Crypto Intrinsics

Crypto-Erweiterungsbefehle sind Teil des Advanced SIMD-Befehlssatzes. Diese Spezifika sind verfügbar, wenn __ARM_FEATURE_CRYPTO definiert ...

Wenn Sie bemerken, Abschnitt 6.5.7 aufschiebt bis 2.3.14 und 2.3.14 Kreise zurück und aufschiebt 6.5.7 auf.

Was sind die Anweisungen, die die Definition auslösen? Und wenn die Anweisungen vorhanden sind, welche intrinsischen sind verfügbar?


Von einem 64-Bit-ARMv8-a LeMaker HiKey (asimd ist neon in Verkleidung):

$ cat /proc/cpuinfo 
Processor : AArch64 Processor rev 3 (aarch64) 
processor : 0 
... 
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 

Und aus dem gleichen LeMaker HiKey dev Board (-march=native ist nicht verfügbar):

$ gcc -dM -E -march=armv8-a -mcpu=cortex-a53 - < /dev/null | egrep -i '(arm|aarch|neon|crc|crypto)' 
#define __AARCH64_CMODEL_SMALL__ 1 
#define __aarch64__ 1 
#define __AARCH64EL__ 1 
#define __ARM_NEON 1 

Und von einem Apple toolcha mit -arch arm64:

$ clang++ -arch arm64 -dM -E - < /dev/null | sort | egrep -i '(arm|aarch|neon|crc)' 
#define __AARCH64EL__ 1 
#define __AARCH64_SIMD__ 1 
#define __ARM64_ARCH_8__ 1 
#define __ARM_64BIT_STATE 1 
#define __ARM_ACLE 200 
#define __ARM_ALIGN_MAX_STACK_PWR 4 
#define __ARM_ARCH 8 
#define __ARM_ARCH_ISA_A64 1 
#define __ARM_ARCH_PROFILE 'A' 
#define __ARM_FEATURE_CLZ 1 
#define __ARM_FEATURE_CRYPTO 1 
#define __ARM_FEATURE_DIV 1 
#define __ARM_FEATURE_FMA 1 
#define __ARM_FEATURE_UNALIGNED 1 
#define __ARM_FP 0xe 
#define __ARM_FP16_FORMAT_IEEE 1 
#define __ARM_FP_FENV_ROUNDING 1 
#define __ARM_NEON 1 
#define __ARM_NEON_FP 7 
#define __ARM_NEON__ 1 
#define __ARM_PCS_AAPCS64 1 
#define __ARM_SIZEOF_MINIMAL_ENUM 4 
#define __ARM_SIZEOF_WCHAR_T 4 
#define __aarch64__ 1 
#define __arm64 1 
#define __arm64__ 1 
+0

Für Apple finden Sie die SO-Antwort für [iPhone-Unterstützung hardwarebeschleunigte AES-Verschlüsselung?] (Http://Stackoverflow.com/a/5387310/451475) – zaph

+0

@zaph Dies scheint über die Verwendung eines externen Krypto-Beschleuniger-Peripheriegeräte zu sein, nicht die spezifischen ARMv8-Anweisungen zum Ausführen von AES/SHA auf der CPU selbst. Bemerkenswerterweise stammt es aus der Zeit bevor die ARMv8-Architektur überhaupt angekündigt wurde ... – Notlikethat

Antwort

3

eine optionale Erweiterung zu sein, dann ist es im Allgemeinen Sie unten den Compiler zu sagen, wenn Ihr Ziel die Krypto-Anweisungen implementiert. Bei GCC oder normalem Clang bedeutet dies, dass Sie the +crypto feature modifier zu Ihrer -march oder -mcpu Einstellung hinzufügen.

Es sieht aus wie Apples Version von Clang es bedingungslos ermöglicht, aber das Ziel dort ist implizit "Äpfel CPUs", und ich bezweifle, dass sie Nicht-Crypto-Versionen machen, da sie ihre CPU-Designs gar nicht lizenzieren, geschweige denn Export. Wie für Windows Phone, während ARMv8 die Crypto-Anweisungen auch zu AArch32 hinzufügt, scheint der VS2015 ARM-Compiler immer noch nur ARMv7 zu unterstützen, also denke ich, dass es völlig falsch ist.

Beachten Sie, dass GCC nicht viel mit der Krypto-Funktion macht, außer es an den Assembler weiterzuleiten, seit it doesn't properly support ACLE. Ich habe Clang 4 ausprobiert.8 wie von Arch Linux verpackt, und das kompiliert gerne die Standard-AES-Eigenschaften von arm_acle.h, wenn -march=armv8-a+crypto gegeben ist.