| Index: src/platform-linux.cc
|
| diff --git a/src/platform-linux.cc b/src/platform-linux.cc
|
| index 885683398e24fa36930a3118d2a0c31c1902b770..ef97449b6506d28569b833c930589b26f8c3d6ca 100644
|
| --- a/src/platform-linux.cc
|
| +++ b/src/platform-linux.cc
|
| @@ -80,139 +80,6 @@ static Mutex* limit_mutex = NULL;
|
|
|
|
|
| #ifdef __arm__
|
| -static bool CPUInfoContainsString(const char * search_string) {
|
| - const char* file_name = "/proc/cpuinfo";
|
| - // This is written as a straight shot one pass parser
|
| - // and not using STL string and ifstream because,
|
| - // on Linux, it's reading from a (non-mmap-able)
|
| - // character special device.
|
| - FILE* f = NULL;
|
| - const char* what = search_string;
|
| -
|
| - if (NULL == (f = fopen(file_name, "r"))) {
|
| - OS::PrintError("Failed to open /proc/cpuinfo\n");
|
| - return false;
|
| - }
|
| -
|
| - int k;
|
| - while (EOF != (k = fgetc(f))) {
|
| - if (k == *what) {
|
| - ++what;
|
| - while ((*what != '\0') && (*what == fgetc(f))) {
|
| - ++what;
|
| - }
|
| - if (*what == '\0') {
|
| - fclose(f);
|
| - return true;
|
| - } else {
|
| - what = search_string;
|
| - }
|
| - }
|
| - }
|
| - fclose(f);
|
| -
|
| - // Did not find string in the proc file.
|
| - return false;
|
| -}
|
| -
|
| -
|
| -bool OS::ArmCpuHasFeature(CpuFeature feature) {
|
| - const char* search_string = NULL;
|
| - // Simple detection of VFP at runtime for Linux.
|
| - // It is based on /proc/cpuinfo, which reveals hardware configuration
|
| - // to user-space applications. According to ARM (mid 2009), no similar
|
| - // facility is universally available on the ARM architectures,
|
| - // so it's up to individual OSes to provide such.
|
| - switch (feature) {
|
| - case VFP3:
|
| - search_string = "vfpv3";
|
| - break;
|
| - case NEON:
|
| - search_string = "neon";
|
| - break;
|
| - case ARMv7:
|
| - search_string = "ARMv7";
|
| - break;
|
| - case SUDIV:
|
| - search_string = "idiva";
|
| - break;
|
| - case VFP32DREGS:
|
| - // This case is handled specially below.
|
| - break;
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| -
|
| - if (feature == VFP32DREGS) {
|
| - return ArmCpuHasFeature(VFP3) && !CPUInfoContainsString("d16");
|
| - }
|
| -
|
| - if (CPUInfoContainsString(search_string)) {
|
| - return true;
|
| - }
|
| -
|
| - if (feature == VFP3) {
|
| - // Some old kernels will report vfp not vfpv3. Here we make a last attempt
|
| - // to detect vfpv3 by checking for vfp *and* neon, since neon is only
|
| - // available on architectures with vfpv3.
|
| - // Checking neon on its own is not enough as it is possible to have neon
|
| - // without vfp.
|
| - if (CPUInfoContainsString("vfp") && CPUInfoContainsString("neon")) {
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -
|
| -CpuImplementer OS::GetCpuImplementer() {
|
| - static bool use_cached_value = false;
|
| - static CpuImplementer cached_value = UNKNOWN_IMPLEMENTER;
|
| - if (use_cached_value) {
|
| - return cached_value;
|
| - }
|
| - if (CPUInfoContainsString("CPU implementer\t: 0x41")) {
|
| - cached_value = ARM_IMPLEMENTER;
|
| - } else if (CPUInfoContainsString("CPU implementer\t: 0x51")) {
|
| - cached_value = QUALCOMM_IMPLEMENTER;
|
| - } else {
|
| - cached_value = UNKNOWN_IMPLEMENTER;
|
| - }
|
| - use_cached_value = true;
|
| - return cached_value;
|
| -}
|
| -
|
| -
|
| -CpuPart OS::GetCpuPart(CpuImplementer implementer) {
|
| - static bool use_cached_value = false;
|
| - static CpuPart cached_value = CPU_UNKNOWN;
|
| - if (use_cached_value) {
|
| - return cached_value;
|
| - }
|
| - if (implementer == ARM_IMPLEMENTER) {
|
| - if (CPUInfoContainsString("CPU part\t: 0xc0f")) {
|
| - cached_value = CORTEX_A15;
|
| - } else if (CPUInfoContainsString("CPU part\t: 0xc0c")) {
|
| - cached_value = CORTEX_A12;
|
| - } else if (CPUInfoContainsString("CPU part\t: 0xc09")) {
|
| - cached_value = CORTEX_A9;
|
| - } else if (CPUInfoContainsString("CPU part\t: 0xc08")) {
|
| - cached_value = CORTEX_A8;
|
| - } else if (CPUInfoContainsString("CPU part\t: 0xc07")) {
|
| - cached_value = CORTEX_A7;
|
| - } else if (CPUInfoContainsString("CPU part\t: 0xc05")) {
|
| - cached_value = CORTEX_A5;
|
| - } else {
|
| - cached_value = CPU_UNKNOWN;
|
| - }
|
| - } else {
|
| - cached_value = CPU_UNKNOWN;
|
| - }
|
| - use_cached_value = true;
|
| - return cached_value;
|
| -}
|
| -
|
|
|
| bool OS::ArmUsingHardFloat() {
|
| // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
|
| @@ -255,60 +122,6 @@ bool OS::ArmUsingHardFloat() {
|
| #endif // def __arm__
|
|
|
|
|
| -#ifdef __mips__
|
| -bool OS::MipsCpuHasFeature(CpuFeature feature) {
|
| - const char* search_string = NULL;
|
| - const char* file_name = "/proc/cpuinfo";
|
| - // Simple detection of FPU at runtime for Linux.
|
| - // It is based on /proc/cpuinfo, which reveals hardware configuration
|
| - // to user-space applications. According to MIPS (early 2010), no similar
|
| - // facility is universally available on the MIPS architectures,
|
| - // so it's up to individual OSes to provide such.
|
| - //
|
| - // This is written as a straight shot one pass parser
|
| - // and not using STL string and ifstream because,
|
| - // on Linux, it's reading from a (non-mmap-able)
|
| - // character special device.
|
| -
|
| - switch (feature) {
|
| - case FPU:
|
| - search_string = "FPU";
|
| - break;
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| -
|
| - FILE* f = NULL;
|
| - const char* what = search_string;
|
| -
|
| - if (NULL == (f = fopen(file_name, "r"))) {
|
| - OS::PrintError("Failed to open /proc/cpuinfo\n");
|
| - return false;
|
| - }
|
| -
|
| - int k;
|
| - while (EOF != (k = fgetc(f))) {
|
| - if (k == *what) {
|
| - ++what;
|
| - while ((*what != '\0') && (*what == fgetc(f))) {
|
| - ++what;
|
| - }
|
| - if (*what == '\0') {
|
| - fclose(f);
|
| - return true;
|
| - } else {
|
| - what = search_string;
|
| - }
|
| - }
|
| - }
|
| - fclose(f);
|
| -
|
| - // Did not find string in the proc file.
|
| - return false;
|
| -}
|
| -#endif // def __mips__
|
| -
|
| -
|
| const char* OS::LocalTimezone(double time) {
|
| if (std::isnan(time)) return "";
|
| time_t tv = static_cast<time_t>(floor(time/msPerSecond));
|
|
|