diff --git a/services/libs/jinux-std/src/syscall/clock_gettime.rs b/services/libs/jinux-std/src/syscall/clock_gettime.rs new file mode 100644 index 000000000..8005ad034 --- /dev/null +++ b/services/libs/jinux-std/src/syscall/clock_gettime.rs @@ -0,0 +1,34 @@ +use super::SyscallReturn; +use super::SYS_CLOCK_GETTIME; +use crate::{ + log_syscall_entry, + prelude::*, + time::{clockid_t, timespec_t, ClockID, SystemTime}, + util::write_val_to_user, +}; + +pub fn sys_clock_gettime(clockid: clockid_t, timespec_addr: Vaddr) -> Result { + log_syscall_entry!(SYS_CLOCK_GETTIME); + let clock_id = ClockID::try_from(clockid)?; + debug!("clockid = {:?}", clock_id); + + let now = SystemTime::now(); + let time_duration = match clock_id { + ClockID::CLOCK_REALTIME | ClockID::CLOCK_REALTIME_COARSE => { + now.duration_since(&SystemTime::UNIX_EPOCH)? + } + // TODO: Respect other type of clock_id + _ => { + warn!( + "unsupported clock_id: {:?}, treat it as CLOCK_REALTIME", + clock_id + ); + now.duration_since(&SystemTime::UNIX_EPOCH)? + } + }; + + let timespec = timespec_t::from(time_duration); + write_val_to_user(timespec_addr, ×pec)?; + + Ok(SyscallReturn::Return(0)) +} diff --git a/services/libs/jinux-std/src/syscall/gettimeofday.rs b/services/libs/jinux-std/src/syscall/gettimeofday.rs new file mode 100644 index 000000000..76d6f5bb8 --- /dev/null +++ b/services/libs/jinux-std/src/syscall/gettimeofday.rs @@ -0,0 +1,26 @@ +use super::SyscallReturn; +use super::SYS_GETTIMEOFDAY; +use crate::{ + log_syscall_entry, + prelude::*, + time::{timeval_t, SystemTime}, + util::write_val_to_user, +}; + +// The use of the timezone structure is obsolete. +// Glibc sets the timezone_addr argument to NULL, so just ignore it. +pub fn sys_gettimeofday(timeval_addr: Vaddr, /* timezone_addr: Vaddr */) -> Result { + log_syscall_entry!(SYS_GETTIMEOFDAY); + if timeval_addr == 0 { + return Ok(SyscallReturn::Return(0)); + } + + let time_val = { + let now = SystemTime::now(); + let time_duration = now.duration_since(&SystemTime::UNIX_EPOCH)?; + timeval_t::from(time_duration) + }; + write_val_to_user(timeval_addr, &time_val)?; + + Ok(SyscallReturn::Return(0)) +} diff --git a/services/libs/jinux-std/src/syscall/mod.rs b/services/libs/jinux-std/src/syscall/mod.rs index 6ee8634f1..fc1951033 100644 --- a/services/libs/jinux-std/src/syscall/mod.rs +++ b/services/libs/jinux-std/src/syscall/mod.rs @@ -5,6 +5,7 @@ use crate::syscall::access::sys_access; use crate::syscall::arch_prctl::sys_arch_prctl; use crate::syscall::brk::sys_brk; use crate::syscall::chdir::{sys_chdir, sys_fchdir}; +use crate::syscall::clock_gettime::sys_clock_gettime; use crate::syscall::clock_nanosleep::sys_clock_nanosleep; use crate::syscall::clone::sys_clone; use crate::syscall::close::sys_close; @@ -25,6 +26,7 @@ use crate::syscall::getpgrp::sys_getpgrp; use crate::syscall::getpid::sys_getpid; use crate::syscall::getppid::sys_getppid; use crate::syscall::gettid::sys_gettid; +use crate::syscall::gettimeofday::sys_gettimeofday; use crate::syscall::getuid::sys_getuid; use crate::syscall::ioctl::sys_ioctl; use crate::syscall::kill::sys_kill; @@ -73,6 +75,7 @@ mod access; mod arch_prctl; mod brk; mod chdir; +mod clock_gettime; mod clock_nanosleep; mod clone; mod close; @@ -94,6 +97,7 @@ mod getpgrp; mod getpid; mod getppid; mod gettid; +mod gettimeofday; mod getuid; mod ioctl; mod kill; @@ -214,6 +218,7 @@ define_syscall_nums!( SYS_SYMLINK = 88, SYS_READLINK = 89, SYS_UMASK = 95, + SYS_GETTIMEOFDAY = 96, SYS_GETUID = 102, SYS_GETGID = 104, SYS_GETEUID = 107, @@ -229,6 +234,7 @@ define_syscall_nums!( SYS_EPOLL_CREATE = 213, SYS_GETDENTS64 = 217, SYS_SET_TID_ADDRESS = 218, + SYS_CLOCK_GETTIME = 228, SYS_CLOCK_NANOSLEEP = 230, SYS_EXIT_GROUP = 231, SYS_EPOLL_WAIT = 232, @@ -353,6 +359,7 @@ pub fn syscall_dispatch( SYS_SYMLINK => syscall_handler!(2, sys_symlink, args), SYS_READLINK => syscall_handler!(3, sys_readlink, args), SYS_UMASK => syscall_handler!(1, sys_umask, args), + SYS_GETTIMEOFDAY => syscall_handler!(1, sys_gettimeofday, args), SYS_GETUID => syscall_handler!(0, sys_getuid), SYS_GETGID => syscall_handler!(0, sys_getgid), SYS_GETEUID => syscall_handler!(0, sys_geteuid), @@ -368,6 +375,7 @@ pub fn syscall_dispatch( SYS_EPOLL_CREATE => syscall_handler!(1, sys_epoll_create, args), SYS_GETDENTS64 => syscall_handler!(3, sys_getdents64, args), SYS_SET_TID_ADDRESS => syscall_handler!(1, sys_set_tid_address, args), + SYS_CLOCK_GETTIME => syscall_handler!(2, sys_clock_gettime, args), SYS_CLOCK_NANOSLEEP => syscall_handler!(4, sys_clock_nanosleep, args), SYS_EXIT_GROUP => syscall_handler!(1, sys_exit_group, args), SYS_EPOLL_WAIT => syscall_handler!(4, sys_epoll_wait, args),