Windows: Use FrontendPtr for extra TLS space on WOW64/ARM64EC

We have run out of EmulatorData slots on ARM64EC, so introduce this for
less-frequently accessed TLS data for which the additional cost doesn't
matter.
This commit is contained in:
Billy Laws committed 2026-01-05 02:29:34 +00:00
1 parent e97b18e244
commit ec13e5d503
2 files changed
+24

No files matched your search

+12
View File
@@ -107,6 +107,10 @@ struct TLS {
}
};
struct FrontendThreadData {
bool InLockedRWXRead {};
};
class WowSyscallHandler;
namespace {
@@ -142,6 +146,10 @@ TLS GetTLS() {
return TLS {NtCurrentTeb()};
}
FrontendThreadData* GetFrontendThreadData(FEXCore::Core::InternalThreadState* Thread) {
return static_cast<FrontendThreadData*>(Thread->FrontendPtr);
}
uint64_t GetWowTEB(void* TEB) {
static constexpr size_t WowTEBOffsetMemberOffset {0x180c};
return static_cast<uint64_t>(
@@ -595,6 +603,8 @@ void BTCpuThreadInit() {
TLS.ThreadState() = Thread;
TLS.ControlWord().fetch_or(ControlBits::WOW_CPU_AREA_DIRTY, std::memory_order::relaxed);
Thread->FrontendPtr = new FrontendThreadData();
auto ThreadTID = GetCurrentThreadId();
Threads.emplace(ThreadTID, Thread);
if (StatAllocHandler) {
@@ -641,6 +651,8 @@ void BTCpuThreadTerm(HANDLE Thread, LONG ExitCode) {
}
auto ThreadState = TLS.ThreadState();
delete GetFrontendThreadData(ThreadState);
// GDT and LDT are mirrored, only free one.
delete[] ThreadState->CurrentFrame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT];