mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 18:03:25 +00:00
Add gettimeofday and clock_gettime
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
47811a0f38
commit
cc2ab9d5d4
34
services/libs/jinux-std/src/syscall/clock_gettime.rs
Normal file
34
services/libs/jinux-std/src/syscall/clock_gettime.rs
Normal file
@ -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<SyscallReturn> {
|
||||
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))
|
||||
}
|
26
services/libs/jinux-std/src/syscall/gettimeofday.rs
Normal file
26
services/libs/jinux-std/src/syscall/gettimeofday.rs
Normal file
@ -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<SyscallReturn> {
|
||||
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))
|
||||
}
|
@ -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),
|
||||
|
Reference in New Issue
Block a user