11e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 21e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Redistribution and use in source and binary forms, with or without 31e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// modification, are permitted provided that the following conditions are 41e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// met: 51e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// 61e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Redistributions of source code must retain the above copyright 71e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// notice, this list of conditions and the following disclaimer. 81e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Redistributions in binary form must reproduce the above 91e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// copyright notice, this list of conditions and the following 101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// disclaimer in the documentation and/or other materials provided 111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// with the distribution. 121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Neither the name of Google Inc. nor the names of its 131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// contributors may be used to endorse or promote products derived 141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// from this software without specific prior written permission. 151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// 161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include "cpu.h" 291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 301f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if V8_CC_MSVC 311f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#include <intrin.h> // __cpuid() 321f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif 331f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if V8_OS_POSIX 341f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#include <unistd.h> // sysconf() 351f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif 361f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org 371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include <algorithm> 381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include <cctype> 391f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#include <climits> 401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include <cstdio> 411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include <cstdlib> 421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include <cstring> 431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#include "checks.h" 451f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if V8_OS_WIN 461f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#include "win32-headers.h" 471f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif 481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgnamespace v8 { 501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgnamespace internal { 511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 541f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org// Define __cpuid() for non-MSVC compilers. 551f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if !V8_CC_MSVC 561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 574a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.orgstatic V8_INLINE void __cpuid(int cpu_info[4], int info_type) { 581f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if defined(__i386__) && defined(__pic__) 591f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org // Make sure to preserve ebx, which contains the pointer 601f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org // to the GOT in case we're generating PIC. 611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __asm__ volatile ( 621f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org "mov %%ebx, %%edi\n\t" 631f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org "cpuid\n\t" 641f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org "xchg %%edi, %%ebx\n\t" 651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) 661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org : "a"(info_type) 671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ); 681f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#else 691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __asm__ volatile ( 701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org "cpuid \n\t" 711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) 721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org : "a"(info_type) 731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ); 741f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif // defined(__i386__) && defined(__pic__) 751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 771f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif // !V8_CC_MSVC 781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS 801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HOST_ARCH_ARM 821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// See <uapi/asm/hwcap.h> kernel header. 841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org/* 851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP 861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org */ 871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_SWP (1 << 0) 881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_HALF (1 << 1) 891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_THUMB (1 << 2) 901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_26BIT (1 << 3) /* Play it safe */ 911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_FAST_MULT (1 << 4) 921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_FPA (1 << 5) 931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_VFP (1 << 6) 941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_EDSP (1 << 7) 951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_JAVA (1 << 8) 961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_IWMMXT (1 << 9) 971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_CRUNCH (1 << 10) 981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_THUMBEE (1 << 11) 991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_NEON (1 << 12) 1001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_VFPv3 (1 << 13) 1011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_VFPv3D16 (1 << 14) /* also set for VFPv4-D16 */ 1021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_TLS (1 << 15) 1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_VFPv4 (1 << 16) 1041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_IDIVA (1 << 17) 1051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_IDIVT (1 << 18) 1061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */ 1071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) 1081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define HWCAP_LPAE (1 << 20) 1091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#define AT_HWCAP 16 1111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Read the ELF HWCAP flags by parsing /proc/self/auxv. 1131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic uint32_t ReadELFHWCaps() { 1141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org uint32_t result = 0; 1151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org FILE* fp = fopen("/proc/self/auxv", "r"); 1161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (fp != NULL) { 1171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org struct { uint32_t tag; uint32_t value; } entry; 1181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org for (;;) { 1191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t n = fread(&entry, sizeof(entry), 1, fp); 1201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (n == 0 || (entry.tag == 0 && entry.value == 0)) { 1211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org break; 1221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (entry.tag == AT_HWCAP) { 1241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org result = entry.value; 1251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org break; 1261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org fclose(fp); 1291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return result; 1311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 1321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif // V8_HOST_ARCH_ARM 1341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Extract the information exposed by the kernel via /proc/cpuinfo. 1361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgclass CPUInfo V8_FINAL BASE_EMBEDDED { 1371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org public: 1381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org CPUInfo() : datalen_(0) { 1391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Get the size of the cpuinfo file by reading it until the end. This is 1401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // required because files under /proc do not always return a valid size 1411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // when using fseek(0, SEEK_END) + ftell(). Nor can the be mmap()-ed. 1421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const char PATHNAME[] = "/proc/cpuinfo"; 1431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org FILE* fp = fopen(PATHNAME, "r"); 1441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (fp != NULL) { 1451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org for (;;) { 1461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char buffer[256]; 1471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t n = fread(buffer, 1, sizeof(buffer), fp); 1481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (n == 0) { 1491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org break; 1501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org datalen_ += n; 1521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org fclose(fp); 1541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Read the contents of the cpuinfo file. 1571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org data_ = new char[datalen_ + 1]; 1581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org fp = fopen(PATHNAME, "r"); 1591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (fp != NULL) { 1601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org for (size_t offset = 0; offset < datalen_; ) { 1611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t n = fread(data_ + offset, 1, datalen_ - offset, fp); 1621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (n == 0) { 1631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org break; 1641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org offset += n; 1661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org fclose(fp); 1681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Zero-terminate the data. 1711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org data_[datalen_] = '\0'; 1721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ~CPUInfo() { 1751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] data_; 1761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Extract the content of a the first occurence of a given field in 1791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // the content of the cpuinfo file and return it as a heap-allocated 1801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // string that must be freed by the caller using delete[]. 1811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Return NULL if not found. 1821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* ExtractField(const char* field) const { 1831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ASSERT(field != NULL); 1841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Look for first field occurence, and ensure it starts the line. 1861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t fieldlen = strlen(field); 1871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* p = data_; 1881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org for (;;) { 1891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org p = strstr(p, field); 1901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (p == NULL) { 1911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return NULL; 1921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (p == data_ || p[-1] == '\n') { 1941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org break; 1951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org p += fieldlen; 1971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Skip to the first colon followed by a space. 2001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org p = strchr(p + fieldlen, ':'); 2011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (p == NULL || !isspace(p[1])) { 2021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return NULL; 2031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org p += 2; 2051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Find the end of the line. 2071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* q = strchr(p, '\n'); 2081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (q == NULL) { 2091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org q = data_ + datalen_; 2101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Copy the line into a heap-allocated buffer. 2131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t len = q - p; 2141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* result = new char[len + 1]; 2151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (result != NULL) { 2161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org memcpy(result, p, len); 2171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org result[len] = '\0'; 2181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return result; 2201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org private: 2231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* data_; 2241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org size_t datalen_; 2251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}; 2261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Checks that a space-separated list of items contains one given 'item'. 2291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic bool HasListItem(const char* list, const char* item) { 2301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ssize_t item_len = strlen(item); 2311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org const char* p = list; 2321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (p != NULL) { 2331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org while (*p != '\0') { 2341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Skip whitespace. 2351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org while (isspace(*p)) ++p; 2361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Find end of current list item. 2381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org const char* q = p; 2391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org while (*q != '\0' && !isspace(*q)) ++q; 2401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (item_len == q - p && memcmp(p, item, item_len) == 0) { 2421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return true; 2431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Skip to next item. 2461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org p = q; 2471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 2491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return false; 2501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 2511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 2531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgCPU::CPU() : stepping_(0), 2551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org model_(0), 2561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ext_model_(0), 2571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org family_(0), 2581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ext_family_(0), 2591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org type_(0), 2601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org implementer_(0), 2611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_(0), 2621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org part_(0), 2631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_fpu_(false), 2641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_cmov_(false), 2651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sahf_(false), 2661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_mmx_(false), 2671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse_(false), 2681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse2_(false), 2691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse3_(false), 2701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_ssse3_(false), 2711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse41_(false), 2721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse42_(false), 2731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_idiva_(false), 2741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_neon_(false), 2751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_thumbee_(false), 2761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp_(false), 2771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_(false), 2781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_d32_(false) { 2791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org memcpy(vendor_, "Unknown", 8); 2801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 2811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int cpu_info[4]; 2821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // __cpuid with an InfoType argument of 0 returns the number of 2841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // valid Ids in CPUInfo[0] and the CPU identification string in 2851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // the other three array elements. The CPU identification string is 2861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // not in linear order. The code below arranges the information 2871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // in a human readable form. The human readable order is CPUInfo[1] | 2881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // CPUInfo[3] | CPUInfo[2]. CPUInfo[2] and CPUInfo[3] are swapped 2891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // before using memcpy to copy these three array elements to cpu_string. 2901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __cpuid(cpu_info, 0); 2911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org unsigned num_ids = cpu_info[0]; 2921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org std::swap(cpu_info[2], cpu_info[3]); 2931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org memcpy(vendor_, cpu_info + 1, 12); 2941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org vendor_[12] = '\0'; 2951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Interpret CPU feature information. 2971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (num_ids > 0) { 2981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __cpuid(cpu_info, 1); 2991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org stepping_ = cpu_info[0] & 0xf; 3001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org model_ = ((cpu_info[0] >> 4) & 0xf) + ((cpu_info[0] >> 12) & 0xf0); 3011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org family_ = (cpu_info[0] >> 8) & 0xf; 3021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org type_ = (cpu_info[0] >> 12) & 0x3; 3031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ext_model_ = (cpu_info[0] >> 16) & 0xf; 3041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ext_family_ = (cpu_info[0] >> 20) & 0xff; 3051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_fpu_ = (cpu_info[3] & 0x00000001) != 0; 3061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_cmov_ = (cpu_info[3] & 0x00008000) != 0; 3071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_mmx_ = (cpu_info[3] & 0x00800000) != 0; 3081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse_ = (cpu_info[3] & 0x02000000) != 0; 3091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse2_ = (cpu_info[3] & 0x04000000) != 0; 3101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse3_ = (cpu_info[2] & 0x00000001) != 0; 3111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; 3121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse41_ = (cpu_info[2] & 0x00080000) != 0; 3131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sse42_ = (cpu_info[2] & 0x00100000) != 0; 3141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Query extended IDs. 3171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __cpuid(cpu_info, 0x80000000); 3181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org unsigned num_ext_ids = cpu_info[0]; 3191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Interpret extended CPU feature information. 3211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (num_ext_ids > 0x80000000) { 3221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org __cpuid(cpu_info, 0x80000001); 3231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // SAHF is always available in compat/legacy mode, 3241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // but must be probed in long mode. 3251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HOST_ARCH_IA32 3261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sahf_ = true; 3271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#else 3281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_sahf_ = (cpu_info[2] & 0x00000001) != 0; 3291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif 3301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HOST_ARCH_ARM 3321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org CPUInfo cpu_info; 3331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Extract implementor from the "CPU implementer" field. 3351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* implementer = cpu_info.ExtractField("CPU implementer"); 3361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (implementer != NULL) { 3371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* end ; 3381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org implementer_ = strtol(implementer, &end, 0); 3391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (end == implementer) { 3401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org implementer_ = 0; 3411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] implementer; 3431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Extract part number from the "CPU part" field. 3461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* part = cpu_info.ExtractField("CPU part"); 3471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (part != NULL) { 3481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* end ; 3491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org part_ = strtol(part, &end, 0); 3501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (end == part) { 3511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org part_ = 0; 3521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] part; 3541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Extract architecture from the "CPU Architecture" field. 3571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // The list is well-known, unlike the the output of 3581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // the 'Processor' field which can vary greatly. 3591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // See the definition of the 'proc_arch' array in 3601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // $KERNEL/arch/arm/kernel/setup.c and the 'c_show' function in 3611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // same file. 3621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* architecture = cpu_info.ExtractField("CPU architecture"); 3631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (architecture != NULL) { 3641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* end; 3651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_ = strtol(architecture, &end, 10); 3661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (end == architecture) { 3671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_ = 0; 3681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] architecture; 3701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Unfortunately, it seems that certain ARMv6-based CPUs 3721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // report an incorrect architecture number of 7! 3731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // 3741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // See http://code.google.com/p/android/issues/detail?id=10812 3751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // 3761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // We try to correct this by looking at the 'elf_format' 3771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // field reported by the 'Processor' field, which is of the 3781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // form of "(v7l)" for an ARMv7-based CPU, and "(v6l)" for 3791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // an ARMv6-one. For example, the Raspberry Pi is one popular 3801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // ARMv6 device that reports architecture 7. 3811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (architecture_ == 7) { 3821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* processor = cpu_info.ExtractField("Processor"); 3831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (HasListItem(processor, "(v6l)")) { 3841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_ = 6; 3851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] processor; 3871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 3891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Try to extract the list of CPU features from ELF hwcaps. 3911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org uint32_t hwcaps = ReadELFHWCaps(); 3921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (hwcaps != 0) { 3931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_idiva_ = (hwcaps & HWCAP_IDIVA) != 0; 3941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_neon_ = (hwcaps & HWCAP_NEON) != 0; 3951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_thumbee_ = (hwcaps & HWCAP_THUMBEE) != 0; 3961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp_ = (hwcaps & HWCAP_VFP) != 0; 3971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_ = (hwcaps & (HWCAP_VFPv3 | HWCAP_VFPv3D16 | HWCAP_VFPv4)) != 0; 3981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_d32_ = (has_vfp3_ && ((hwcaps & HWCAP_VFPv3D16) == 0 || 3991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org (hwcaps & HWCAP_VFPD32) != 0)); 4001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } else { 4011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Try to fallback to "Features" CPUInfo field. 4021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* features = cpu_info.ExtractField("Features"); 4031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_idiva_ = HasListItem(features, "idiva"); 4041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_neon_ = HasListItem(features, "neon"); 4051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_thumbee_ = HasListItem(features, "thumbee"); 4061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp_ = HasListItem(features, "vfp"); 4071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (HasListItem(features, "vfpv3")) { 4081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_ = true; 4091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_d32_ = true; 4101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } else if (HasListItem(features, "vfpv3d16")) { 4111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_ = true; 4121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] features; 4141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Some old kernels will report vfp not vfpv3. Here we make an attempt 4171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // to detect vfpv3 by checking for vfp *and* neon, since neon is only 4181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // available on architectures with vfpv3. Checking neon on its own is 4191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // not enough as it is possible to have neon without vfp. 4201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (has_vfp_ && has_neon_) { 4211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_vfp3_ = true; 4221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6. 4251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (architecture_ < 7 && has_vfp3_) { 4261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_ = 7; 4271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // ARMv7 implies ThumbEE. 4301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (architecture_ >= 7) { 4311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_thumbee_ = true; 4321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // The earliest architecture with ThumbEE is ARMv6T2. 4351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (has_thumbee_ && architecture_ < 6) { 4361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org architecture_ = 6; 4371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 4381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // We don't support any FPUs other than VFP. 4401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_fpu_ = has_vfp_; 4411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HOST_ARCH_MIPS 4421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Simple detection of FPU at runtime for Linux. 4431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // It is based on /proc/cpuinfo, which reveals hardware configuration 4441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // to user-space applications. According to MIPS (early 2010), no similar 4451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // facility is universally available on the MIPS architectures, 4461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // so it's up to individual OSes to provide such. 4471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org CPUInfo cpu_info; 4481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char* cpu_model = cpu_info.ExtractField("cpu model"); 4491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org has_fpu_ = HasListItem(cpu_model, "FPU"); 4501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete[] cpu_model; 4511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif 4521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 4531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4541f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org 4551f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org// static 4561f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgint CPU::NumberOfProcessorsOnline() { 4571f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#if V8_OS_WIN 4581f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org SYSTEM_INFO info; 4591f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org GetSystemInfo(&info); 4601f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return info.dwNumberOfProcessors; 4611f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#else 4621f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN)); 4631f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org#endif 4641f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org} 4651f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org 4661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} } // namespace v8::internal 467