mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-14 09:00:40 +02:00
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:
1 parent
e97b18e244
commit
ec13e5d503
2 files changed
+24
No files matched your search
@@ -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];
|
||||
|
||||
|
||||
Reference in new issue
Block a user