Skip to content

Commit 82ad43b

Browse files
committed
add ch3/ch4 test: ch3_trace, ch4_trace1
1 parent b881f5b commit 82ad43b

File tree

5 files changed

+115
-82
lines changed

5 files changed

+115
-82
lines changed

src/bin/ch3_taskinfo.rs

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/bin/ch3_trace.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#![no_std]
2+
#![no_main]
3+
4+
extern crate user_lib;
5+
6+
use user_lib::{
7+
count_syscall, get_time, println, sleep, trace_read, trace_write,
8+
SYSCALL_EXIT, SYSCALL_GETTIMEOFDAY, SYSCALL_TRACE, SYSCALL_WRITE, SYSCALL_YIELD
9+
};
10+
11+
pub fn write_const(var: &u8, new_val: u8) {
12+
trace_write(var as *const _, new_val);
13+
}
14+
15+
#[no_mangle]
16+
pub fn main() -> usize {
17+
let t1 = get_time() as usize;
18+
get_time();
19+
sleep(500);
20+
let t2 = get_time() as usize;
21+
let t3 = get_time() as usize;
22+
assert!(3 <= count_syscall(SYSCALL_GETTIMEOFDAY));
23+
// 注意这次 sys_trace 调用本身也计入
24+
assert_eq!(2, count_syscall(SYSCALL_TRACE));
25+
assert_eq!(0, count_syscall(SYSCALL_WRITE));
26+
assert!(0 < count_syscall(SYSCALL_YIELD));
27+
assert_eq!(0, count_syscall(SYSCALL_EXIT));
28+
29+
// 想想为什么 write 调用是两次
30+
println!("string from task trace test\n");
31+
let t4 = get_time() as usize;
32+
let t5 = get_time() as usize;
33+
assert!(5 <= count_syscall(SYSCALL_GETTIMEOFDAY));
34+
assert_eq!(7, count_syscall(SYSCALL_TRACE));
35+
assert_eq!(2, count_syscall(SYSCALL_WRITE));
36+
assert!(0 < count_syscall(SYSCALL_YIELD));
37+
assert_eq!(0, count_syscall(SYSCALL_EXIT));
38+
39+
#[allow(unused_mut)]
40+
let mut var = 111u8;
41+
assert_eq!(Some(111), trace_read(&var as *const u8));
42+
write_const(&var, (t1 ^ t2 ^ t3 ^ t4 ^ t5) as u8);
43+
assert_eq!((t1 ^ t2 ^ t3 ^ t4 ^ t5) as u8, unsafe { core::ptr::read_volatile(&var) });
44+
45+
assert!(None != trace_read(main as *const _));
46+
println!("Test trace OK!");
47+
0
48+
}

src/bin/ch4_trace1.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#![no_std]
2+
#![no_main]
3+
4+
extern crate user_lib;
5+
6+
use user_lib::{println, trace_read, trace_write, mmap, munmap};
7+
8+
#[no_mangle]
9+
pub fn main() -> usize {
10+
#[allow(unused_mut)]
11+
let mut var = 111u8;
12+
assert_eq!(Some(111), trace_read(&var as *const _));
13+
var = 22;
14+
assert_eq!(Some(22), trace_read(&var as *const _));
15+
assert_eq!(0, trace_write(&var as *const _, 33));
16+
17+
assert_eq!(None, trace_read(usize::MAX as *const _));
18+
assert_eq!(-1, trace_write(usize::MAX as *const _, 0));
19+
assert_eq!(None, trace_read(0x80200000 as *const _));
20+
assert_eq!(-1, trace_write(0x80200000 as *const _, 0));
21+
22+
let start: usize = 0x10000000;
23+
let len: usize = 4096;
24+
let prot: usize = 1; // READONLY
25+
26+
assert_eq!(0, mmap(start, len, prot));
27+
28+
assert!(None != trace_read(start as *const u8));
29+
assert_eq!(-1, trace_write(start as *const u8, 0));
30+
31+
assert_eq!(0, munmap(start, len));
32+
33+
assert_eq!(None, trace_read(start as *const u8));
34+
assert_eq!(-1, trace_write(start as *const u8, 0));
35+
36+
println!("Test trace_1 OK!");
37+
0
38+
}

src/lib.rs

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -106,29 +106,11 @@ pub enum TaskStatus {
106106
Exited,
107107
}
108108

