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