@@ -22,6 +22,7 @@ use switch::__switch;
2222pub use task:: { TaskControlBlock , TaskStatus } ;
2323
2424pub use context:: TaskContext ;
25+ use crate :: syscall:: { SYSCALL_EXIT , SYSCALL_GET_TIME , SYSCALL_TRACE , SYSCALL_WRITE , SYSCALL_YIELD } ;
2526
2627/// The task manager, where all the tasks are managed.
2728///
@@ -44,6 +45,11 @@ pub struct TaskManagerInner {
4445 /// task list
4546 tasks : [ TaskControlBlock ; MAX_APP_NUM ] ,
4647 /// id of current `Running` task
48+ syscall_write_counter : [ usize ; MAX_APP_NUM ] ,
49+ syscall_exit_counter : [ usize ; MAX_APP_NUM ] ,
50+ syscall_yield_counter : [ usize ; MAX_APP_NUM ] ,
51+ syscall_get_time_counter : [ usize ; MAX_APP_NUM ] ,
52+ syscall_trace_counter : [ usize ; MAX_APP_NUM ] ,
4753 current_task : usize ,
4854}
4955
@@ -64,6 +70,11 @@ lazy_static! {
6470 inner: unsafe {
6571 UPSafeCell :: new( TaskManagerInner {
6672 tasks,
73+ syscall_write_counter: [ 0 ; MAX_APP_NUM ] ,
74+ syscall_exit_counter: [ 0 ; MAX_APP_NUM ] ,
75+ syscall_yield_counter: [ 0 ; MAX_APP_NUM ] ,
76+ syscall_get_time_counter: [ 0 ; MAX_APP_NUM ] ,
77+ syscall_trace_counter: [ 0 ; MAX_APP_NUM ] ,
6778 current_task: 0 ,
6879 } )
6980 } ,
@@ -135,6 +146,32 @@ impl TaskManager {
135146 panic ! ( "All applications completed!" ) ;
136147 }
137148 }
149+
150+ fn add_syscall_counter ( & self , syscall_id : usize ) {
151+ let mut inner = self . inner . exclusive_access ( ) ;
152+ let current = inner. current_task ;
153+ match syscall_id {
154+ SYSCALL_WRITE => inner. syscall_write_counter [ current] += 1 ,
155+ SYSCALL_EXIT => inner. syscall_exit_counter [ current] += 1 ,
156+ SYSCALL_YIELD => inner. syscall_yield_counter [ current] += 1 ,
157+ SYSCALL_GET_TIME => inner. syscall_get_time_counter [ current] += 1 ,
158+ SYSCALL_TRACE => inner. syscall_trace_counter [ current] += 1 ,
159+ _ => panic ! ( "Unsupported syscall_id: {}" , syscall_id) ,
160+ }
161+ }
162+
163+ fn get_syscall_counter ( & self , syscall_id : usize ) -> usize {
164+ let inner = self . inner . exclusive_access ( ) ;
165+ let current = inner. current_task ;
166+ match syscall_id {
167+ SYSCALL_WRITE => inner. syscall_write_counter [ current] ,
168+ SYSCALL_EXIT => inner. syscall_exit_counter [ current] ,
169+ SYSCALL_YIELD => inner. syscall_yield_counter [ current] ,
170+ SYSCALL_GET_TIME => inner. syscall_get_time_counter [ current] ,
171+ SYSCALL_TRACE => inner. syscall_trace_counter [ current] ,
172+ _ => panic ! ( "Unsupported syscall_id: {}" , syscall_id) ,
173+ }
174+ }
138175}
139176
140177/// Run the first task in task list.
@@ -169,3 +206,13 @@ pub fn exit_current_and_run_next() {
169206 mark_current_exited ( ) ;
170207 run_next_task ( ) ;
171208}
209+
210+ /// Add the current 'Running' task's syscall counter by syscall_id.
211+ pub fn add_syscall_counter ( syscall_id : usize ) {
212+ TASK_MANAGER . add_syscall_counter ( syscall_id) ;
213+ }
214+
215+ /// Get the current 'Running' task's syscall counter by syscall_id.
216+ pub fn get_syscall_counter ( syscall_id : usize ) -> isize {
217+ TASK_MANAGER . get_syscall_counter ( syscall_id) . try_into ( ) . unwrap ( )
218+ }
0 commit comments