kernel/abi/xv6/riscv64/
macros.rs

1/// Define syscall table and syscall handler for xv6-riscv64
2///
3/// # Example
4/// ```
5/// syscall_table! {
6///    Invalid = 0 => |_:&mut Xv6Riscv64Abi, _: &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        /// * `abi` - The ABI module instance
25        /// * `trapframe` - The trapframe
26        /// 
27        /// # Returns
28        /// The result of the syscall handler
29        /// 
30        /// # Errors
31        /// Returns an error if the syscall number is invalid
32        pub fn syscall_handler(abi: &mut crate::abi::xv6::riscv64::Xv6Riscv64Abi, trapframe: &mut crate::arch::Trapframe) -> Result<usize, &'static str> {
33            let syscall_number = trapframe.get_arg(7);
34            // crate::println!("Syscall number: {}", syscall_number);
35            if syscall_number == 0 {
36                return Err("Invalid syscall number");
37            }
38            match syscall_number {
39                $(
40                    $num => {
41                        Ok($func(abi, trapframe))
42                    }
43                )*
44                _ => {
45                    crate::println!("Syscall number: {}", syscall_number);
46                    Err("Invalid syscall number")
47                }
48            }
49        }
50    };
51}