kernel/syscall/macros.rs
1/// Define syscall table and syscall handler
2///
3/// # Example
4/// ```
5/// syscall_table! {
6/// Invalid = 0 => |_: &mut Trapframe| {
7/// 0
8/// },
9/// SomeSyscall = 1 => sys_somecall,
10/// }
11/// ```
12macro_rules! syscall_table {
13 ( $( $name:ident = $num:expr => $func:expr ),* $(,)? ) => {
14 #[derive(Debug)]
15 pub enum Syscall {
16 $(
17 $name = $num,
18 )*
19 }
20
21 /// Syscall handler
22 ///
23 /// # Arguments
24 /// * `trapframe` - The trapframe
25 ///
26 /// # Returns
27 /// The result of the syscall handler
28 ///
29 /// # Errors
30 /// Returns an error if the syscall number is invalid
31 pub fn syscall_handler(trapframe: &mut Trapframe) -> Result<usize, &'static str> {
32 let syscall_number = trapframe.get_syscall_number();
33 if syscall_number == 0 {
34 return Err("Invalid syscall number");
35 }
36 match syscall_number {
37 $(
38 $num => {
39 Ok($func(trapframe))
40 }
41 )*
42 _ => {
43 Err("Invalid syscall number")
44 }
45 }
46 }
47 };
48}