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)