use core::sync::atomic::{AtomicUsize, Ordering};
#[cfg(feature = "ipi")]
pub use ax_config::devices::IPI_IRQ;
use ax_cpu::trap::irq_handler;
#[cfg(feature = "ipi")]
pub use ax_plat::irq::{IpiTarget, send_ipi};
pub use ax_plat::irq::{handle, register, set_enable, unregister};
static IRQ_HOOK: AtomicUsize = AtomicUsize::new(0);
pub fn register_irq_hook(hook: fn(usize)) -> bool {
IRQ_HOOK
.compare_exchange(
0,
hook as *const () as usize,
Ordering::Release,
Ordering::Relaxed,
)
.is_ok()
}
#[irq_handler]
pub fn handle_irq(vector: usize) -> bool {
let guard = ax_kernel_guard::NoPreempt::new();
if let Some(irq) = handle(vector) {
let hook = IRQ_HOOK.load(Ordering::Acquire);
if hook != 0 {
let hook = unsafe { core::mem::transmute::<usize, fn(usize)>(hook) };
hook(irq);
}
}
drop(guard); true
}