diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.h b/Userland/DevTools/UserspaceEmulator/Emulator.h index 8837e0a964..696dc56cc6 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator.h +++ b/Userland/DevTools/UserspaceEmulator/Emulator.h @@ -225,6 +225,7 @@ private: int virt$setuid(uid_t); int virt$shutdown(int sockfd, int how); int virt$sigaction(int, FlatPtr, FlatPtr); + int virt$sigprocmask(int how, FlatPtr set, FlatPtr old_set); int virt$sigreturn(); int virt$socket(int, int, int); int virt$stat(FlatPtr); diff --git a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp index f76a19e8d5..11cab6b7d1 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp @@ -233,6 +233,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$shutdown(arg1, arg2); case SC_sigaction: return virt$sigaction(arg1, arg2, arg3); + case SC_sigprocmask: + return virt$sigprocmask(arg1, arg2, arg3); case SC_sigreturn: return virt$sigreturn(); case SC_socket: @@ -1365,6 +1367,31 @@ int Emulator::virt$sigaction(int signum, FlatPtr act, FlatPtr oldact) return 0; } +int Emulator::virt$sigprocmask(int how, FlatPtr set, FlatPtr old_set) +{ + if (old_set) { + mmu().copy_to_vm(old_set, &m_signal_mask, sizeof(sigset_t)); + } + if (set) { + sigset_t set_value; + mmu().copy_from_vm(&set_value, set, sizeof(sigset_t)); + switch (how) { + case SIG_BLOCK: + m_signal_mask |= set_value; + break; + case SIG_SETMASK: + m_signal_mask = set_value; + break; + case SIG_UNBLOCK: + m_signal_mask &= ~set_value; + break; + default: + return -EINVAL; + } + } + return 0; +} + int Emulator::virt$sigreturn() { u32 stack_ptr = m_cpu.esp().value();