mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 10:00:16 +02:00
SignalDelegator: Simplify support for musl's sigset_t
This commit is contained in:
1 parent
93015a0266
commit
06d77c1c19
2 files changed
+6
-30
No files matched your search
@@ -164,29 +164,3 @@ add_custom_target(struct_verifier
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
USES_TERMINAL
|
||||
COMMAND "ctest" "--output-on-failure" "--timeout" "302" ${TEST_JOB_FLAG} "-R" "Test_verify*")
|
||||
|
||||
include(CheckCSourceCompiles)
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <signal.h>
|
||||
int main(void){
|
||||
sigset_t s;
|
||||
(void)sizeof(s.__val); // glibc
|
||||
return 0;
|
||||
}" SIGSET_HAS___VAL)
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <signal.h>
|
||||
int main(void){
|
||||
sigset_t s;
|
||||
(void)sizeof(s.__bits); // musl
|
||||
return 0;
|
||||
}" SIGSET_HAS___BITS)
|
||||
|
||||
if(SIGSET_HAS___VAL)
|
||||
add_compile_definitions("SIGSET_VAL=__val")
|
||||
elseif(SIGSET_HAS___BITS)
|
||||
add_compile_definitions("SIGSET_VAL=__bits")
|
||||
else()
|
||||
message(FATAL_ERROR "Unknown sigset_t layout!")
|
||||
endif()
|
||||
@@ -649,17 +649,19 @@ void SignalDelegator::HandleGuestSignal(FEX::HLE::ThreadStateObject* ThreadObjec
|
||||
"capacity size. This will "
|
||||
"likely crash! Asserting now!");
|
||||
|
||||
// Peek into sigset_t implementation details, extracting the __val member for glibc and __bits for musl
|
||||
auto& [sigmask_val] = _context->uc_sigmask;
|
||||
static_assert(sizeof(sigmask_val[0]) == sizeof(uint64_t), "Unknown sigset_t layout");
|
||||
|
||||
ThreadObject->SignalInfo.DeferredSignalFrames.emplace_back(ThreadStateObject::DeferredSignalState {
|
||||
.Info = SigInfo,
|
||||
.Signal = Signal,
|
||||
.SigMask = _context->uc_sigmask.SIGSET_VAL[0],
|
||||
.SigMask = sigmask_val[0],
|
||||
});
|
||||
|
||||
uint64_t NewMask = GetNewSigMask(Signal);
|
||||
|
||||
// Update our host signal mask so we don't hit race conditions with signals
|
||||
// This allows us to maintain the expected signal mask through the guest signal handling and then all the way back again
|
||||
memcpy(&_context->uc_sigmask, &NewMask, sizeof(uint64_t));
|
||||
sigmask_val[0] = GetNewSigMask(Signal);
|
||||
|
||||
// Now update the faulting page permissions so it will fault on write.
|
||||
mprotect(reinterpret_cast<void*>(&Thread->InterruptFaultPage), sizeof(Thread->InterruptFaultPage), PROT_NONE);
|
||||
|
||||
Reference in new issue
Block a user