pub use riscv::{
CoreInterruptNumber, ExceptionNumber, InterruptNumber,
interrupt::{Interrupt, Trap},
result::{Error as RegisterError, Result as RegisterResult},
};
impl super::Exit {
pub fn cause(&self) -> RegisterResult<Trap<Interrupt, Exception>> {
riscv::register::scause::Scause::from_bits(self.scause)
.cause()
.try_into()
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(usize)]
pub enum Exception {
InstructionMisaligned = 0,
InstructionFault = 1,
IllegalInstruction = 2,
Breakpoint = 3,
LoadMisaligned = 4,
LoadFault = 5,
StoreMisaligned = 6,
StoreFault = 7,
UserEnvCall = 8,
SupervisorEnvCall = 9,
VirtualSupervisorEnvCall = 10,
InstructionPageFault = 12,
LoadPageFault = 13,
StorePageFault = 15,
InstructionGuestPageFault = 20,
LoadGuestPageFault = 21,
VirtualInstruction = 22,
StoreGuestPageFault = 23,
}
unsafe impl ExceptionNumber for Exception {
const MAX_EXCEPTION_NUMBER: usize = Self::StoreGuestPageFault as usize;
#[inline]
fn number(self) -> usize {
self as usize
}
#[inline]
fn from_number(value: usize) -> RegisterResult<Self> {
match value {
0 => Ok(Self::InstructionMisaligned),
1 => Ok(Self::InstructionFault),
2 => Ok(Self::IllegalInstruction),
3 => Ok(Self::Breakpoint),
4 => Ok(Self::LoadMisaligned),
5 => Ok(Self::LoadFault),
6 => Ok(Self::StoreMisaligned),
7 => Ok(Self::StoreFault),
8 => Ok(Self::UserEnvCall),
9 => Ok(Self::SupervisorEnvCall),
10 => Ok(Self::VirtualSupervisorEnvCall),
12 => Ok(Self::InstructionPageFault),
13 => Ok(Self::LoadPageFault),
15 => Ok(Self::StorePageFault),
20 => Ok(Self::InstructionGuestPageFault),
21 => Ok(Self::LoadGuestPageFault),
22 => Ok(Self::VirtualInstruction),
23 => Ok(Self::StoreGuestPageFault),
_ => Err(RegisterError::InvalidVariant(value)),
}
}
}