From d9a3741fcbb51fbd9f5ff82b70ed93314c798ab1 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Wed, 28 Jul 2021 21:58:56 +1000 Subject: [PATCH] RISC-V CPU detect --- CMakeLists.txt | 1 + Common/Common.vcxproj | 1 + Common/Common.vcxproj.filters | 1 + Common/FakeCPUDetect.cpp | 2 + Common/RiscVCPUDetect.cpp | 121 ++++++++++++++++++++++++++++++++++ UI/DevScreens.cpp | 2 + libretro/Makefile.common | 1 + ppsspp_config.h | 5 ++ 8 files changed, 134 insertions(+) create mode 100644 Common/RiscVCPUDetect.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ef5e97ed41..07ba91f5c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,6 +430,7 @@ set(CommonMIPS source_group(MIPS FILES ${CommonMIPS}) set(CommonRISCV64 + Common/RiscVCPUDetect.cpp Core/MIPS/fake/FakeJit.cpp Core/MIPS/fake/FakeJit.h ) diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index 5bc0e2ab83..ef63de1054 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -898,6 +898,7 @@ + diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 58ca55dbbf..ddfbebd6e3 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -777,6 +777,7 @@ Thread + diff --git a/Common/FakeCPUDetect.cpp b/Common/FakeCPUDetect.cpp index 9b1469c21c..3bdaeabbcd 100644 --- a/Common/FakeCPUDetect.cpp +++ b/Common/FakeCPUDetect.cpp @@ -22,6 +22,8 @@ #define REAL_CPUDETECT_AVAIL 1 #elif PPSSPP_ARCH(MIPS) || PPSSPP_ARCH(MIPS64) #define REAL_CPUDETECT_AVAIL 1 +#elif PPSSPP_ARCH(RISCV64) +#define REAL_CPUDETECT_AVAIL 1 #endif #ifndef REAL_CPUDETECT_AVAIL diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp new file mode 100644 index 0000000000..28be934fd2 --- /dev/null +++ b/Common/RiscVCPUDetect.cpp @@ -0,0 +1,121 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "ppsspp_config.h" +#if PPSSPP_ARCH(RISCV64) + +#include "Common/Common.h" +#include "Common/CPUDetect.h" +#include "Common/StringUtils.h" +#include "Common/File/FileUtil.h" +#include "Common/Data/Encoding/Utf8.h" +#include +#include + +// Only Linux platforms have /proc/cpuinfo +#if defined(__linux__) +const char procfile[] = "/proc/cpuinfo"; +// https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu +const char syscpupresentfile[] = "/sys/devices/system/cpu/present"; + +std::string GetCPUString() { + std::string cpu_string = "Unknown"; + + return cpu_string; +} + +int GetCoreCount() +{ + std::string line, marker = "processor\t: "; + int cores = 1; + + std::string presentData; + bool presentSuccess = File::ReadFileToString(true, syscpupresentfile, presentData); + std::istringstream presentFile(presentData); + + if (presentSuccess) { + int low, high, found; + std::getline(presentFile, line); + found = sscanf(line.c_str(), "%d-%d", &low, &high); + if (found == 1) + return 1; + if (found == 2) + return high - low + 1; + } + + std::string procdata; + if (!File::ReadFileToString(true, procfile, procdata)) + return 1; + std::istringstream file(procdata); + + while (std::getline(file, line)) + { + if (line.find(marker) != std::string::npos) + ++cores; + } + + return cores; +} +#endif + +CPUInfo cpu_info; + +CPUInfo::CPUInfo() { + Detect(); +} + +// Detects the various cpu features +void CPUInfo::Detect() +{ + // Set some defaults here + HTT = false; +#if PPSSPP_ARCH(RISCV64) + OS64bit = true; + CPU64bit = true; + Mode64bit = true; +#else + OS64bit = false; + CPU64bit = false; + Mode64bit = false; +#endif + vendor = VENDOR_OTHER; + logical_cpu_count = 1; + + // Get the information about the CPU +#if !defined(__linux__) + num_cores = 1; +#else // __linux__ + strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string)); + unsigned short CPUPart = GetCPUPart(); + num_cores = GetCoreCount(); +#endif +} + +// Turn the cpu info into a string we can show +std::string CPUInfo::Summarize() +{ + std::string sum; + if (num_cores == 1) + sum = StringFromFormat("%s, %i core", cpu_string, num_cores); + else + sum = StringFromFormat("%s, %i cores", cpu_string, num_cores); + if (CPU64bit) sum += ", 64-bit"; + + return sum; +} + +#endif // PPSSPP_ARCH(RISCV64) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 735ae47928..89fceb30bd 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -423,6 +423,8 @@ const char *GetCompilerABI() { return "x86"; #elif PPSSPP_ARCH(AMD64) return "x86-64"; +#elif PPSSPP_ARCH(RISCV64) + return "rv64"; #else return "other"; #endif diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 77fd240274..a80ff92847 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -300,6 +300,7 @@ SOURCES_CXX += \ $(COMMONDIR)/OSVersion.cpp \ $(COMMONDIR)/MemoryUtil.cpp \ $(COMMONDIR)/MipsCPUDetect.cpp \ + $(COMMONDIR)/RiscVCPUDetect.cpp \ $(COMMONDIR)/LogReporting.cpp \ $(COMMONDIR)/SysError.cpp \ $(COMMONDIR)/StringUtils.cpp \ diff --git a/ppsspp_config.h b/ppsspp_config.h index 5725778144..91f0ffb854 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -64,6 +64,11 @@ #define PPSSPP_ARCH_32BIT 1 #endif +#if defined(__riscv64__) + #define PPSSPP_ARCH_RISCV64 1 + #define PPSSPP_ARCH_64BIT 1 +#endif + // PLATFORM defines #if defined(_WIN32)