diff --git a/FEXCore/include/FEXCore/Core/HostFeatures.h b/FEXCore/include/FEXCore/Core/HostFeatures.h index d7c5225b3..71e910eb1 100644 --- a/FEXCore/include/FEXCore/Core/HostFeatures.h +++ b/FEXCore/include/FEXCore/Core/HostFeatures.h @@ -84,5 +84,9 @@ struct HostFeatures { // MIDR information // Also used for determining number of CPU cores for CPUID fextl::vector CPUMIDRs; + + // The Linux PID of this process. Useful for punching through perf-top information. + uint32_t ProcessPID {}; + uint32_t pad2 {}; }; } // namespace FEXCore diff --git a/Source/Common/HostFeatures.cpp b/Source/Common/HostFeatures.cpp index e08db9478..858d76d71 100644 --- a/Source/Common/HostFeatures.cpp +++ b/Source/Common/HostFeatures.cpp @@ -633,6 +633,7 @@ FEXCore::HostFeatures FetchHostFeatures() { HostFeatures.SupportsCPUIndexInTPIDRRO = false; HostFeatures.HostType = FEXCore::HostFeatures::HostTypeEnum::Linux; + HostFeatures.ProcessPID = ::getpid(); return HostFeatures; } } // namespace FEX diff --git a/Source/Tools/FEXOfflineCompiler/Main.cpp b/Source/Tools/FEXOfflineCompiler/Main.cpp index e40ecdb64..484aeb8c7 100644 --- a/Source/Tools/FEXOfflineCompiler/Main.cpp +++ b/Source/Tools/FEXOfflineCompiler/Main.cpp @@ -415,7 +415,7 @@ static std::optional GenerateSingleCache(FEXCore::ExecutableFileInf const auto NtDll = GetModuleHandleW(L"ntdll.dll"); const bool IsWine = !!GetProcAddress(NtDll, "wine_get_version"); auto HostFeatures = FEX::Windows::CPUFeatures::FetchHostFeatures( - IsWine, Is64Bit ? FEXCore::HostFeatures::HostTypeEnum::Arm64ec : FEXCore::HostFeatures::HostTypeEnum::Wow64); + IsWine, Is64Bit ? FEXCore::HostFeatures::HostTypeEnum::Arm64ec : FEXCore::HostFeatures::HostTypeEnum::Wow64, 0); #endif auto CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures); diff --git a/Source/Windows/ARM64EC/Module.cpp b/Source/Windows/ARM64EC/Module.cpp index 7b0469257..93a3ab098 100644 --- a/Source/Windows/ARM64EC/Module.cpp +++ b/Source/Windows/ARM64EC/Module.cpp @@ -612,7 +612,8 @@ NTSTATUS ProcessInit() { } { - auto HostFeatures = FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine, FEXCore::HostFeatures::HostTypeEnum::Arm64ec); + auto HostFeatures = + FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine, FEXCore::HostFeatures::HostTypeEnum::Arm64ec, FEX::Windows::UnixLib::GetPID()); CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures); } diff --git a/Source/Windows/Common/CPUFeatures.cpp b/Source/Windows/Common/CPUFeatures.cpp index 034c2ca52..c033db8af 100644 --- a/Source/Windows/Common/CPUFeatures.cpp +++ b/Source/Windows/Common/CPUFeatures.cpp @@ -56,7 +56,7 @@ public: } }; -FEXCore::HostFeatures CPUFeatures::FetchHostFeatures(bool IsWine, FEXCore::HostFeatures::HostTypeEnum HostType) { +FEXCore::HostFeatures CPUFeatures::FetchHostFeatures(bool IsWine, FEXCore::HostFeatures::HostTypeEnum HostType, uint32_t ProcessPID) { HKEY Key = OpenProcessorKey(0); if (!Key) { ERROR_AND_DIE_FMT("Couldn't detect CPU features"); @@ -84,6 +84,7 @@ FEXCore::HostFeatures CPUFeatures::FetchHostFeatures(bool IsWine, FEXCore::HostF HostFeatures.SupportsCPUIndexInTPIDRRO = !IsWine; HostFeatures.HostType = HostType; + HostFeatures.ProcessPID = ProcessPID; if (HostType == FEXCore::HostFeatures::HostTypeEnum::Wow64) { // AVX is unsupported for WOW64 diff --git a/Source/Windows/Common/CPUFeatures.h b/Source/Windows/Common/CPUFeatures.h index 61d93efae..405be0d45 100644 --- a/Source/Windows/Common/CPUFeatures.h +++ b/Source/Windows/Common/CPUFeatures.h @@ -16,7 +16,7 @@ class Context; namespace FEX::Windows { class CPUFeatures { public: - static FEXCore::HostFeatures FetchHostFeatures(bool IsWine, FEXCore::HostFeatures::HostTypeEnum HostType); + static FEXCore::HostFeatures FetchHostFeatures(bool IsWine, FEXCore::HostFeatures::HostTypeEnum HostType, uint32_t ProcessPID); CPUFeatures(FEXCore::Context::Context& CTX); diff --git a/Source/Windows/WOW64/Module.cpp b/Source/Windows/WOW64/Module.cpp index c0ff8d407..8eb1acb86 100644 --- a/Source/Windows/WOW64/Module.cpp +++ b/Source/Windows/WOW64/Module.cpp @@ -527,7 +527,8 @@ void BTCpuProcessInit() { } { - auto HostFeatures = FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine, FEXCore::HostFeatures::HostTypeEnum::Wow64); + auto HostFeatures = + FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine, FEXCore::HostFeatures::HostTypeEnum::Wow64, FEX::Windows::UnixLib::GetPID()); CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures); }