mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
44 lines
1.1 KiB
Rust
44 lines
1.1 KiB
Rust
/// 系统调用号
|
|
pub mod nr;
|
|
use system_error::SystemError;
|
|
|
|
use crate::{exception::InterruptArch, kdebug, process::ProcessManager, syscall::Syscall};
|
|
|
|
use super::{interrupt::TrapFrame, CurrentIrqArch};
|
|
|
|
/// 系统调用初始化
|
|
pub fn arch_syscall_init() -> Result<(), SystemError> {
|
|
return Ok(());
|
|
}
|
|
|
|
macro_rules! syscall_return {
|
|
($val:expr, $regs:expr, $show:expr) => {{
|
|
let ret = $val;
|
|
$regs.a0 = ret;
|
|
|
|
if $show {
|
|
let pid = ProcessManager::current_pcb().pid();
|
|
crate::kdebug!("syscall return:pid={:?},ret= {:?}\n", pid, ret as isize);
|
|
}
|
|
|
|
unsafe {
|
|
CurrentIrqArch::interrupt_disable();
|
|
}
|
|
return;
|
|
}};
|
|
}
|
|
|
|
pub(super) fn syscall_handler(syscall_num: usize, frame: &mut TrapFrame) -> () {
|
|
// kdebug!("syscall_handler: syscall_num: {}", syscall_num);
|
|
unsafe {
|
|
CurrentIrqArch::interrupt_enable();
|
|
}
|
|
|
|
let args = [frame.a0, frame.a1, frame.a2, frame.a3, frame.a4, frame.a5];
|
|
syscall_return!(
|
|
Syscall::handle(syscall_num, &args, frame).unwrap_or_else(|e| e.to_posix_errno() as usize),
|
|
frame,
|
|
false
|
|
);
|
|
}
|