X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Fkernel%2Flinux_syscalls%2Fnanosleep.c;fp=kitten%2Fkernel%2Flinux_syscalls%2Fnanosleep.c;h=39c7a83aaa72ce6575586b3a5eb63fc463471b95;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=0000000000000000000000000000000000000000;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios-OLD.git diff --git a/kitten/kernel/linux_syscalls/nanosleep.c b/kitten/kernel/linux_syscalls/nanosleep.c new file mode 100644 index 0000000..39c7a83 --- /dev/null +++ b/kitten/kernel/linux_syscalls/nanosleep.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +int +sys_nanosleep(const struct timespec __user *req, struct timespec __user *rem) +{ + struct timespec _req, _rem; + uint64_t when, remain; + + if (copy_from_user(&_req, req, sizeof(_req))) + return -EFAULT; + + if (!timespec_is_valid(&_req)) + return -EINVAL; + + when = get_time() + (_req.tv_sec * NSEC_PER_SEC) + _req.tv_nsec; + remain = timer_sleep_until(when); + + if (remain && rem) { + _rem.tv_sec = remain / NSEC_PER_SEC; + _rem.tv_nsec = remain % NSEC_PER_SEC; + + if (copy_to_user(rem, &_rem, sizeof(_rem))) + return -EFAULT; + } + + return (remain) ? -ERESTART_RESTARTBLOCK : 0; +}