Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

122 lines
2.6 KiB
C++
Raw Permalink Normal View History

// Copyright 2013 Dolphin Emulator Project
2015-05-18 01:08:10 +02:00
// Licensed under GPLv2+
2014-02-17 05:18:15 -05:00
// Refer to the license.txt file included.
2013-02-26 13:49:00 -06:00
2017-04-21 11:03:40 +01:00
#include <cstring>
2014-06-02 19:27:50 -04:00
#include <fstream>
#include <sstream>
#include <string>
2019-11-26 15:31:45 +11:00
#include <thread>
#ifndef _WIN32
#include <asm/hwcap.h>
2015-06-13 07:29:19 -05:00
#include <sys/auxv.h>
#include <unistd.h>
2019-11-26 15:31:45 +11:00
#endif
2014-06-02 19:27:50 -04:00
2019-06-14 10:53:46 -04:00
#include <fmt/format.h>
2014-02-17 05:18:15 -05:00
#include "Common/CPUDetect.h"
2014-09-07 20:06:58 -05:00
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
2013-02-26 13:49:00 -06:00
2019-11-26 15:31:45 +11:00
#ifndef WIN32
2013-02-26 13:49:00 -06:00
const char procfile[] = "/proc/cpuinfo";
2014-09-22 17:45:42 -04:00
static std::string GetCPUString()
2013-02-26 13:49:00 -06:00
{
2014-06-02 19:27:50 -04:00
const std::string marker = "Hardware\t: ";
std::string cpu_string = "Unknown";
2013-02-26 13:49:00 -06:00
2014-06-02 19:27:50 -04:00
std::string line;
std::ifstream file;
File::OpenFStream(file, procfile, std::ios_base::in);
2014-06-02 19:27:50 -04:00
if (!file)
return cpu_string;
while (std::getline(file, line))
2013-02-26 13:49:00 -06:00
{
2014-06-02 19:27:50 -04:00
if (line.find(marker) != std::string::npos)
{
cpu_string = line.substr(marker.length());
break;
}
2013-02-26 13:49:00 -06:00
}
2014-06-02 19:27:50 -04:00
return cpu_string;
2013-02-26 13:49:00 -06:00
}
2019-11-26 15:31:45 +11:00
#endif
2013-02-26 13:49:00 -06:00
CPUInfo cpu_info;
2014-06-02 19:27:50 -04:00
CPUInfo::CPUInfo()
{
2013-02-26 13:49:00 -06:00
Detect();
}
2015-01-11 00:17:29 -05:00
// Detects the various CPU features
2013-02-26 13:49:00 -06:00
void CPUInfo::Detect()
{
// Set some defaults here
2015-01-11 00:17:29 -05:00
// When ARMv8 CPUs come out, these need to be updated.
2013-02-26 13:49:00 -06:00
HTT = false;
OS64bit = true;
CPU64bit = true;
Mode64bit = true;
vendor = CPUVendor::ARM;
2019-11-26 15:31:45 +11:00
#ifdef _WIN32
num_cores = std::thread::hardware_concurrency();
// Windows does not provide any mechanism for querying the system registers on ARMv8, unlike Linux
// which traps the register reads and emulates them in the kernel. There are environment variables
// containing some of the CPU-specific values, which we could use for a lookup table in the
// future. For now, assume all features are present as all known devices which are Windows-on-ARM
// compatible also support these extensions.
bFP = true;
bASIMD = true;
bAES = true;
bCRC32 = true;
bSHA1 = true;
bSHA2 = true;
#else
// Get the information about the CPU
2015-06-13 07:29:19 -05:00
num_cores = sysconf(_SC_NPROCESSORS_CONF);
strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string));
2015-06-13 07:29:19 -05:00
unsigned long hwcaps = getauxval(AT_HWCAP);
bFP = hwcaps & HWCAP_FP;
bASIMD = hwcaps & HWCAP_ASIMD;
bAES = hwcaps & HWCAP_AES;
bCRC32 = hwcaps & HWCAP_CRC32;
bSHA1 = hwcaps & HWCAP_SHA1;
bSHA2 = hwcaps & HWCAP_SHA2;
2019-11-26 15:31:45 +11:00
#endif
2013-02-26 13:49:00 -06:00
}
2015-01-11 00:17:29 -05:00
// Turn the CPU info into a string we can show
2013-02-26 13:49:00 -06:00
std::string CPUInfo::Summarize()
{
std::string sum;
if (num_cores == 1)
2019-06-14 10:53:46 -04:00
sum = fmt::format("{}, 1 core", cpu_string);
2013-02-26 13:49:00 -06:00
else
2019-06-14 10:53:46 -04:00
sum = fmt::format("{}, {} cores", cpu_string, num_cores);
2015-06-13 07:29:19 -05:00
if (bAES)
sum += ", AES";
if (bCRC32)
sum += ", CRC32";
if (bSHA1)
sum += ", SHA1";
if (bSHA2)
sum += ", SHA2";
if (CPU64bit)
sum += ", 64-bit";
2013-02-26 13:49:00 -06:00
return sum;
}