1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #define __STDC_FORMAT_MACROS 1 17 18 #include <cpu-features.h> 19 #include <inttypes.h> 20 #include <stdio.h> 21 22 int main(void) 23 { 24 AndroidCpuFamily family = android_getCpuFamily(); 25 switch (family) { 26 case ANDROID_CPU_FAMILY_ARM: 27 printf("CPU family is ARM\n"); 28 break; 29 case ANDROID_CPU_FAMILY_X86: 30 printf("CPU family is x86\n"); 31 break; 32 case ANDROID_CPU_FAMILY_MIPS: 33 printf("CPU family is MIPS\n"); 34 break; 35 case ANDROID_CPU_FAMILY_ARM64: 36 printf("CPU family is ARM64\n"); 37 break; 38 case ANDROID_CPU_FAMILY_X86_64: 39 printf("CPU family is x86_64\n"); 40 break; 41 case ANDROID_CPU_FAMILY_MIPS64: 42 printf("CPU family is MIPS64\n"); 43 break; 44 default: 45 fprintf(stderr, "Unsupported CPU family: %d\n", family); 46 return 1; 47 } 48 49 if (family == ANDROID_CPU_FAMILY_ARM) { 50 uint64_t features = android_getCpuFeatures(); 51 printf( "Supported ARM features:\n"); 52 #define CHECK(name) \ 53 if ((features & ANDROID_CPU_ARM_FEATURE_## name) != 0) { \ 54 printf( " "#name"\n" ); \ 55 } 56 CHECK(LDREX_STREX) 57 CHECK(VFPv2) 58 CHECK(ARMv7) 59 CHECK(VFPv3) 60 CHECK(VFP_D32) 61 CHECK(VFP_FP16) 62 CHECK(VFP_FMA) 63 CHECK(NEON) 64 CHECK(NEON_FMA) 65 CHECK(IDIV_ARM) 66 CHECK(IDIV_THUMB2) 67 CHECK(iWMMXt) 68 #undef CHECK 69 } 70 71 #ifdef __arm__ 72 uint32_t cpu_id = android_getCpuIdArm(); 73 printf( "ARM CpuID: %08x\n", cpu_id); 74 printf( " implementer: %02x\n", (cpu_id >> 24) & 0xff); 75 printf( " variant : %02x\n", (cpu_id >> 20) & 0x0f); 76 printf( " part : %03x\n", (cpu_id >> 4) & 0xfff); 77 printf( " revision : %x\n", cpu_id & 0x0f); 78 #endif 79 80 if (family == ANDROID_CPU_FAMILY_X86) { 81 uint64_t features = android_getCpuFeatures(); 82 printf( "Supported x86 features:\n"); 83 #define CHECK(name) \ 84 if ((features & ANDROID_CPU_X86_FEATURE_## name) != 0) { \ 85 printf( " "#name"\n" ); \ 86 } 87 CHECK(SSSE3) 88 CHECK(POPCNT) 89 CHECK(MOVBE) 90 #undef CHECK 91 } 92 93 int result = 0; 94 95 // Check that the CPU features mask is empty for anything that isn't 96 // 32-bit ARM or 32-bit x86. 97 if (family != ANDROID_CPU_FAMILY_ARM && 98 family != ANDROID_CPU_FAMILY_X86) { 99 uint64_t features = android_getCpuFeatures(); 100 if (features != 0) { 101 printf("ERROR: Unexpected CPU features mask: %016" PRIX64 "\n", 102 features); 103 result = 1; 104 } 105 } 106 107 int count = android_getCpuCount(); 108 printf( "Number of CPU cores: %d\n", count); 109 return result; 110 } 111