Skip to content

Commit c8af029

Browse files
authored
refactor(time): 将nanosleep系统调用适配新的syscall table (#1233)
Signed-off-by: longjin <[email protected]>
1 parent 1498dba commit c8af029

File tree

3 files changed

+72
-49
lines changed

3 files changed

+72
-49
lines changed

kernel/src/syscall/mod.rs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -264,21 +264,6 @@ impl Syscall {
264264
Self::mkdir_at(dirfd, path, mode)
265265
}
266266

267-
SYS_NANOSLEEP => {
268-
let req = args[0] as *const PosixTimeSpec;
269-
let rem = args[1] as *mut PosixTimeSpec;
270-
let virt_req = VirtAddr::new(req as usize);
271-
let virt_rem = VirtAddr::new(rem as usize);
272-
if frame.is_from_user()
273-
&& (verify_area(virt_req, core::mem::size_of::<PosixTimeSpec>()).is_err()
274-
|| verify_area(virt_rem, core::mem::size_of::<PosixTimeSpec>()).is_err())
275-
{
276-
Err(SystemError::EFAULT)
277-
} else {
278-
Self::nanosleep(req, rem)
279-
}
280-
}
281-
282267
SYS_CLOCK => Self::clock(),
283268
SYS_UNLINKAT => {
284269
let dirfd = args[0] as i32;

kernel/src/time/syscall.rs renamed to kernel/src/time/syscall/mod.rs

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ use system_error::SystemError;
88
use crate::{
99
process::{timer::AlarmTimer, ProcessManager},
1010
syscall::{user_access::UserBufferWriter, Syscall},
11-
time::{sleep::nanosleep, PosixTimeSpec},
11+
time::PosixTimeSpec,
1212
};
1313

1414
use super::timekeeping::{do_gettimeofday, getnstimeofday};
15+
mod sys_nanosleep;
1516

1617
pub type PosixTimeT = c_longlong;
1718
pub type PosixSusecondsT = c_int;
@@ -63,39 +64,6 @@ impl TryFrom<i32> for PosixClockID {
6364
}
6465

6566
impl Syscall {
66-
/// @brief 休眠指定时间(单位:纳秒)(提供给C的接口)
67-
///
68-
/// @param sleep_time 指定休眠的时间
69-
///
70-
/// @param rm_time 剩余休眠时间(传出参数)
71-
///
72-
/// @return Ok(i32) 0
73-
///
74-
/// @return Err(SystemError) 错误码
75-
pub fn nanosleep(
76-
sleep_time: *const PosixTimeSpec,
77-
rm_time: *mut PosixTimeSpec,
78-
) -> Result<usize, SystemError> {
79-
if sleep_time.is_null() {
80-
return Err(SystemError::EFAULT);
81-
}
82-
83-
let slt_spec = PosixTimeSpec {
84-
tv_sec: unsafe { *sleep_time }.tv_sec,
85-
tv_nsec: unsafe { *sleep_time }.tv_nsec,
86-
};
87-
88-
let r: Result<usize, SystemError> = nanosleep(slt_spec).map(|slt_spec| {
89-
if !rm_time.is_null() {
90-
unsafe { *rm_time }.tv_sec = slt_spec.tv_sec;
91-
unsafe { *rm_time }.tv_nsec = slt_spec.tv_nsec;
92-
}
93-
0
94-
});
95-
96-
return r;
97-
}
98-
9967
/// 获取cpu时间
10068
///
10169
/// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use crate::arch::interrupt::TrapFrame;
2+
use crate::arch::syscall::nr::SYS_NANOSLEEP;
3+
use crate::syscall::table::{FormattedSyscallParam, Syscall};
4+
use crate::syscall::user_access::{UserBufferReader, UserBufferWriter};
5+
use crate::time::sleep::nanosleep;
6+
use crate::time::PosixTimeSpec;
7+
use alloc::vec::Vec;
8+
use system_error::SystemError;
9+
10+
pub struct SysNanosleep;
11+
12+
impl SysNanosleep {
13+
fn sleep_time(args: &[usize]) -> *const PosixTimeSpec {
14+
args[0] as *const PosixTimeSpec
15+
}
16+
17+
fn rm_time(args: &[usize]) -> *mut PosixTimeSpec {
18+
args[1] as *mut PosixTimeSpec
19+
}
20+
}
21+
22+
impl Syscall for SysNanosleep {
23+
fn num_args(&self) -> usize {
24+
1
25+
}
26+
27+
fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result<usize, SystemError> {
28+
let sleep_time_reader = UserBufferReader::new(
29+
Self::sleep_time(args),
30+
core::mem::size_of::<PosixTimeSpec>(),
31+
true,
32+
)?;
33+
let rm_time_ptr = Self::rm_time(args);
34+
let mut rm_time_writer = if !rm_time_ptr.is_null() {
35+
Some(UserBufferWriter::new(
36+
rm_time_ptr,
37+
core::mem::size_of::<PosixTimeSpec>(),
38+
true,
39+
)?)
40+
} else {
41+
None
42+
};
43+
44+
let sleep_time = sleep_time_reader.read_one_from_user::<PosixTimeSpec>(0)?;
45+
46+
let slt_spec = PosixTimeSpec {
47+
tv_sec: sleep_time.tv_sec,
48+
tv_nsec: sleep_time.tv_nsec,
49+
};
50+
let r = nanosleep(slt_spec)?;
51+
if let Some(ref mut rm_time) = rm_time_writer {
52+
// 如果rm_time不为null,则将剩余时间写入rm_time
53+
rm_time.copy_one_to_user(&r, 0)?;
54+
}
55+
56+
return Ok(0);
57+
}
58+
59+
fn entry_format(&self, args: &[usize]) -> Vec<FormattedSyscallParam> {
60+
vec![
61+
FormattedSyscallParam::new(
62+
"sleep_time",
63+
format!("{:#x}", Self::sleep_time(args) as usize),
64+
),
65+
FormattedSyscallParam::new("rm_time", format!("{:#x}", Self::rm_time(args) as usize)),
66+
]
67+
}
68+
}
69+
70+
syscall_table_macros::declare_syscall!(SYS_NANOSLEEP, SysNanosleep);

0 commit comments

Comments
 (0)