os gettime syscall consistent with user mod

This commit is contained in:
zhanghx0905 2021-11-19 19:09:34 +08:00
parent b03d06c330
commit 0aaa7bba53
3 changed files with 27 additions and 9 deletions

View file

@ -14,7 +14,7 @@ pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize {
SYSCALL_WRITE => sys_write(args[0], args[1] as *const u8, args[2]), SYSCALL_WRITE => sys_write(args[0], args[1] as *const u8, args[2]),
SYSCALL_EXIT => sys_exit(args[0] as i32), SYSCALL_EXIT => sys_exit(args[0] as i32),
SYSCALL_YIELD => sys_yield(), SYSCALL_YIELD => sys_yield(),
SYSCALL_GET_TIME => sys_get_time(), SYSCALL_GET_TIME => sys_get_time(args[0] as *mut TimeVal, args[1]),
_ => panic!("Unsupported syscall_id: {}", syscall_id), _ => panic!("Unsupported syscall_id: {}", syscall_id),
} }
} }

View file

@ -2,7 +2,14 @@ use crate::task::{
suspend_current_and_run_next, suspend_current_and_run_next,
exit_current_and_run_next, exit_current_and_run_next,
}; };
use crate::timer::get_time_ms; use crate::timer::get_time_us;
#[repr(C)]
#[derive(Debug)]
pub struct TimeVal {
pub sec: usize,
pub usec: usize,
}
pub fn sys_exit(exit_code: i32) -> ! { pub fn sys_exit(exit_code: i32) -> ! {
println!("[kernel] Application exited with code {}", exit_code); println!("[kernel] Application exited with code {}", exit_code);
@ -15,6 +22,17 @@ pub fn sys_yield() -> isize {
0 0
} }
pub fn sys_get_time() -> isize { // pub fn sys_get_time() -> isize {
get_time_ms() as isize // get_time_ms() as isize
// }
pub fn sys_get_time(ts: *mut TimeVal, _tz: usize) -> isize {
let us = get_time_us();
unsafe {
*ts = TimeVal {
sec: us / 1_000_000,
usec: us % 1_000_000,
};
}
0
} }

View file

@ -1,16 +1,16 @@
use riscv::register::time;
use crate::sbi::set_timer;
use crate::config::CLOCK_FREQ; use crate::config::CLOCK_FREQ;
use crate::sbi::set_timer;
use riscv::register::time;
const TICKS_PER_SEC: usize = 100; const TICKS_PER_SEC: usize = 100;
const MSEC_PER_SEC: usize = 1000; const MICRO_PER_SEC: usize = 1_000_000;
pub fn get_time() -> usize { pub fn get_time() -> usize {
time::read() time::read()
} }
pub fn get_time_ms() -> usize { pub fn get_time_us() -> usize {
time::read() / (CLOCK_FREQ / MSEC_PER_SEC) time::read() / (CLOCK_FREQ / MICRO_PER_SEC)
} }
pub fn set_next_trigger() { pub fn set_next_trigger() {