use super::estat::Interrupt;
use bit_field::BitField;
use bitflags::bitflags;
use core::fmt::Debug;
impl_define_csr!(Ecfg,"Exception Configuration (ECFG)
This register is used to control the entry calculation method of exceptions and interrupts and the local enable bit of each interrupt.");
impl_read_csr!(0x4, Ecfg);
bitflags! {
#[derive(Debug,Copy,Clone)]
pub struct LineBasedInterrupt:usize {
const SWI0=1<<Interrupt::SWI0 as usize;
const SWI1=1<<Interrupt::SWI1 as usize;
const HWI0=1<<Interrupt::HWI0 as usize;
const HWI1=1<<Interrupt::HWI1 as usize;
const HWI2=1<<Interrupt::HWI2 as usize;
const HWI3=1<<Interrupt::HWI3 as usize;
const HWI4=1<<Interrupt::HWI4 as usize;
const HWI5=1<<Interrupt::HWI5 as usize;
const HWI6=1<<Interrupt::HWI6 as usize;
const HWI7=1<<Interrupt::HWI7 as usize;
const PMCOV=1<<Interrupt::PMI as usize;
const TIMER=1<<Interrupt::Timer as usize;
const IPI=1<<Interrupt::IPI as usize;
}
}
impl Ecfg {
pub fn lie(&self) -> LineBasedInterrupt {
LineBasedInterrupt::from_bits_truncate(self.bits.get_bits(0..13))
}
pub fn vs(&self) -> usize {
self.bits.get_bits(16..19)
}
}
impl Debug for Ecfg {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("ECFG")
.field("lie", &self.lie())
.field("vs", &self.vs())
.finish()
}
}
pub fn set_vs(vs: usize) {
set_csr_loong_bits!(0x4, 16..19, vs);
}
pub fn set_lie(lie: LineBasedInterrupt) {
set_csr_loong_bits!(0x4, 0..13, lie.bits());
}