From 25ea51b9722b3e2227806e9bcd492944f40119bb Mon Sep 17 00:00:00 2001 From: DH Date: Wed, 12 Jul 2023 04:19:52 +0300 Subject: [PATCH] [orbis-kernel] implement sys_clock_gettime --- orbis-kernel/src/sys/sys_time.cpp | 101 +++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 3 deletions(-) diff --git a/orbis-kernel/src/sys/sys_time.cpp b/orbis-kernel/src/sys/sys_time.cpp index 25d8161a9..c32aa5cbe 100644 --- a/orbis-kernel/src/sys/sys_time.cpp +++ b/orbis-kernel/src/sys/sys_time.cpp @@ -1,8 +1,103 @@ #include "sys/sysproto.hpp" +#include "utils/Logs.hpp" +#include -orbis::SysResult orbis::sys_clock_gettime(Thread *thread, clockid_t clock_id, - ptr tp) { - return ErrorCode::NOSYS; +enum class ClockId { + Realtime = 0, + Virtual = 1, + Prof = 2, + Monotonic = 4, + Uptime = 5, // FreeBSD-specific + UptimePrecise = 7, // FreeBSD-specific + UptimeFast = 8, // FreeBSD-specific + RealtimePrecise = 9, // FreeBSD-specific + RealtimeFast = 10, // FreeBSD-specific + MonotonicPrecise = 11, // FreeBSD-specific + MonotonicFast = 12, // FreeBSD-specific + Second = 13, // FreeBSD-specific + ThreadCputimeId = 14, + + // orbis extension + Proctime = 15, + Network = 16, + DebugNetwork = 17, + AdNetwork = 18, + RawNetwork = 19, +}; + +orbis::SysResult orbis::sys_clock_gettime(Thread *, clockid_t clock_id, + ptr tp) { + timespec result{}; + + auto getHostClock = [](clockid_t clock_id) { + ::timespec hostClock; + ::clock_gettime(clock_id, &hostClock); + + timespec result; + result.sec = hostClock.tv_sec; + result.nsec = hostClock.tv_nsec; + return result; + }; + + switch (static_cast(clock_id)) { + case ClockId::Realtime: + case ClockId::RealtimePrecise: + result = getHostClock(CLOCK_REALTIME); + break; + + case ClockId::RealtimeFast: { + result = getHostClock(CLOCK_REALTIME); // FIXME + break; + } + case ClockId::Virtual: + ORBIS_LOG_ERROR("Unimplemented ClockId::Virtual\n"); + break; + case ClockId::Prof: + ORBIS_LOG_ERROR("Unimplemented ClockId::Prof\n"); + break; + + case ClockId::Monotonic: + case ClockId::MonotonicPrecise: + case ClockId::Uptime: + case ClockId::UptimePrecise: { + result = getHostClock(CLOCK_MONOTONIC); + break; + } + + case ClockId::UptimeFast: + case ClockId::MonotonicFast: + result = getHostClock(CLOCK_MONOTONIC); // FIXME + break; + + case ClockId::Second: { + result = getHostClock(CLOCK_MONOTONIC); // FIXME + result.nsec = 0; + break; + } + case ClockId::ThreadCputimeId: + result = getHostClock(CLOCK_THREAD_CPUTIME_ID); + break; + case ClockId::Proctime: + result = getHostClock(CLOCK_PROCESS_CPUTIME_ID); + break; + case ClockId::Network: + ORBIS_LOG_ERROR("Unimplemented ClockId::Network\n"); + break; + case ClockId::DebugNetwork: + ORBIS_LOG_ERROR("Unimplemented ClockId::DebugNetwork\n"); + break; + case ClockId::AdNetwork: + ORBIS_LOG_ERROR("Unimplemented ClockId::AdNetwork\n"); + break; + case ClockId::RawNetwork: + ORBIS_LOG_ERROR("Unimplemented ClockId::RawNetwork\n"); + break; + + default: + return ErrorCode::INVAL; + } + + return uwrite(tp, result); } orbis::SysResult orbis::sys_clock_settime(Thread *thread, clockid_t clock_id, ptr tp) {