From ce352c000cb5b952d84f2f950cb549eef48978c6 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Wed, 4 Mar 2020 14:37:00 -0500 Subject: [PATCH] Add IVT register and interrupt module Signed-off-by: Alek Ratzloff --- src/libvm/src/interrupt.rs | 19 +++++++++ src/libvm/src/lib.rs | 1 + src/libvm/src/obj/syn/lexer.l | 1 + src/libvm/src/obj/syn/parser.y | 1 + src/libvm/src/reg.rs | 71 ++++++++++++++++++---------------- 5 files changed, 59 insertions(+), 34 deletions(-) create mode 100644 src/libvm/src/interrupt.rs diff --git a/src/libvm/src/interrupt.rs b/src/libvm/src/interrupt.rs new file mode 100644 index 0000000..aa92f3c --- /dev/null +++ b/src/libvm/src/interrupt.rs @@ -0,0 +1,19 @@ +macro_rules! interrupts { + { + $($variant:ident = $value:expr),* $(,)? + } => { + pub type IntVec = u8; + + $( + #[allow(dead_code)] + pub const $variant: IntVec = $value; + )* + }; +} + +interrupts! { + DIVIDE_BY_ZERO = 0, + INVALID_OPCODE = 1, + ILLEGAL_MEMORY_ADDRESS = 2, + HARDWARE_EVENT = 3, +} diff --git a/src/libvm/src/lib.rs b/src/libvm/src/lib.rs index 731a6a7..9c3b2d3 100644 --- a/src/libvm/src/lib.rs +++ b/src/libvm/src/lib.rs @@ -4,6 +4,7 @@ pub mod addr; pub mod error; pub mod flags; pub mod inst; +pub mod interrupt; pub mod mem; pub mod obj; pub mod reg; diff --git a/src/libvm/src/obj/syn/lexer.l b/src/libvm/src/obj/syn/lexer.l index 1f1c497..fd75e52 100644 --- a/src/libvm/src/obj/syn/lexer.l +++ b/src/libvm/src/obj/syn/lexer.l @@ -60,6 +60,7 @@ dump "DUMP" %fp "REG_FP" %flags "REG_FLAGS" %null "REG_NULL" +%ivt "REG_IVT" %status "REG_STATUS" %r[0-9]{1,2} "REG_GENERAL" [a-zA-Z_][a-zA-Z0-9_]* "NAME" diff --git a/src/libvm/src/obj/syn/parser.y b/src/libvm/src/obj/syn/parser.y index dff3d4c..3f6c4a7 100644 --- a/src/libvm/src/obj/syn/parser.y +++ b/src/libvm/src/obj/syn/parser.y @@ -137,6 +137,7 @@ Reg -> Reg: | 'REG_FP' { FP } | 'REG_FLAGS' { FLAGS } | 'REG_NULL' { NULL } + | 'REG_IVT' { IVT } | 'REG_STATUS' { STATUS } | 'REG_GENERAL' { let v = $1.expect("could not parse reg"); diff --git a/src/libvm/src/reg.rs b/src/libvm/src/reg.rs index 5edd911..b9eff86 100644 --- a/src/libvm/src/reg.rs +++ b/src/libvm/src/reg.rs @@ -36,41 +36,44 @@ registers! { // Zero NULL = 4, - // General status code - STATUS = 5, + // Interrupt vector table pointer + IVT = 5, - R00 = 6, - R01 = 7, - R02 = 8, - R03 = 9, - R04 = 10, - R05 = 11, - R06 = 12, - R07 = 13, - R08 = 14, - R09 = 15, - R10 = 16, - R11 = 17, - R12 = 18, - R13 = 19, - R14 = 20, - R15 = 21, - R16 = 22, - R17 = 23, - R18 = 24, - R19 = 25, - R20 = 26, - R21 = 27, - R22 = 28, - R23 = 29, - R24 = 30, - R25 = 31, - R26 = 32, - R27 = 33, - R28 = 34, - R29 = 35, - R30 = 36, - R31 = 37, + // General status code + STATUS = 6, + + R00 = 7, + R01 = 8, + R02 = 9, + R03 = 10, + R04 = 11, + R05 = 12, + R06 = 13, + R07 = 14, + R08 = 15, + R09 = 16, + R10 = 17, + R11 = 18, + R12 = 19, + R13 = 20, + R14 = 21, + R15 = 22, + R16 = 23, + R17 = 24, + R18 = 25, + R19 = 26, + R20 = 27, + R21 = 28, + R22 = 29, + R23 = 30, + R24 = 31, + R25 = 32, + R26 = 33, + R27 = 34, + R28 = 35, + R29 = 36, + R30 = 37, + R31 = 38, } pub const LAST_REG: Reg = 63;