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            // crate::println!("Syscall number: {}", syscall_number);
34            if syscall_number == 0 {
35                return Err("Invalid syscall number");
36            }
37            match syscall_number {
38                $(
39                    $num => {
40                        Ok($func(trapframe))
41                    }
42                )*
43                _ => {
44                    Err("Invalid syscall number")
45                }
46            }
47        }
48    };
49}