1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:38:11 +00:00

Kernel/LibC: Implement posix syscall clock_getres()

This commit is contained in:
zzLinus 2022-07-25 11:09:30 +00:00 committed by Andreas Kling
parent a031b7a174
commit ca74443012
4 changed files with 27 additions and 3 deletions

View file

@ -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;

View file

@ -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*>);

View file

@ -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);

View file

@ -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()"); Syscall::SC_clock_getres_params params { clock_id, result };
auto rc = -ENOSYS; int rc = syscall(SC_clock_getres, &params);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }