| 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 */
|
|
|