mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-29 05:38:21 +00:00
syscalls: ppoll
This commit is contained in:
@@ -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,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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user