forked from Bananymous/banan-os
Kernel/LibC: add clock_gettime() for CLOCK_MONOTONIC
This gets the number of milliseconds since boot
This commit is contained in:
parent
86df258365
commit
3c068aa0ae
|
@ -99,6 +99,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<long> sys_termid(char*) const;
|
BAN::ErrorOr<long> sys_termid(char*) const;
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> sys_clock_gettime(clockid_t, timespec*) const;
|
||||||
|
|
||||||
TTY& tty() { ASSERT(m_tty); return *m_tty; }
|
TTY& tty() { ASSERT(m_tty); return *m_tty; }
|
||||||
|
|
||||||
static Process& current() { return Thread::current().process(); }
|
static Process& current() { return Thread::current().process(); }
|
||||||
|
|
|
@ -835,6 +835,24 @@ namespace Kernel
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> 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<long> Process::sys_setuid(uid_t uid)
|
BAN::ErrorOr<long> Process::sys_setuid(uid_t uid)
|
||||||
{
|
{
|
||||||
if (uid < 0 || uid >= 1'000'000'000)
|
if (uid < 0 || uid >= 1'000'000'000)
|
||||||
|
|
|
@ -129,6 +129,9 @@ namespace Kernel
|
||||||
case SYS_SET_PWD:
|
case SYS_SET_PWD:
|
||||||
ret = Process::current().sys_setpwd((const char*)arg1);
|
ret = Process::current().sys_setpwd((const char*)arg1);
|
||||||
break;
|
break;
|
||||||
|
case SYS_CLOCK_GETTIME:
|
||||||
|
ret = Process::current().sys_clock_gettime((clockid_t)arg1, (timespec*)arg2);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dwarnln("Unknown syscall {}", syscall);
|
dwarnln("Unknown syscall {}", syscall);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -14,6 +14,7 @@ set(LIBC_SOURCES
|
||||||
sys/stat.cpp
|
sys/stat.cpp
|
||||||
sys/wait.cpp
|
sys/wait.cpp
|
||||||
termios.cpp
|
termios.cpp
|
||||||
|
time.cpp
|
||||||
unistd.cpp
|
unistd.cpp
|
||||||
math.S
|
math.S
|
||||||
icxxabi.cpp
|
icxxabi.cpp
|
||||||
|
|
|
@ -38,6 +38,7 @@ __BEGIN_DECLS
|
||||||
#define SYS_GET_EGID 31
|
#define SYS_GET_EGID 31
|
||||||
#define SYS_GET_PWD 32
|
#define SYS_GET_PWD 32
|
||||||
#define SYS_SET_PWD 33
|
#define SYS_SET_PWD 33
|
||||||
|
#define SYS_CLOCK_GETTIME 34
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int clock_gettime(clockid_t clock_id, struct timespec* tp)
|
||||||
|
{
|
||||||
|
return syscall(SYS_CLOCK_GETTIME, clock_id, tp);
|
||||||
|
}
|
|
@ -244,6 +244,13 @@ long syscall(long syscall, ...)
|
||||||
ret = Kernel::syscall(SYS_SET_PWD, (uintptr_t)path);
|
ret = Kernel::syscall(SYS_SET_PWD, (uintptr_t)path);
|
||||||
break;
|
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:
|
default:
|
||||||
puts("LibC: Unhandeled syscall");
|
puts("LibC: Unhandeled syscall");
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
|
|
Loading…
Reference in New Issue