syscalls: ppoll

This commit is contained in:
Matheus
2024-06-19 21:56:26 -03:00
parent 984d74d327
commit f82b07328a
4 changed files with 52 additions and 12 deletions
+3 -1
View File
@@ -74,6 +74,7 @@ extern syscall_getsockname
extern syscall_getpeername
extern syscall_chroot
extern syscall_pause
extern syscall_ppoll
syscalltab:
dq syscall_print
dq syscall_mmap
@@ -150,7 +151,8 @@ dq syscall_getsockname
dq syscall_getpeername
dq syscall_chroot
dq syscall_pause
syscallcount equ 75
dq syscall_ppoll
syscallcount equ 76
section .text
global arch_syscall_entry
; on entry:
+5 -3
View File
@@ -5,7 +5,7 @@
#ifdef SYSCALL_LOGGING
#define SYSCALL_COUNT 75
#define SYSCALL_COUNT 76
#define LOGSTR(x) arch_e9_puts(x)
static char *name[] = {
@@ -83,7 +83,8 @@ static char *name[] = {
"getsockname",
"getpeername",
"chroot",
"pause"
"pause",
"ppoll"
};
static char *args[] = {
@@ -161,7 +162,8 @@ static char *args[] = {
"fd %d addr %p addrlen %p", // getsockname
"fd %d addr %p addrlen %p", // getpeername
"path %s", // chroot
"N/A"
"N/A", // pause
"fds %p nfds %d timeout %p sigmask %p" // ppoll
};
#endif
+31
View File
@@ -100,3 +100,34 @@ syscallret_t syscall_poll(context_t *, pollfd_t *fds, size_t nfds, int timeoutms
free(fdsbuff);
return ret;
}
syscallret_t syscall_ppoll(context_t *context, pollfd_t *fds, size_t nfds, timespec_t *utimeout, sigset_t *usigset) {
timespec_t timeout;
sigset_t sigset;
sigset_t savedset;
if (utimeout) {
syscallret_t ret;
ret.ret = -1;
ret.errno = usercopy_fromuser(&timeout, utimeout, sizeof(timespec_t));
if (ret.errno)
return ret;
}
if (usigset) {
syscallret_t ret;
ret.ret = -1;
ret.errno = usercopy_fromuser(&sigset, usigset, sizeof(sigset_t));
if (ret.errno)
return ret;
signal_changemask(_cpu()->thread, SIG_SETMASK, &sigset, &savedset);
}
syscallret_t ret = syscall_poll(context, fds, nfds, utimeout ? (timeout.s * 1000 + timeout.ns / 1000000) : -1);
if (usigset)
signal_changemask(_cpu()->thread, SIG_SETMASK, &savedset, NULL);
return ret;
}