#include "Pledge.h" #include "memory/MemoryManager.h" #include "sys/Syscall.h" #include "thread/Clock.h" #include "thread/Scheduler.h" #include #include Result sys_clock_gettime(Registers*, SyscallArgs args) { clockid_t id = (clockid_t)args[0]; struct timespec* ts = (struct timespec*)args[1]; auto* current = Scheduler::current(); TRY(check_pledge(current, Promise::p_stdio)); Clock* clock; switch (id) { case CLOCK_MONOTONIC: { clock = &g_monotonic_clock; break; } case CLOCK_REALTIME: { clock = &g_realtime_clock; break; } default: return err(EINVAL); } struct timespec time; clock->get_time(time); if (!MemoryManager::copy_to_user_typed(ts, &time)) return err(EFAULT); return 0; }