diff --git a/External/FEXCore/Source/Interface/Context/Context.cpp b/External/FEXCore/Source/Interface/Context/Context.cpp index 883043b0e..5a0b8bee8 100644 --- a/External/FEXCore/Source/Interface/Context/Context.cpp +++ b/External/FEXCore/Source/Interface/Context/Context.cpp @@ -99,6 +99,10 @@ namespace FEXCore::Context { CTX->HandleCallback(RIP); } + void RegisterHostSignalHandler(FEXCore::Context::Context *CTX, int Signal, HostSignalDelegatorFunction Func) { + CTX->RegisterHostSignalHandler(Signal, Func); + } + void RegisterFrontendHostSignalHandler(FEXCore::Context::Context *CTX, int Signal, HostSignalDelegatorFunction Func) { CTX->RegisterFrontendHostSignalHandler(Signal, Func); } diff --git a/External/FEXCore/Source/Interface/Context/Context.h b/External/FEXCore/Source/Interface/Context/Context.h index be4f26bf6..e71856156 100644 --- a/External/FEXCore/Source/Interface/Context/Context.h +++ b/External/FEXCore/Source/Interface/Context/Context.h @@ -117,6 +117,7 @@ namespace FEXCore::Context { void StartGdbServer(); void StopGdbServer(); void HandleCallback(uint64_t RIP); + void RegisterHostSignalHandler(int Signal, HostSignalDelegatorFunction Func); void RegisterFrontendHostSignalHandler(int Signal, HostSignalDelegatorFunction Func); static void RemoveCodeEntry(FEXCore::Core::InternalThreadState *Thread, uint64_t GuestRIP); diff --git a/External/FEXCore/Source/Interface/Core/Core.cpp b/External/FEXCore/Source/Interface/Core/Core.cpp index 4ace67d86..f13d83d72 100644 --- a/External/FEXCore/Source/Interface/Core/Core.cpp +++ b/External/FEXCore/Source/Interface/Core/Core.cpp @@ -286,6 +286,10 @@ namespace FEXCore::Context { Thread->CPUBackend->CallbackPtr(Thread, RIP); } + void Context::RegisterHostSignalHandler(int Signal, HostSignalDelegatorFunction Func) { + SignalDelegation->RegisterHostSignalHandler(Signal, Func); + } + void Context::RegisterFrontendHostSignalHandler(int Signal, HostSignalDelegatorFunction Func) { SignalDelegation->RegisterFrontendHostSignalHandler(Signal, Func); } diff --git a/External/FEXCore/include/FEXCore/Core/Context.h b/External/FEXCore/include/FEXCore/Core/Context.h index 2e9f00352..eecdef535 100644 --- a/External/FEXCore/include/FEXCore/Core/Context.h +++ b/External/FEXCore/include/FEXCore/Core/Context.h @@ -218,6 +218,7 @@ namespace FEXCore::Context { void HandleCallback(FEXCore::Context::Context *CTX, uint64_t RIP); + void RegisterHostSignalHandler(FEXCore::Context::Context *CTX, int Signal, HostSignalDelegatorFunction Func); void RegisterFrontendHostSignalHandler(FEXCore::Context::Context *CTX, int Signal, HostSignalDelegatorFunction Func); FEXCore::Core::InternalThreadState* CreateThread(FEXCore::Context::Context *CTX, FEXCore::Core::CPUState *NewThreadState, uint64_t ParentTID); diff --git a/Source/CommonCore/HostFactory.cpp b/Source/CommonCore/HostFactory.cpp index a28734605..6c516d319 100644 --- a/Source/CommonCore/HostFactory.cpp +++ b/Source/CommonCore/HostFactory.cpp @@ -58,7 +58,7 @@ namespace HostFactory { , CTX {CTX} , ThreadState {Thread} , IsFallback {Fallback} { - FEXCore::Context::RegisterFrontendHostSignalHandler(CTX, SIGSEGV, + FEXCore::Context::RegisterHostSignalHandler(CTX, SIGSEGV, [](FEXCore::Core::InternalThreadState *Thread, int Signal, void *info, void *ucontext) -> bool { auto InternalThread = reinterpret_cast(Thread); HostCore *Core = reinterpret_cast(InternalThread->CPUBackend.get()); @@ -66,7 +66,7 @@ namespace HostFactory { } ); - FEXCore::Context::RegisterFrontendHostSignalHandler(CTX, 63, [](FEXCore::Core::InternalThreadState *Thread, int Signal, void *info, void *ucontext) -> bool { + FEXCore::Context::RegisterHostSignalHandler(CTX, 63, [](FEXCore::Core::InternalThreadState *Thread, int Signal, void *info, void *ucontext) -> bool { return true; }); } diff --git a/Source/Tests/TestHarnessRunner.cpp b/Source/Tests/TestHarnessRunner.cpp index 470f39e0b..6bcf30271 100644 --- a/Source/Tests/TestHarnessRunner.cpp +++ b/Source/Tests/TestHarnessRunner.cpp @@ -101,6 +101,12 @@ int main(int argc, char **argv, char **const envp) { std::unique_ptr SignalDelegation = std::make_unique(); std::unique_ptr SyscallHandler{FEX::HLE::CreateHandler(Loader.Is64BitMode() ? FEXCore::Context::OperatingMode::MODE_64BIT : FEXCore::Context::OperatingMode::MODE_32BIT, CTX, SignalDelegation.get())}; + bool DidFault = false; + SignalDelegation->RegisterFrontendHostSignalHandler(SIGSEGV, [&DidFault](FEXCore::Core::InternalThreadState *Thread, int Signal, void *info, void *ucontext) { + DidFault = true; + return false; + }); + FEXCore::Context::SetSignalDelegator(CTX, SignalDelegation.get()); FEXCore::Context::SetSyscallHandler(CTX, SyscallHandler.get()); bool Result1 = FEXCore::Context::InitCore(CTX, &Loader); @@ -113,9 +119,10 @@ int main(int argc, char **argv, char **const envp) { // Just re-use compare state. It also checks against the expected values in config. FEXCore::Core::CPUState State; FEXCore::Context::GetCPUState(CTX, &State); - bool Passed = Loader.CompareStates(&State, nullptr); + bool Passed = !DidFault && Loader.CompareStates(&State, nullptr); - LogMan::Msg::I("Passed? %s\n", Passed ? "Yes" : "No"); + LogMan::Msg::I("Faulted? %s", DidFault ? "Yes" : "No"); + LogMan::Msg::I("Passed? %s", Passed ? "Yes" : "No"); FEXCore::Context::DestroyContext(CTX);