From f830ce95d6ab22e94c4471f11ecdda08ff113cea Mon Sep 17 00:00:00 2001 From: Tateisi Date: Sun, 3 Aug 2025 17:36:14 +0800 Subject: [PATCH] lab04: sys_get_time --- os/src/syscall/process.rs | 29 +++++++++++++++++++++-------- user/src/syscall.rs | 3 +-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index a0ca421..f60a3df 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -1,8 +1,8 @@ //! Process management syscalls use crate::config::PAGE_SIZE; -use crate::mm::{MapPermission, VPNRange, VirtAddr}; -use crate::task::{change_program_brk, create_new_map_area, exit_current_and_run_next, get_current_task_page_table_entry, suspend_current_and_run_next, unmap_virtual_page}; +use crate::mm::{translated_byte_buffer, MapPermission, VPNRange, VirtAddr}; +use crate::task::{change_program_brk, create_new_map_area, current_user_token, exit_current_and_run_next, get_current_task_page_table_entry, suspend_current_and_run_next, unmap_virtual_page}; use crate::timer::get_time_us; /// task exits and submit an exit code @@ -28,14 +28,27 @@ pub struct TimeVal { /// get current time 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, - }; + let dst_vec = translated_byte_buffer( + current_user_token(), + ts as *const u8, core::mem::size_of::() + ); + let ref time_val = TimeVal { + sec: us / 1_000_000, + usec: us % 1_000_000, + }; + let src_ptr = time_val as *const TimeVal; + for (idx, dst) in dst_vec.into_iter().enumerate() { + let unit_len = dst.len(); + unsafe { + dst.copy_from_slice( + core::slice::from_raw_parts( + src_ptr.wrapping_byte_add(idx * unit_len) as *const u8, + unit_len + ) + ); + } } 0 - -1 } /// change data segment size diff --git a/user/src/syscall.rs b/user/src/syscall.rs index 474684c..9ce185d 100644 --- a/user/src/syscall.rs +++ b/user/src/syscall.rs @@ -6,7 +6,6 @@ const SYSCALL_WRITE: usize = 64; const SYSCALL_EXIT: usize = 93; const SYSCALL_YIELD: usize = 124; const SYSCALL_GET_TIME: usize = 169; -const SYSCALL_GETTIMEOFDAY: usize = 169; const SYSCALL_SBRK: usize = 214; const SYSCALL_MMAP: usize = 222; const SYSCALL_MUNMAP: usize = 215; @@ -38,7 +37,7 @@ pub fn sys_yield() -> isize { } pub fn sys_get_time(time: &TimeVal, tz: usize) -> isize { - syscall(SYSCALL_GETTIMEOFDAY, [time as *const _ as usize, tz, 0]) + syscall(SYSCALL_GET_TIME, [time as *const _ as usize, tz, 0]) } pub fn sys_sbrk(size: i32) -> isize {