From 85e5f7a2bf0db9a8e842d953f9d941627928a578 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Tue, 10 Mar 2020 12:20:59 -0400 Subject: [PATCH] Add INTERRUPT_ENABLE flag, fix bug with register preservation Signed-off-by: Alek Ratzloff --- src/libvm/src/flags.rs | 1 + src/libvm/src/state.rs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libvm/src/flags.rs b/src/libvm/src/flags.rs index e35bbfd..efbed94 100644 --- a/src/libvm/src/flags.rs +++ b/src/libvm/src/flags.rs @@ -4,5 +4,6 @@ bitflags! { pub struct Flags: u64 { const HALT = 1; const COMPARE = 1 << 1; + const INTERRUPT_ENABLE = 1 << 2; } } diff --git a/src/libvm/src/state.rs b/src/libvm/src/state.rs index 64e58bc..3938110 100644 --- a/src/libvm/src/state.rs +++ b/src/libvm/src/state.rs @@ -225,11 +225,10 @@ impl State { self.push(Source::Imm(status))?; // push R0 .. R31 - for reg in R00 ..= R31 { + for reg in R00..=R31 { self.push(Source::Reg(reg))?; } - let sp = self.sp(); self.set_reg_unchecked(FP, sp - Self::INTERRUPT_REG_SPACE); self.set_reg_unchecked(R00, index as u64); @@ -246,7 +245,8 @@ impl State { self.set_reg_unchecked(SP, sp); // pop R31 .. R0 - for reg in R31 ..= R00 { + for reg in R00..=R31 { + let reg = R31 - reg + R00; self.pop(Dest::Reg(reg))?; } self.pop(Dest::Reg(STATUS))?;