12ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner/* 22ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * Copyright (C) 2010 The Android Open Source Project 32ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * All rights reserved. 42ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * 52ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 62ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * modification, are permitted provided that the following conditions 72ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * are met: 82ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * * Redistributions of source code must retain the above copyright 92ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 102ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * * Redistributions in binary form must reproduce the above copyright 112ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * notice, this list of conditions and the following disclaimer in 122ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * the documentation and/or other materials provided with the 132ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * distribution. 142ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * 152ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 182ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 192ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 202ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 212ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 222ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 232ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 242ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 252ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 262ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner * SUCH DAMAGE. 272ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner */ 282ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner#ifndef CPU_FEATURES_H 292ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner#define CPU_FEATURES_H 302ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 312ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner#include <sys/cdefs.h> 322ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner#include <stdint.h> 332ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 342ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner__BEGIN_DECLS 352ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 362ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turnertypedef enum { 372ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner ANDROID_CPU_FAMILY_UNKNOWN = 0, 382ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner ANDROID_CPU_FAMILY_ARM, 392ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner ANDROID_CPU_FAMILY_X86, 40097812d190ebd3539c82c9c2b24161ae5e75cbb8Chao-Ying Fu ANDROID_CPU_FAMILY_MIPS, 412ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 422ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner ANDROID_CPU_FAMILY_MAX /* do not remove */ 432ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 442ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner} AndroidCpuFamily; 452ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 462ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner/* Return family of the device's CPU */ 472ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turnerextern AndroidCpuFamily android_getCpuFamily(void); 482ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 4996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner/* The list of feature flags for ARM CPUs that can be recognized by the 5096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * library. Value details are: 5196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 5296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * VFPv2: 5396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs 5496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * support these instructions. VFPv2 is a subset of VFPv3 so this will 5596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * be set whenever VFPv3 is set too. 5696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 5796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * ARMv7: 5896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * CPU supports the ARMv7-A basic instruction set. 5996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * This feature is mandated by the 'armeabi-v7a' ABI. 6096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 6196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * VFPv3: 6296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * CPU supports the VFPv3-D16 instruction set, providing hardware FPU 6396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * support for single and double precision floating point registers. 6496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Note that only 16 FPU registers are available by default, unless 6596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * the D32 bit is set too. This feature is also mandated by the 6696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 'armeabi-v7a' ABI. 6796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 6896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * VFP_D32: 6996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * CPU VFP optional extension that provides 32 FPU registers, 7096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * instead of 16. Note that ARM mandates this feature is the 'NEON' 7196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * feature is implemented by the CPU. 7296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 7396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * NEON: 7496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * CPU FPU supports "ARM Advanced SIMD" instructions, also known as 7596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * NEON. Note that this mandates the VFP_D32 feature as well, per the 7696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * ARM Architecture specification. 7796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 7896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * VFP_FP16: 7996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Half-width floating precision VFP extension. If set, the CPU 8096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * supports instructions to perform floating-point operations on 8196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 16-bit registers. This is part of the VFPv4 specification, but 8296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * not mandated by any Android ABI. 8396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 8496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * VFP_FMA: 8596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Fused multiply-accumulate VFP instructions extension. Also part of 8696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * the VFPv4 specification, but not mandated by any Android ABI. 8796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 8896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * NEON_FMA: 8996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Fused multiply-accumulate NEON instructions extension. Optional 9096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * extension from the VFPv4 specification, but not mandated by any 9196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Android ABI. 9296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 9396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * IDIV_ARM: 9496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Integer division available in ARM mode. Only available 9596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * on recent CPUs (e.g. Cortex-A15). 9696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 9796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * IDIV_THUMB2: 9896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Integer division available in Thumb-2 mode. Only available 9996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * on recent CPUs (e.g. Cortex-A15). 10096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 10196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * iWMMXt: 10296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Optional extension that adds MMX registers and operations to an 10396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * ARM CPU. This is only available on a few XScale-based CPU designs 10496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * sold by Marvell. Pretty rare in practice. 10596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 10696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * If you want to tell the compiler to generate code that targets one of 10796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * the feature set above, you should probably use one of the following 10896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * flags (for more details, see technical note at the end of this file): 10996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 11096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfp 11196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfpv2 11296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * These are equivalent and tell GCC to use VFPv2 instructions for 11396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * floating-point operations. Use this if you want your code to 11496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * run on *some* ARMv6 devices, and any ARMv7-A device supported 11596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * by Android. 11696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 11796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv2 feature. 11896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 11996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfpv3-d16 12096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Tell GCC to use VFPv3 instructions (using only 16 FPU registers). 12196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * This should be generic code that runs on any CPU that supports the 12296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 'armeabi-v7a' Android ABI. Note that no ARMv6 CPU supports this. 12396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 12496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3 feature. 12596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 12696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfpv3 12796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Tell GCC to use VFPv3 instructions with 32 FPU registers. 12896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_D32 features. 12996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 13096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=neon 13196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Tell GCC to use VFPv3 instructions with 32 FPU registers, and 13296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * also support NEON intrinsics (see <arm_neon.h>). 13396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_D32|NEON features. 13496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 13596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfpv4-d16 13696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_FP16|VFP_FMA features. 13796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 13896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=vfpv4 13996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32 features. 14096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 14196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mfpu=neon-vfpv4 14296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32|NEON|NEON_FMA 14396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * features. 14496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 14596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mcpu=cortex-a7 14696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mcpu=cortex-a15 14796ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32| 14896ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * NEON|NEON_FMA|IDIV_ARM|IDIV_THUMB2 14996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * This flag implies -mfpu=neon-vfpv4. 15096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * 15196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * -mcpu=iwmmxt 15296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner * Allows the use of iWMMXt instrinsics with GCC. 15396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner */ 1542ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turnerenum { 1557a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), 1567a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_VFPv3 = (1 << 1), 1577a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_NEON = (1 << 2), 1587a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_LDREX_STREX = (1 << 3), 15996ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_VFPv2 = (1 << 4), 16096ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_VFP_D32 = (1 << 5), 16196ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_VFP_FP16 = (1 << 6), 16296ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_VFP_FMA = (1 << 7), 16396ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_NEON_FMA = (1 << 8), 16496ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), 16596ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), 16696ef8f7d9490fb4a2481f1eab0b08ab16b90d476David 'Digit' Turner ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), 1672ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner}; 1682ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 169966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turnerenum { 170966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turner ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), 171966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turner ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), 172966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turner ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), 173966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turner}; 174966161e450fe3abfb13698e8bd6d63cf35eccf0fDavid 'Digit' Turner 1752ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turnerextern uint64_t android_getCpuFeatures(void); 1762ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 1777a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner/* Return the number of CPU cores detected on this device. */ 1787a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turnerextern int android_getCpuCount(void); 1797a6b7eabd10b7dc6899ac9cc08069c23d254d479David 'Digit' Turner 1805049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner/* The following is used to force the CPU count and features 1815049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * mask in sandboxed processes. Under 4.1 and higher, these processes 1825049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * cannot access /proc, which is the only way to get information from 1835049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * the kernel about the current hardware (at least on ARM). 1845049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * 1855049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * It _must_ be called only once, and before any android_getCpuXXX 1865049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * function, any other case will fail. 1875049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * 1885049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner * This function return 1 on success, and 0 on failure. 1895049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner */ 1905049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turnerextern int android_setCpu(int cpu_count, 1915049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner uint64_t cpu_features); 1925049b437591600fb0d262e4215cee4226e63c6ceDavid 'Digit' Turner 1937f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#ifdef __arm__ 1947f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner/* Retrieve the ARM 32-bit CPUID value from the kernel. 1957f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner * Note that this cannot work on sandboxed processes under 4.1 and 1967f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner * higher, unless you called android_setCpuArm() before. 1977f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner */ 1987f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turnerextern uint32_t android_getCpuIdArm(void); 1997f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 2007f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner/* An ARM-specific variant of android_setCpu() that also allows you 2017f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner * to set the ARM CPUID field. 2027f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner */ 2037f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turnerextern int android_setCpuArm(int cpu_count, 2047f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner uint64_t cpu_features, 2057f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner uint32_t cpu_id); 2067f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#endif 2077f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 2082ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner__END_DECLS 2092ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner 2102ffd1df9f0b32978ebe70d8268c0a38dea1cfc07David 'Digit' Turner#endif /* CPU_FEATURES_H */ 211