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}