From f0120854961576ab85865271563cb2205d603edc Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 8 Sep 2024 10:57:21 -0300 Subject: [PATCH] syscalls: sigsuspend --- kernel-src/arch/x86-64/syscall.asm | 4 +++- kernel-src/arch/x86-64/syscalllog.c | 8 +++++--- kernel-src/sys/syscalls/sigsuspend.c | 26 ++++++++++++++++++++++++++ patches/mlibc/jinx-working-patch.patch | 14 ++++++++++---- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 kernel-src/sys/syscalls/sigsuspend.c diff --git a/kernel-src/arch/x86-64/syscall.asm b/kernel-src/arch/x86-64/syscall.asm index fed5fde3..0bc18b5f 100644 --- a/kernel-src/arch/x86-64/syscall.asm +++ b/kernel-src/arch/x86-64/syscall.asm @@ -87,6 +87,7 @@ extern syscall_setuid extern syscall_seteuid extern syscall_setgid extern syscall_setegid +extern syscall_sigsuspend syscalltab: dq syscall_print dq syscall_mmap @@ -176,7 +177,8 @@ dq syscall_setuid dq syscall_seteuid dq syscall_setgid dq syscall_setegid -syscallcount equ 88 +dq syscall_sigsuspend +syscallcount equ 89 section .text global arch_syscall_entry ; on entry: diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c index 61662975..2d9f7276 100644 --- a/kernel-src/arch/x86-64/syscalllog.c +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -5,7 +5,7 @@ #ifdef SYSCALL_LOGGING -#define SYSCALL_COUNT 88 +#define SYSCALL_COUNT 89 #define LOGSTR(x) arch_e9_puts(x) static char *name[] = { @@ -96,7 +96,8 @@ static char *name[] = { "setuid", "seteuid", "setgid", - "setegid" + "setegid", + "sigsuspend" }; static char *args[] = { @@ -187,7 +188,8 @@ static char *args[] = { "uid %d", // setuid "euid %d", // seteuid "gid %d", // setgid - "egid %d" // setegid + "egid %d", // setegid + "sigset %p" // sigsuspend }; #endif diff --git a/kernel-src/sys/syscalls/sigsuspend.c b/kernel-src/sys/syscalls/sigsuspend.c new file mode 100644 index 00000000..1ae5214f --- /dev/null +++ b/kernel-src/sys/syscalls/sigsuspend.c @@ -0,0 +1,26 @@ +#include +#include +#include + +syscallret_t syscall_sigsuspend(context_t *, sigset_t *umask) { + syscallret_t ret = { + .ret = -1 + }; + + sigset_t mask; + sigset_t old; + + ret.errno = usercopy_fromuser(&mask, umask, sizeof(sigset_t)); + if (ret.errno) + return ret; + + signal_changemask(_cpu()->thread, SIG_SETMASK, &mask, &old); + + sched_preparesleep(true); + __assert(sched_yield() == SCHED_WAKEUP_REASON_INTERRUPTED); + + signal_changemask(_cpu()->thread, SIG_SETMASK, &old, NULL); + + ret.errno = EINTR; + return ret; +} diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index afb9e647..23747308 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -219,10 +219,10 @@ index 0000000..e5b087a + diff --git mlibc-workdir/sysdeps/astral/generic/generic.cpp mlibc-workdir/sysdeps/astral/generic/generic.cpp new file mode 100644 -index 0000000..13f1f36 +index 0000000..32711c2 --- /dev/null +++ mlibc-workdir/sysdeps/astral/generic/generic.cpp -@@ -0,0 +1,985 @@ +@@ -0,0 +1,990 @@ +#include +#include +#include @@ -297,6 +297,11 @@ index 0000000..13f1f36 + return 0; + } + ++ int sys_sigsuspend(const sigset_t *set) { ++ long ret; ++ return syscall(SYSCALL_SIGSUSPEND, &ret, (uint64_t)set); ++ } ++ + int sys_vm_protect(void *pointer, size_t size, int prot) { + long ret; + return syscall(SYSCALL_MPROTECT, &ret, (uint64_t)pointer, size, prot); @@ -1227,10 +1232,10 @@ index 0000000..990eca0 +#endif diff --git mlibc-workdir/sysdeps/astral/include/astral/syscall.h mlibc-workdir/sysdeps/astral/include/astral/syscall.h new file mode 100644 -index 0000000..90516f7 +index 0000000..7772e74 --- /dev/null +++ mlibc-workdir/sysdeps/astral/include/astral/syscall.h -@@ -0,0 +1,111 @@ +@@ -0,0 +1,112 @@ +#ifndef _SYSCALL_H_INCLUDE +#define _SYSCALL_H_INCLUDE + @@ -1322,6 +1327,7 @@ index 0000000..90516f7 +#define SYSCALL_SETEUID 85 +#define SYSCALL_SETGID 86 +#define SYSCALL_SETEGID 87 ++#define SYSCALL_SIGSUSPEND 88 + +#include +#include