diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index c973b14883..e1346fe25e 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -52,6 +52,7 @@ enum class NeedsBigProcessLock { S(chown, NeedsBigProcessLock::No) \ S(clock_gettime, NeedsBigProcessLock::No) \ S(clock_nanosleep, NeedsBigProcessLock::No) \ + S(clock_getres, NeedsBigProcessLock::No) \ S(clock_settime, NeedsBigProcessLock::No) \ S(close, NeedsBigProcessLock::No) \ S(connect, NeedsBigProcessLock::No) \ @@ -259,6 +260,11 @@ struct SC_clock_nanosleep_params { struct timespec* remaining_sleep; }; +struct SC_clock_getres_params { + int clock_id; + struct timespec* result; +}; + struct SC_accept4_params { sockaddr* addr; socklen_t* addrlen; diff --git a/Kernel/Process.h b/Kernel/Process.h index e86c052edc..0cc9418d75 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -339,6 +339,7 @@ public: ErrorOr sys$clock_gettime(clockid_t, Userspace); ErrorOr sys$clock_settime(clockid_t, Userspace); ErrorOr sys$clock_nanosleep(Userspace); + ErrorOr sys$clock_getres(Userspace); ErrorOr sys$gethostname(Userspace, size_t); ErrorOr sys$sethostname(Userspace, size_t); ErrorOr sys$uname(Userspace); diff --git a/Kernel/Syscalls/clock.cpp b/Kernel/Syscalls/clock.cpp index f3119c137e..6689913e14 100644 --- a/Kernel/Syscalls/clock.cpp +++ b/Kernel/Syscalls/clock.cpp @@ -91,6 +91,23 @@ ErrorOr Process::sys$clock_nanosleep(Userspace Process::sys$clock_getres(Userspace user_params) +{ + VERIFY_NO_PROCESS_BIG_LOCK(this); + auto params = TRY(copy_typed_from_user(user_params)); + timespec ts {}; + switch (params.clock_id) { + case CLOCK_REALTIME: + ts.tv_sec = 0; + ts.tv_nsec = 1000000000 / _SC_CLK_TCK; + TRY(copy_to_user(params.result, &ts)); + break; + default: + return EINVAL; + } + return 0; +} + ErrorOr Process::sys$adjtime(Userspace user_delta, Userspace user_old_delta) { VERIFY_NO_PROCESS_BIG_LOCK(this); diff --git a/Userland/Libraries/LibC/time.cpp b/Userland/Libraries/LibC/time.cpp index 9ee6e89a37..ce19dbd83f 100644 --- a/Userland/Libraries/LibC/time.cpp +++ b/Userland/Libraries/LibC/time.cpp @@ -471,10 +471,10 @@ int nanosleep(const struct timespec* requested_sleep, struct timespec* remaining return clock_nanosleep(CLOCK_REALTIME, 0, requested_sleep, remaining_sleep); } -int clock_getres(clockid_t, struct timespec*) +int clock_getres(clockid_t clock_id, struct timespec* result) { - dbgln("FIXME: Implement clock_getres()"); - auto rc = -ENOSYS; + Syscall::SC_clock_getres_params params { clock_id, result }; + int rc = syscall(SC_clock_getres, ¶ms); __RETURN_WITH_ERRNO(rc, rc, -1); }