diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index c5710b74..11fa0941 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -34,7 +34,8 @@ extern syscall_fchmodat extern syscall_openat extern syscall_chroot extern syscall_mkdirat -func_count equ 33 +extern syscall_clock_gettime +func_count equ 34 func_table: @@ -71,6 +72,7 @@ func_table: dq syscall_openat dq syscall_chroot dq syscall_mkdirat + dq syscall_clock_gettime section .text global asm_syscall_entry diff --git a/src/sys/syscalls/clock_get.c b/src/sys/syscalls/clock_get.c new file mode 100644 index 00000000..0c1a898e --- /dev/null +++ b/src/sys/syscalls/clock_get.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include + +#define CLOCK_REALTIME 0 + +syscallret syscall_clock_gettime(int clockid, struct timespec *tp){ + + syscallret retv; + retv.errno = 0; + + if(tp > USER_SPACE_END){ + retv.errno = EFAULT; + retv.ret = -1; + return retv; + } + + switch(clockid){ + case CLOCK_REALTIME: + *tp = arch_timekeeper_gettime(); + break; + default: + retv.errno = EINVAL; + + } + + retv.ret = retv.errno ? -1 : 0; + + return retv; + +}