Index: platform_tools/android/third_party/cpufeatures/cpu-features.h |
diff --git a/platform_tools/android/third_party/cpufeatures/cpu-features.h b/platform_tools/android/third_party/cpufeatures/cpu-features.h |
index f8553e88d5b943c87ecfa0a8d81ad148aec33399..e86cba882fa70a3b22263a6e16e44650f980e0a9 100644 |
--- a/platform_tools/android/third_party/cpufeatures/cpu-features.h |
+++ b/platform_tools/android/third_party/cpufeatures/cpu-features.h |
@@ -33,21 +33,48 @@ |
__BEGIN_DECLS |
+/* A list of valid values returned by android_getCpuFamily(). |
+ * They describe the CPU Architecture of the current process. |
+ */ |
typedef enum { |
ANDROID_CPU_FAMILY_UNKNOWN = 0, |
ANDROID_CPU_FAMILY_ARM, |
ANDROID_CPU_FAMILY_X86, |
ANDROID_CPU_FAMILY_MIPS, |
+ ANDROID_CPU_FAMILY_ARM64, |
+ ANDROID_CPU_FAMILY_X86_64, |
+ ANDROID_CPU_FAMILY_MIPS64, |
ANDROID_CPU_FAMILY_MAX /* do not remove */ |
} AndroidCpuFamily; |
-/* Return family of the device's CPU */ |
-extern AndroidCpuFamily android_getCpuFamily(void); |
+/* Return the CPU family of the current process. |
+ * |
+ * Note that this matches the bitness of the current process. I.e. when |
+ * running a 32-bit binary on a 64-bit capable CPU, this will return the |
+ * 32-bit CPU family value. |
+ */ |
+extern AndroidCpuFamily android_getCpuFamily(void); |
+ |
+/* Return a bitmap describing a set of optional CPU features that are |
+ * supported by the current device's CPU. The exact bit-flags returned |
+ * depend on the value returned by android_getCpuFamily(). See the |
+ * documentation for the ANDROID_CPU_*_FEATURE_* flags below for details. |
+ * |
+ * NOTE: This will return 0 for the following architectures that don't have |
+ * optional features listed at the moment: |
+ * |
+ * ANDROID_CPU_FAMILY_MIPS |
+ * ANDROID_CPU_FAMILY_ARM64 |
+ * ANDROID_CPU_FAMILY_X86_64 |
+ * ANDROID_CPU_FAMILY_MIPS64 |
+ */ |
+extern uint64_t android_getCpuFeatures(void); |
-/* The list of feature flags for ARM CPUs that can be recognized by the |
- * library. Value details are: |
+/* The list of feature flags for ANDROID_CPU_FAMILY_ARM that can be |
+ * recognized by the library (see note below for 64-bit ARM). Value details |
+ * are: |
* |
* VFPv2: |
* CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs |
@@ -103,6 +130,27 @@ extern AndroidCpuFamily android_getCpuFamily(void); |
* ARM CPU. This is only available on a few XScale-based CPU designs |
* sold by Marvell. Pretty rare in practice. |
* |
+ * AES: |
+ * CPU supports AES instructions. These instructions are only |
+ * available for 32-bit applications running on ARMv8 CPU. |
+ * |
+ * CRC32: |
+ * CPU supports CRC32 instructions. These instructions are only |
+ * available for 32-bit applications running on ARMv8 CPU. |
+ * |
+ * SHA2: |
+ * CPU supports SHA2 instructions. These instructions are only |
+ * available for 32-bit applications running on ARMv8 CPU. |
+ * |
+ * SHA1: |
+ * CPU supports SHA1 instructions. These instructions are only |
+ * available for 32-bit applications running on ARMv8 CPU. |
+ * |
+ * PMULL: |
+ * CPU supports 64-bit PMULL and PMULL2 instructions. These |
+ * instructions are only available for 32-bit applications |
+ * running on ARMv8 CPU. |
+ * |
* If you want to tell the compiler to generate code that targets one of |
* the feature set above, you should probably use one of the following |
* flags (for more details, see technical note at the end of this file): |
@@ -150,6 +198,13 @@ extern AndroidCpuFamily android_getCpuFamily(void); |
* |
* -mcpu=iwmmxt |
* Allows the use of iWMMXt instrinsics with GCC. |
+ * |
+ * IMPORTANT NOTE: These flags should only be tested when |
+ * android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, i.e. this is a |
+ * 32-bit process. |
+ * |
+ * When running a 64-bit ARM process on an ARMv8 CPU, |
+ * android_getCpuFeatures() will return a different set of bitflags |
*/ |
enum { |
ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), |
@@ -164,18 +219,58 @@ enum { |
ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), |
ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), |
ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), |
+ ANDROID_CPU_ARM_FEATURE_AES = (1 << 12), |
+ ANDROID_CPU_ARM_FEATURE_PMULL = (1 << 13), |
+ ANDROID_CPU_ARM_FEATURE_SHA1 = (1 << 14), |
+ ANDROID_CPU_ARM_FEATURE_SHA2 = (1 << 15), |
+ ANDROID_CPU_ARM_FEATURE_CRC32 = (1 << 16), |
}; |
+/* The bit flags corresponding to the output of android_getCpuFeatures() |
+ * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM64. Value details |
+ * are: |
+ * |
+ * FP: |
+ * CPU has Floating-point unit. |
+ * |
+ * ASIMD: |
+ * CPU has Advanced SIMD unit. |
+ * |
+ * AES: |
+ * CPU supports AES instructions. |
+ * |
+ * CRC32: |
+ * CPU supports CRC32 instructions. |
+ * |
+ * SHA2: |
+ * CPU supports SHA2 instructions. |
+ * |
+ * SHA1: |
+ * CPU supports SHA1 instructions. |
+ * |
+ * PMULL: |
+ * CPU supports 64-bit PMULL and PMULL2 instructions. |
+ */ |
+enum { |
+ ANDROID_CPU_ARM64_FEATURE_FP = (1 << 0), |
+ ANDROID_CPU_ARM64_FEATURE_ASIMD = (1 << 1), |
+ ANDROID_CPU_ARM64_FEATURE_AES = (1 << 2), |
+ ANDROID_CPU_ARM64_FEATURE_PMULL = (1 << 3), |
+ ANDROID_CPU_ARM64_FEATURE_SHA1 = (1 << 4), |
+ ANDROID_CPU_ARM64_FEATURE_SHA2 = (1 << 5), |
+ ANDROID_CPU_ARM64_FEATURE_CRC32 = (1 << 6), |
+}; |
+/* The bit flags corresponding to the output of android_getCpuFeatures() |
+ * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_X86. |
+ */ |
enum { |
ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), |
ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), |
ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), |
}; |
-extern uint64_t android_getCpuFeatures(void); |
- |
/* Return the number of CPU cores detected on this device. */ |
-extern int android_getCpuCount(void); |
+extern int android_getCpuCount(void); |
/* The following is used to force the CPU count and features |
* mask in sandboxed processes. Under 4.1 and higher, these processes |
@@ -190,6 +285,21 @@ extern int android_getCpuCount(void); |
extern int android_setCpu(int cpu_count, |
uint64_t cpu_features); |
+#ifdef __arm__ |
+/* Retrieve the ARM 32-bit CPUID value from the kernel. |
+ * Note that this cannot work on sandboxed processes under 4.1 and |
+ * higher, unless you called android_setCpuArm() before. |
+ */ |
+extern uint32_t android_getCpuIdArm(void); |
+ |
+/* An ARM-specific variant of android_setCpu() that also allows you |
+ * to set the ARM CPUID field. |
+ */ |
+extern int android_setCpuArm(int cpu_count, |
+ uint64_t cpu_features, |
+ uint32_t cpu_id); |
+#endif |
+ |
__END_DECLS |
#endif /* CPU_FEATURES_H */ |