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