diff --git a/kernel/src/drivers/irq/plic.rs b/kernel/src/drivers/irq/plic.rs index 2784b90..2e8f474 100644 --- a/kernel/src/drivers/irq/plic.rs +++ b/kernel/src/drivers/irq/plic.rs @@ -102,7 +102,7 @@ impl Driver for IrqPlic { } impl IrqController for IrqPlic { - fn enable(&self, irq: usize) { + fn enable(&mut self, irq: usize) { if irq == 0 || irq >= self.nr_irqs { return; } @@ -121,7 +121,7 @@ impl IrqController for IrqPlic { } } - fn disable(&self, irq: usize) { + fn disable(&mut self, irq: usize) { if irq == 0 || irq >= self.nr_irqs { return; } @@ -140,7 +140,7 @@ impl IrqController for IrqPlic { } } - fn is_pending(&self, irq: usize) -> bool { + fn is_pending(&mut self, irq: usize) -> bool { if irq == 0 || irq >= self.nr_irqs { return false; } @@ -152,7 +152,7 @@ impl IrqController for IrqPlic { val & (1 << bit) != 0 } - fn claim(&self) -> Option { + fn claim(&mut self) -> Option { let val = unsafe { self.control.as_ref().unwrap().claim.read_volatile() }; if val > 0 { @@ -162,7 +162,7 @@ impl IrqController for IrqPlic { } } - fn complete(&self, irq: usize) { + fn complete(&mut self, irq: usize) { if irq == 0 || irq >= self.nr_irqs { return; } diff --git a/kernel/src/plat/irq.rs b/kernel/src/plat/irq.rs index fe2a554..9524f39 100644 --- a/kernel/src/plat/irq.rs +++ b/kernel/src/plat/irq.rs @@ -1,3 +1,5 @@ +use super::utils::generate_driver; +use crate::drivers::irq::IrqPlic; use crate::objects::*; const IRQ_NUM: usize = 32; @@ -10,13 +12,18 @@ pub enum IrqState { Reserved, } -pub trait IrqController { - fn enable(&self, irq: usize); - fn disable(&self, irq: usize); - fn is_pending(&self, irq: usize) -> bool; - fn claim(&self) -> Option; - fn complete(&self, irq: usize); -} +generate_driver!( + IrqDriver { + (IrqPlic), + () + } : IrqController { + fn enable(&mut self, irq: usize) -> (); + fn disable(&mut self, irq: usize) -> (); + fn is_pending(&mut self, irq: usize) -> bool; + fn claim(&mut self) -> Option; + fn complete(&mut self, irq: usize) -> (); + } +); pub struct IrqManager { handler: [CapEntry; IRQ_NUM], @@ -30,5 +37,4 @@ impl IrqManager { state: [IrqState::Inactive; IRQ_NUM], } } - - } +}