return;
}
+ if (syscall_no == SYSCALL_SIGSUSPEND) {
+ if (!current_process) { regs->eax = (uint32_t)-EINVAL; return; }
+ uint32_t new_mask = 0;
+ if (copy_from_user(&new_mask, (const void*)regs->ebx, sizeof(new_mask)) < 0) {
+ regs->eax = (uint32_t)-EFAULT; return;
+ }
+ uint32_t old_mask = current_process->sig_blocked_mask;
+ current_process->sig_blocked_mask = new_mask;
+ extern void schedule(void);
+ while ((current_process->sig_pending_mask & ~current_process->sig_blocked_mask) == 0) {
+ schedule();
+ }
+ current_process->sig_blocked_mask = old_mask;
+ regs->eax = (uint32_t)-EINTR;
+ return;
+ }
+
/* ---- Socket syscalls ---- */
socket_syscall_dispatch(regs, syscall_no);
/* If socket dispatch handled it, eax is set and we return.
struct sigaction* oldact);
int sigprocmask(int how, const uint32_t* set, uint32_t* oldset);
int sigpending(uint32_t* set);
+int sigsuspend(const uint32_t* mask);
#endif
int sigpending(uint32_t* set) {
return __syscall_ret(_syscall1(SYS_SIGPENDING, (int)set));
}
+
+int sigsuspend(const uint32_t* mask) {
+ return __syscall_ret(_syscall1(SYS_SIGSUSPEND, (int)mask));
+}