109-
#[derive(Copy, Clone, Debug)]
110-
pub struct SyscallInfo {
111-
pub id: usize,
112-
pub times: usize,
113-
}
114-
115-
const MAX_SYSCALL_NUM: usize = 500;
116-
117-
#[derive(Debug)]
118-
pub struct TaskInfo {
119-
pub status: TaskStatus,
120-
pub syscall_times: [u32; MAX_SYSCALL_NUM],
121-
pub time: usize,
122-
}
123-
124-
impl TaskInfo {
125-
pub fn new() -> Self {
126-
TaskInfo {
127-
status: TaskStatus::UnInit,
128-
syscall_times: [0; MAX_SYSCALL_NUM],
129-
time: 0,
130-
}
131-
}
109+
#[repr(C)]
110+
pub enum TraceRequest {
111+
Read,
112+
Write,
113+
Syscall,
132114
}
133115

134116
#[repr(C)]
@@ -307,8 +289,23 @@ pub fn pipe(pipe_fd: &mut [usize]) -> isize {
307289
sys_pipe(pipe_fd)
308290
}
309291

310-
pub fn task_info(info: &mut TaskInfo) -> isize {
311-
sys_task_info(info)
292+
pub fn trace(request: TraceRequest, id: usize, data: usize) -> isize {
293+
sys_trace(request as usize, id, data)
294+
}
295+
296+
pub fn trace_read(addr: *const u8) -> Option<u8> {
297+
match trace(TraceRequest::Read, addr as usize, 0) {
298+
-1 => None,
299+
data => Some(data as u8),
300+
}
301+
}
302+
303+
pub fn trace_write(addr: *const u8, data: u8) -> isize {
304+
trace(TraceRequest::Write, addr as usize, data as usize)
305+
}
306+
307+
pub fn count_syscall(id: usize) -> isize {
308+
trace(TraceRequest::Syscall, id, 0)
312309
}
313310

314311
pub fn thread_create(entry: usize, arg: usize) -> isize {
@@ -461,7 +458,7 @@ pub fn sigaction(
461458
sys_sigaction(
462459
signum,
463460
action.map_or(core::ptr::null(), |a| a),
464-
old_action.map_or(core::ptr::null_mut(), |a| a)
461+
old_action.map_or(core::ptr::null_mut(), |a| a),
465462
)
466463
}
467464

@@ -471,4 +468,4 @@ pub fn sigprocmask(mask: u32) -> isize {
471468

472469
pub fn sigreturn() -> isize {
473470
sys_sigreturn()
474-
}
471+
}

src/syscall.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{TaskInfo, SignalAction};
1+
use crate::SignalAction;
22

33
use super::{Stat, TimeVal};
44

@@ -31,7 +31,7 @@ pub const SYSCALL_MAIL_READ: usize = 401;
3131
pub const SYSCALL_MAIL_WRITE: usize = 402;
3232
pub const SYSCALL_DUP: usize = 24;
3333
pub const SYSCALL_PIPE: usize = 59;
34-
pub const SYSCALL_TASK_INFO: usize = 410;
34+
pub const SYSCALL_TRACE: usize = 410;
3535
pub const SYSCALL_THREAD_CREATE: usize = 460;
3636
pub const SYSCALL_WAITTID: usize = 462;
3737
pub const SYSCALL_MUTEX_CREATE: usize = 463;
@@ -210,8 +210,8 @@ pub fn sys_pipe(pipe: &mut [usize]) -> isize {
210210
syscall(SYSCALL_PIPE, [pipe.as_mut_ptr() as usize, 0, 0])
211211
}
212212

213-
pub fn sys_task_info(info: &mut TaskInfo) -> isize {
214-
syscall(SYSCALL_TASK_INFO, [info as *const _ as usize, 0, 0])
213+
pub fn sys_trace(trace_request: usize, id: usize, data: usize) -> isize {
214+
syscall(SYSCALL_TRACE, [trace_request, id, data])
215215
}
216216

217217
pub fn sys_thread_create(entry: usize, arg: usize) -> isize {
@@ -273,11 +273,7 @@ pub fn sys_sigaction(
273273
) -> isize {
274274
syscall(
275275
SYSCALL_SIGACTION,
276-
[
277-
signum as usize,
278-
action as usize,
279-
old_action as usize,
280-
],
276+
[signum as usize, action as usize, old_action as usize],
281277
)
282278
}
283279

0 commit comments

Comments
 (0)