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}