use crate_interface::{call_interface, def_interface};
use memory_addr::VirtAddr;
use page_table_entry::MappingFlags;
#[def_interface]
pub trait TrapHandler {
fn handle_irq(irq_num: usize, from_user: bool);
#[cfg(feature = "monolithic")]
fn handle_syscall(syscall_id: usize, args: [usize; 6]) -> isize;
#[cfg(feature = "monolithic")]
fn handle_page_fault(addr: VirtAddr, flags: MappingFlags);
#[cfg(feature = "signal")]
fn handle_signal();
}
#[allow(dead_code)]
pub(crate) fn handle_irq_extern(irq_num: usize, from_user: bool) {
call_interface!(TrapHandler::handle_irq, irq_num, from_user);
}
#[allow(dead_code)]
#[cfg(feature = "monolithic")]
#[no_mangle]
pub(crate) fn handle_syscall(syscall_id: usize, args: [usize; 6]) -> isize {
call_interface!(TrapHandler::handle_syscall, syscall_id, args)
}
#[allow(dead_code)]
#[cfg(feature = "monolithic")]
pub(crate) fn handle_page_fault(addr: VirtAddr, flags: MappingFlags) {
call_interface!(TrapHandler::handle_page_fault, addr, flags);
}
#[allow(dead_code)]
#[cfg(feature = "signal")]
pub(crate) fn handle_signal() {
call_interface!(TrapHandler::handle_signal);
}