revert scause specific trap/exceptions

This commit is contained in:
Ales Katona 2019-08-31 16:09:47 -06:00
parent f443bcf698
commit 13831f7a80
No known key found for this signature in database
GPG Key ID: 08C459E2D8ABB7E8
1 changed files with 70 additions and 2 deletions

View File

@ -3,14 +3,82 @@
use bit_field::BitField; use bit_field::BitField;
use core::mem::size_of; use core::mem::size_of;
pub use crate::register::mcause::{Interrupt, Exception, Trap};
/// scause register /// scause register
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct Scause { pub struct Scause {
bits: usize, bits: usize,
} }
/// Trap Cause
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Trap {
Interrupt(Interrupt),
Exception(Exception),
}
/// Interrupt
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Interrupt {
UserSoft,
SupervisorSoft,
UserTimer,
SupervisorTimer,
UserExternal,
SupervisorExternal,
Unknown,
}
/// Exception
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Exception {
InstructionMisaligned,
InstructionFault,
IllegalInstruction,
Breakpoint,
LoadFault,
StoreMisaligned,
StoreFault,
UserEnvCall,
InstructionPageFault,
LoadPageFault,
StorePageFault,
Unknown,
}
impl Interrupt {
pub fn from(nr: usize) -> Self {
match nr {
0 => Interrupt::UserSoft,
1 => Interrupt::SupervisorSoft,
4 => Interrupt::UserTimer,
5 => Interrupt::SupervisorTimer,
8 => Interrupt::UserExternal,
9 => Interrupt::SupervisorExternal,
_ => Interrupt::Unknown,
}
}
}
impl Exception {
pub fn from(nr: usize) -> Self {
match nr {
0 => Exception::InstructionMisaligned,
1 => Exception::InstructionFault,
2 => Exception::IllegalInstruction,
3 => Exception::Breakpoint,
5 => Exception::LoadFault,
6 => Exception::StoreMisaligned,
7 => Exception::StoreFault,
8 => Exception::UserEnvCall,
12 => Exception::InstructionPageFault,
13 => Exception::LoadPageFault,
15 => Exception::StorePageFault,
_ => Exception::Unknown,
}
}
}
impl Scause { impl Scause {
/// Returns the contents of the register as raw bits /// Returns the contents of the register as raw bits
#[inline] #[inline]