xref: /DragonOS/kernel/src/arch/riscv64/syscall/mod.rs (revision f75cb0f8ed754d94c3b2924519b785db3321c1d9)
14fda81ceSLoGin /// 系统调用号
24fda81ceSLoGin pub mod nr;
391e9d4abSLoGin use system_error::SystemError;
491e9d4abSLoGin 
5*f75cb0f8SLoGin use crate::{exception::InterruptArch, process::ProcessManager, syscall::Syscall};
64fda81ceSLoGin 
74fda81ceSLoGin use super::{interrupt::TrapFrame, CurrentIrqArch};
84fda81ceSLoGin 
94fda81ceSLoGin /// 系统调用初始化
104fda81ceSLoGin pub fn arch_syscall_init() -> Result<(), SystemError> {
1140169973SLoGin     return Ok(());
124fda81ceSLoGin }
134fda81ceSLoGin 
1423ef2b33SLoGin macro_rules! syscall_return {
1523ef2b33SLoGin     ($val:expr, $regs:expr, $show:expr) => {{
1623ef2b33SLoGin         let ret = $val;
1723ef2b33SLoGin         $regs.a0 = ret;
1823ef2b33SLoGin 
1923ef2b33SLoGin         if $show {
2023ef2b33SLoGin             let pid = ProcessManager::current_pcb().pid();
2123ef2b33SLoGin             crate::kdebug!("syscall return:pid={:?},ret= {:?}\n", pid, ret as isize);
2223ef2b33SLoGin         }
2323ef2b33SLoGin 
2423ef2b33SLoGin         unsafe {
2523ef2b33SLoGin             CurrentIrqArch::interrupt_disable();
2623ef2b33SLoGin         }
2723ef2b33SLoGin         return;
2823ef2b33SLoGin     }};
2923ef2b33SLoGin }
3023ef2b33SLoGin 
3123ef2b33SLoGin pub(super) fn syscall_handler(syscall_num: usize, frame: &mut TrapFrame) -> () {
32471d65cfSLoGin     // kdebug!("syscall_handler: syscall_num: {}", syscall_num);
334fda81ceSLoGin     unsafe {
344fda81ceSLoGin         CurrentIrqArch::interrupt_enable();
354fda81ceSLoGin     }
3623ef2b33SLoGin 
3723ef2b33SLoGin     let args = [frame.a0, frame.a1, frame.a2, frame.a3, frame.a4, frame.a5];
3823ef2b33SLoGin     syscall_return!(
3923ef2b33SLoGin         Syscall::handle(syscall_num, &args, frame).unwrap_or_else(|e| e.to_posix_errno() as usize),
4023ef2b33SLoGin         frame,
4123ef2b33SLoGin         false
4223ef2b33SLoGin     );
434fda81ceSLoGin }
44