From 2f16d25ab8c7bf642d926d35235f9111cf6bc891 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Mon, 14 Jul 2025 21:20:03 +0100 Subject: [PATCH] ARM64EC: Implement call-ret stack management --- Source/Windows/ARM64EC/Module.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Windows/ARM64EC/Module.cpp b/Source/Windows/ARM64EC/Module.cpp index 0d1fdd4bc..190e0eff0 100644 --- a/Source/Windows/ARM64EC/Module.cpp +++ b/Source/Windows/ARM64EC/Module.cpp @@ -27,6 +27,7 @@ $end_info$ #include #include "Common/ArgumentLoader.h" +#include "Common/CallRetStack.h" #include "Common/Config.h" #include "Common/Exception.h" #include "Common/InvalidationTracker.h" @@ -705,6 +706,10 @@ bool ResetToConsistentStateImpl(EXCEPTION_RECORD* Exception, CONTEXT* GuestConte if (Exception->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { const auto FaultAddress = static_cast(Exception->ExceptionInformation[1]); + if (FEX::Windows::CallRetStack::HandleAccessViolation(Thread, FaultAddress, NativeContext->X17)) { + return true; + } + std::scoped_lock Lock(ThreadCreationMutex); if (InvalidationTracker && InvalidationTracker->HandleRWXAccessViolation(FaultAddress)) { FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSMCCount, 1); @@ -899,6 +904,8 @@ NTSTATUS ThreadInit() { const auto CPUArea = GetCPUArea(); auto* Thread = CTX->CreateThread(0, 0); + + FEX::Windows::CallRetStack::InitializeThread(Thread); Thread->CurrentFrame->Pointers.Common.ExitFunctionEC = reinterpret_cast(&ExitFunctionEC); CPUArea.StateFrame() = Thread->CurrentFrame; @@ -957,6 +964,7 @@ NTSTATUS ThreadTerm(HANDLE Thread, LONG ExitCode) { } } + FEX::Windows::CallRetStack::DestroyThread(OldThreadState); CTX->DestroyThread(OldThreadState); ::VirtualFree(reinterpret_cast(CPUArea.EmulatorStackLimit()), 0, MEM_RELEASE); if (ThreadTID == GetCurrentThreadId()) {