LoGin 471d65cf15
feat(riscv): riscv下能够运行hello world用户程序 (#770)
* feat(riscv): riscv下能够运行hello world用户程序
2024-04-26 11:59:47 +08:00

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
);
}