From ca74443012b155ed3e90b9cd1fe04c11e5bf52f1 Mon Sep 17 00:00:00 2001 From: zzLinus <2385747226@qq.com> Date: Mon, 25 Jul 2022 11:09:30 +0000 Subject: [PATCH] Kernel/LibC: Implement posix syscall clock_getres() --- Kernel/API/Syscall.h | 6 ++++++ Kernel/Process.h | 1 + Kernel/Syscalls/clock.cpp | 17 +++++++++++++++++ Userland/Libraries/LibC/time.cpp | 6 +++--- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index c973b14883f051..e1346fe25ec3ed 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 e86c052edca36e..0cc9418d758b71 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -339,6 +339,7 @@ class Process final 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 f3119c137e0eb5..6689913e14f0f2 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 9ee6e89a3762fe..ce19dbd83fb79f 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); }