mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 17:00:19 +02:00
Initial base implementation of sigtimedwait
This commit is contained in:
1 parent
235e05e8b9
commit
b5115e096f
5 files changed
+35
-4
No files matched your search
@@ -611,4 +611,23 @@ namespace FEX::HLE {
|
||||
return Result == -1 ? -errno : Result;
|
||||
|
||||
}
|
||||
|
||||
uint64_t SignalDelegator::GuestSigTimedWait(uint64_t *set, siginfo_t *info, const struct timespec *timeout, size_t sigsetsize) {
|
||||
if (sigsetsize > sizeof(uint64_t)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sigset_t HostSet{};
|
||||
sigemptyset(&HostSet);
|
||||
|
||||
for (int32_t i = 0; i < MAX_SIGNALS; ++i) {
|
||||
if (*set & (1ULL << i)) {
|
||||
sigaddset(&HostSet, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t Result = sigtimedwait(&HostSet, info, timeout);
|
||||
|
||||
return Result == -1 ? -errno : Result;
|
||||
}
|
||||
}
|
||||
@@ -81,6 +81,7 @@ namespace FEX::HLE {
|
||||
uint64_t GuestSigProcMask(int how, const uint64_t *set, uint64_t *oldset);
|
||||
uint64_t GuestSigPending(uint64_t *set, size_t sigsetsize);
|
||||
uint64_t GuestSigSuspend(uint64_t *set, size_t sigsetsize);
|
||||
uint64_t GuestSigTimedWait(uint64_t *set, siginfo_t *info, const struct timespec *timeout, size_t sigsetsize);
|
||||
|
||||
// Called from the thunk handler to handle the signal
|
||||
void HandleSignal(int Signal, void *Info, void *UContext);
|
||||
|
||||
@@ -40,10 +40,6 @@ namespace FEX::HLE {
|
||||
return -EPERM;
|
||||
});
|
||||
|
||||
REGISTER_SYSCALL_IMPL(rt_sigtimedwait, [](FEXCore::Core::CpuStateFrame *Frame, sigset_t *set, const struct timespec*, size_t sigsetsize) -> uint64_t {
|
||||
SYSCALL_STUB(rt_sigtimedwait);
|
||||
});
|
||||
|
||||
REGISTER_SYSCALL_IMPL(rt_sigqueueinfo, [](FEXCore::Core::CpuStateFrame *Frame, pid_t pid, int sig, siginfo_t *uinfo) -> uint64_t {
|
||||
SYSCALL_STUB(rt_sigqueueinfo);
|
||||
});
|
||||
|
||||
@@ -52,5 +52,16 @@ namespace FEX::HLE::x32 {
|
||||
SYSCALL_ERRNO();
|
||||
});
|
||||
|
||||
REGISTER_SYSCALL_IMPL_X32(rt_sigtimedwait, [](FEXCore::Core::CpuStateFrame *Frame, uint64_t *set, siginfo_t *info, const struct timespec32* timeout, size_t sigsetsize) -> uint64_t {
|
||||
struct timespec* timeout_ptr{};
|
||||
struct timespec tp64{};
|
||||
if (timeout) {
|
||||
tp64 = *timeout;
|
||||
timeout_ptr = &tp64;
|
||||
}
|
||||
|
||||
return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, info, timeout_ptr, sigsetsize);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,10 @@ namespace FEX::HLE::x64 {
|
||||
REGISTER_SYSCALL_IMPL_X64(rt_sigaction, [](FEXCore::Core::CpuStateFrame *Frame, int signum, const FEXCore::GuestSigAction *act, FEXCore::GuestSigAction *oldact) -> uint64_t {
|
||||
return FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, act, oldact);
|
||||
});
|
||||
|
||||
REGISTER_SYSCALL_IMPL_X64(rt_sigtimedwait, [](FEXCore::Core::CpuStateFrame *Frame, uint64_t *set, siginfo_t *info, const struct timespec* timeout, size_t sigsetsize) -> uint64_t {
|
||||
return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, info, timeout, sigsetsize);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user