From 1fb305fa454918916f8bbcf4b4f09dbcb9f33f70 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 6 Jul 2023 00:38:29 +0300 Subject: [PATCH] Kernel/LibC: add clock_gettime() for CLOCK_MONOTONIC This gets the number of milliseconds since boot --- kernel/include/kernel/Process.h | 2 ++ kernel/kernel/Process.cpp | 18 ++++++++++++++++++ kernel/kernel/Syscall.cpp | 3 +++ libc/CMakeLists.txt | 1 + libc/include/sys/syscall.h | 1 + libc/time.cpp | 8 ++++++++ libc/unistd.cpp | 7 +++++++ 7 files changed, 40 insertions(+) create mode 100644 libc/time.cpp diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index fb10587e..6a5220a9 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -99,6 +99,8 @@ namespace Kernel BAN::ErrorOr sys_termid(char*) const; + BAN::ErrorOr sys_clock_gettime(clockid_t, timespec*) const; + TTY& tty() { ASSERT(m_tty); return *m_tty; } static Process& current() { return Thread::current().process(); } diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 40c5371c..d7eea877 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -835,6 +835,24 @@ namespace Kernel return 0; } + + BAN::ErrorOr Process::sys_clock_gettime(clockid_t clock_id, timespec* tp) const + { + switch (clock_id) + { + case CLOCK_MONOTONIC: + { + uint64_t time_ms = PIT::ms_since_boot(); + tp->tv_sec = time_ms / 1000; + tp->tv_nsec = (time_ms % 1000) * 1000000; + break; + } + default: + return BAN::Error::from_errno(ENOTSUP); + } + return 0; + } + BAN::ErrorOr Process::sys_setuid(uid_t uid) { if (uid < 0 || uid >= 1'000'000'000) diff --git a/kernel/kernel/Syscall.cpp b/kernel/kernel/Syscall.cpp index a4416436..9fe10b62 100644 --- a/kernel/kernel/Syscall.cpp +++ b/kernel/kernel/Syscall.cpp @@ -129,6 +129,9 @@ namespace Kernel case SYS_SET_PWD: ret = Process::current().sys_setpwd((const char*)arg1); break; + case SYS_CLOCK_GETTIME: + ret = Process::current().sys_clock_gettime((clockid_t)arg1, (timespec*)arg2); + break; default: dwarnln("Unknown syscall {}", syscall); break; diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index f7ba67e0..3f6f9c50 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -14,6 +14,7 @@ set(LIBC_SOURCES sys/stat.cpp sys/wait.cpp termios.cpp + time.cpp unistd.cpp math.S icxxabi.cpp diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index e919b16c..cab0cf04 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -38,6 +38,7 @@ __BEGIN_DECLS #define SYS_GET_EGID 31 #define SYS_GET_PWD 32 #define SYS_SET_PWD 33 +#define SYS_CLOCK_GETTIME 34 __END_DECLS diff --git a/libc/time.cpp b/libc/time.cpp new file mode 100644 index 00000000..e98ff75e --- /dev/null +++ b/libc/time.cpp @@ -0,0 +1,8 @@ +#include +#include +#include + +int clock_gettime(clockid_t clock_id, struct timespec* tp) +{ + return syscall(SYS_CLOCK_GETTIME, clock_id, tp); +} \ No newline at end of file diff --git a/libc/unistd.cpp b/libc/unistd.cpp index f22b5dc9..beddffdd 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -244,6 +244,13 @@ long syscall(long syscall, ...) ret = Kernel::syscall(SYS_SET_PWD, (uintptr_t)path); break; } + case SYS_CLOCK_GETTIME: + { + clockid_t clock_id = va_arg(args, clockid_t); + timespec* tp = va_arg(args, timespec*); + ret = Kernel::syscall(SYS_CLOCK_GETTIME, clock_id, (uintptr_t)tp); + break; + } default: puts("LibC: Unhandeled syscall"); ret = -ENOSYS;