Forráskód Böngészése

Kernel/LibC: Implement posix syscall clock_getres()

zzLinus 3 éve
szülő
commit
ca74443012

+ 6 - 0
Kernel/API/Syscall.h

@@ -52,6 +52,7 @@ enum class NeedsBigProcessLock {
     S(chown, NeedsBigProcessLock::No)                       \
     S(chown, NeedsBigProcessLock::No)                       \
     S(clock_gettime, NeedsBigProcessLock::No)               \
     S(clock_gettime, NeedsBigProcessLock::No)               \
     S(clock_nanosleep, NeedsBigProcessLock::No)             \
     S(clock_nanosleep, NeedsBigProcessLock::No)             \
+    S(clock_getres, NeedsBigProcessLock::No)                \
     S(clock_settime, NeedsBigProcessLock::No)               \
     S(clock_settime, NeedsBigProcessLock::No)               \
     S(close, NeedsBigProcessLock::No)                       \
     S(close, NeedsBigProcessLock::No)                       \
     S(connect, NeedsBigProcessLock::No)                     \
     S(connect, NeedsBigProcessLock::No)                     \
@@ -259,6 +260,11 @@ struct SC_clock_nanosleep_params {
     struct timespec* remaining_sleep;
     struct timespec* remaining_sleep;
 };
 };
 
 
+struct SC_clock_getres_params {
+    int clock_id;
+    struct timespec* result;
+};
+
 struct SC_accept4_params {
 struct SC_accept4_params {
     sockaddr* addr;
     sockaddr* addr;
     socklen_t* addrlen;
     socklen_t* addrlen;

+ 1 - 0
Kernel/Process.h

@@ -339,6 +339,7 @@ public:
     ErrorOr<FlatPtr> sys$clock_gettime(clockid_t, Userspace<timespec*>);
     ErrorOr<FlatPtr> sys$clock_gettime(clockid_t, Userspace<timespec*>);
     ErrorOr<FlatPtr> sys$clock_settime(clockid_t, Userspace<timespec const*>);
     ErrorOr<FlatPtr> sys$clock_settime(clockid_t, Userspace<timespec const*>);
     ErrorOr<FlatPtr> sys$clock_nanosleep(Userspace<Syscall::SC_clock_nanosleep_params const*>);
     ErrorOr<FlatPtr> sys$clock_nanosleep(Userspace<Syscall::SC_clock_nanosleep_params const*>);
+    ErrorOr<FlatPtr> sys$clock_getres(Userspace<Syscall::SC_clock_getres_params const*>);
     ErrorOr<FlatPtr> sys$gethostname(Userspace<char*>, size_t);
     ErrorOr<FlatPtr> sys$gethostname(Userspace<char*>, size_t);
     ErrorOr<FlatPtr> sys$sethostname(Userspace<char const*>, size_t);
     ErrorOr<FlatPtr> sys$sethostname(Userspace<char const*>, size_t);
     ErrorOr<FlatPtr> sys$uname(Userspace<utsname*>);
     ErrorOr<FlatPtr> sys$uname(Userspace<utsname*>);

+ 17 - 0
Kernel/Syscalls/clock.cpp

@@ -91,6 +91,23 @@ ErrorOr<FlatPtr> Process::sys$clock_nanosleep(Userspace<Syscall::SC_clock_nanosl
     return 0;
     return 0;
 }
 }
 
 
+ErrorOr<FlatPtr> Process::sys$clock_getres(Userspace<Syscall::SC_clock_getres_params const*> 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<FlatPtr> Process::sys$adjtime(Userspace<timeval const*> user_delta, Userspace<timeval*> user_old_delta)
 ErrorOr<FlatPtr> Process::sys$adjtime(Userspace<timeval const*> user_delta, Userspace<timeval*> user_old_delta)
 {
 {
     VERIFY_NO_PROCESS_BIG_LOCK(this);
     VERIFY_NO_PROCESS_BIG_LOCK(this);

+ 3 - 3
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);
     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, &params);
     __RETURN_WITH_ERRNO(rc, rc, -1);
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }
 }