mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-14 16:00:44 +02:00
ARM64EC: Merge EFlags with the current JIT flags state on a ctx sync
Only NZCV and TF are passed through to BeginSimulation as the rest are lost when converting to a native context and back on the ntdll side. To prevent thread suspension from wiping out the rest of the flags, only copy these specific flags into the current JIT EFlags state.
This commit is contained in:
1 parent
507a95b817
commit
3c32271dd0
1 file changed
+8
@@ -433,6 +433,14 @@ public:
|
||||
|
||||
extern "C" void SyncThreadContext(CONTEXT* Context) {
|
||||
auto* Thread = GetCPUArea().ThreadState();
|
||||
// All other EFlags bits are lost when converting to/from an ARM64EC context, so merge them in from the current JIT state.
|
||||
// This is advisable over dropping their values as thread suspend/resume uses this function, and that can happen at any point in guest code.
|
||||
static constexpr uint32_t ECValidEFlagsMask {(1U << FEXCore::X86State::RFLAG_OF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_CF_RAW_LOC) |
|
||||
(1U << FEXCore::X86State::RFLAG_ZF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_SF_RAW_LOC) |
|
||||
(1U << FEXCore::X86State::RFLAG_TF_LOC)};
|
||||
|
||||
uint32_t StateEFlags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);
|
||||
Context->EFlags = (Context->EFlags & ECValidEFlagsMask) | (StateEFlags & ~ECValidEFlagsMask);
|
||||
Exception::LoadStateFromECContext(Thread, *Context);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user