From: Andrei Tatar Date: Fri, 24 Nov 2023 15:46:14 +0000 (+0100) Subject: lib/posix-timerfd: Add syscall interface X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=refs%2Fpull%2F1179%2Fhead;p=unikraft%2Funikraft.git lib/posix-timerfd: Add syscall interface This change implements the syscall interface to posix-timerfd, adding the following syscalls to Unikraft: - timerfd_create - timerfd_settime - timerfd_gettime Signed-off-by: Andrei Tatar --- diff --git a/lib/posix-timerfd/Makefile.uk b/lib/posix-timerfd/Makefile.uk index ea68dc070..e5f010ce4 100644 --- a/lib/posix-timerfd/Makefile.uk +++ b/lib/posix-timerfd/Makefile.uk @@ -4,3 +4,7 @@ CINCLUDES-$(CONFIG_LIBPOSIX_TIMERFD) += -I$(LIBPOSIX_TIMERFD_BASE)/include CXXINCLUDES-$(CONFIG_LIBPOSIX_TIMERFD) += -I$(LIBPOSIX_TIMERFD_BASE)/include LIBPOSIX_TIMERFD_SRCS-y += $(LIBPOSIX_TIMERFD_BASE)/timerfd.c + +UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_TIMERFD) += timerfd_create-2 +UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_TIMERFD) += timerfd_settime-4 +UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_TIMERFD) += timerfd_gettime-2 diff --git a/lib/posix-timerfd/timerfd.c b/lib/posix-timerfd/timerfd.c index ec690a0cb..fc895b40e 100644 --- a/lib/posix-timerfd/timerfd.c +++ b/lib/posix-timerfd/timerfd.c @@ -17,6 +17,7 @@ #include #include #include +#include static const char TIMERFD_VOLID[] = "timerfd_vol"; @@ -330,3 +331,45 @@ int uk_sys_timerfd_gettime(const struct uk_file *f, curr_value->it_value = uk_time_spec_from_nsec(st.next); return 0; } + +/* Syscalls */ + +UK_SYSCALL_R_DEFINE(int, timerfd_create, int, id, int, flags) +{ + return uk_sys_timerfd_create(id, flags); +} + +UK_SYSCALL_R_DEFINE(int, timerfd_settime, int, fd, int, flags, + const struct itimerspec *, new_value, + struct itimerspec *, old_value) +{ + int r; + struct uk_ofile *of; + + if (unlikely(!new_value)) + return -EFAULT; + + of = uk_fdtab_get(fd); + if (unlikely(!of)) + return -EBADF; + r = uk_sys_timerfd_settime(of->file, flags, new_value, old_value); + uk_fdtab_ret(of); + return r; +} + +UK_SYSCALL_R_DEFINE(int, timerfd_gettime, int, fd, + struct itimerspec *, curr_value) +{ + int r; + struct uk_ofile *of; + + if (unlikely(!curr_value)) + return -EFAULT; + + of = uk_fdtab_get(fd); + if (unlikely(!of)) + return -EBADF; + r = uk_sys_timerfd_gettime(of->file, curr_value); + uk_fdtab_ret(of); + return r; +}