summaryrefslogtreecommitdiff
path: root/src/exception.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/exception.rs')
-rw-r--r--src/exception.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/exception.rs b/src/exception.rs
new file mode 100644
index 0000000..301b84c
--- /dev/null
+++ b/src/exception.rs
@@ -0,0 +1,64 @@
+/*
+ Copyright 2021-2023 Gabriel Jensen.
+
+ This file is part of Luma.
+
+ Luma is free software: you can redistribute it
+ and/or modify it under the terms of the GNU
+ Affero General Public License as published by
+ the Free Software Foundation, either version 3
+ of the License, or (at your option) any later
+ version.
+
+ Luma is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU
+ Affero General Public License along with Luma.
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+
+use crate::cpu_mode::CpuMode;
+
+#[repr(u8)]
+#[derive(Clone, Copy)]
+pub enum Exception {
+ Reset,
+ UndefinedInstruction,
+ SoftwareInterrupt,
+ PrefetchAbort,
+ DataAbort,
+ InterruptRequest,
+ FastInterruptRequest,
+}
+
+impl Exception {
+ pub fn mode(self) -> CpuMode {
+ return match self {
+ Self::Reset => CpuMode::Supervisor,
+ Self::UndefinedInstruction => CpuMode::Undefined,
+ Self::SoftwareInterrupt => CpuMode::Supervisor,
+ Self::PrefetchAbort => CpuMode::Abort,
+ Self::DataAbort => CpuMode::Abort,
+ Self::InterruptRequest => CpuMode::InterruptRequest,
+ Self::FastInterruptRequest => CpuMode::FastInterruptRequest,
+ };
+ }
+
+ pub fn vector_address(self) -> u32 {
+ use Exception::*;
+
+ return match self {
+ Reset => 0x00000000,
+ UndefinedInstruction => 0x00000004,
+ SoftwareInterrupt => 0x00000008,
+ PrefetchAbort => 0x0000000C,
+ DataAbort => 0x00000010,
+ InterruptRequest => 0x00000018,
+ FastInterruptRequest => 0x0000001C,
+ };
+ }
+}