add in test cases

feature/trap-handlers
able 2023-05-22 22:47:29 -05:00
parent e3277e99a7
commit 49a45d62c6
4 changed files with 76 additions and 24 deletions

View File

@ -444,15 +444,26 @@ F5-F9 {:016X} {:016X} {:016X} {:016X} {:016X}",
(255, int) => { (255, int) => {
trace!("Enviroment Call {}", int); trace!("Enviroment Call {}", int);
let ret = self.enviroment_call_table[int as usize](self); let ecall = self.enviroment_call_table[int as usize];
match ret {
Ok(eng) => { match ecall {
trace!("Resuming execution at {}", eng.index); Some(call) => {
let ret = call(self);
match ret {
Ok(eng) => {
trace!("Resuming execution at {}", eng.index);
}
Err(err) => {
return Err(HostError(err));
}
}
} }
Err(err) => { None => {
return Err(HostError(err)); return Err(InvalidSystemCall(int));
} }
} }
self.index += 2; self.index += 2;
} }

View File

@ -2,6 +2,7 @@ use {
super::Engine, super::Engine,
crate::{HaltStatus, RuntimeErrors}, crate::{HaltStatus, RuntimeErrors},
alloc::vec, alloc::vec,
RuntimeErrors::*,
}; };
#[test] #[test]
@ -30,7 +31,7 @@ fn jump_out_of_bounds() {
let prog = vec![JUMP as u8, 0, 0, 0, 0, 0, 0, 1, 0]; let prog = vec![JUMP as u8, 0, 0, 0, 0, 0, 0, 1, 0];
let mut eng = Engine::new(prog); let mut eng = Engine::new(prog);
let ret = eng.run(); let ret = eng.run();
assert_eq!(ret, Err(RuntimeErrors::InvalidJumpAddress(256))); assert_eq!(ret, Err(InvalidJumpAddress(256)));
} }
#[test] #[test]
@ -38,5 +39,44 @@ fn invalid_system_call() {
let prog = vec![255, 0]; let prog = vec![255, 0];
let mut eng = Engine::new(prog); let mut eng = Engine::new(prog);
let ret = eng.run(); let ret = eng.run();
// assert_eq!(ret, ); assert_eq!(ret, Err(InvalidSystemCall(0)));
}
#[test]
fn add_u8() {
use crate::engine::{Operations::ADD, SubTypes::EightBit};
let prog = vec![ADD as u8, EightBit as u8, 1, 1, 0xA0];
let mut eng = Engine::new(prog);
let _ = eng.run();
assert_eq!(eng.registers.a0, 2);
}
#[test]
fn sub_u8() {
use crate::engine::{Operations::SUB, SubTypes::EightBit};
let prog = vec![SUB as u8, EightBit as u8, 2, 1, 0xA0];
let mut eng = Engine::new(prog);
let _ = eng.run();
assert_eq!(eng.registers.a0, 1);
}
#[test]
fn mul_u8() {
use crate::engine::{Operations::MUL, SubTypes::EightBit};
let prog = vec![MUL as u8, EightBit as u8, 1, 1, 0xA0];
let mut eng = Engine::new(prog);
let _ = eng.run();
assert_eq!(eng.registers.a0, 2);
}
#[test]
fn div_u8() {
use crate::engine::{Operations::DIV, SubTypes::EightBit};
let prog = vec![DIV as u8, EightBit as u8, 1, 1, 0xA0];
let mut eng = Engine::new(prog);
let _ = eng.run();
assert_eq!(eng.registers.a0, 2);
} }

View File

@ -12,6 +12,7 @@ pub enum RuntimeErrors {
HostError(u64), HostError(u64),
PageNotMapped(u64), PageNotMapped(u64),
InvalidJumpAddress(u64), InvalidJumpAddress(u64),
InvalidSystemCall(u8),
} }
// If you solve the halting problem feel free to remove this // If you solve the halting problem feel free to remove this

View File

@ -7,28 +7,28 @@ use hbvm::{
fn main() -> Result<(), RuntimeErrors> { fn main() -> Result<(), RuntimeErrors> {
#[rustfmt::skip] #[rustfmt::skip]
let prog: Vec<u8> = vec![ let prog: Vec<u8> = vec![
NOP as u8, NOP as u8, // NOP as u8, NOP as u8,
255, 10, // 255, 10,
ADD as u8, EightBit as u8, 100, 20, 0xA7, ADD as u8, EightBit as u8, 100, 20, 0xA7,
ADD as u8, // ADD as u8,
EightBit as u8, 1, 0, 0xB0, // EightBit as u8, 1, 0, 0xB0,
ADD as u8, // ADD as u8,
SixtyFourBit as u8, // SixtyFourBit as u8,
0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 2, 0xD0, // 0, 0, 0, 0, 0, 0, 0, 2, 0xD0,
SUB as u8, EightBit as u8, 255, 0, 0xA7, // SUB as u8, EightBit as u8, 255, 0, 0xA7,
DIV as u8, EightBit as u8, 12, 5, 0xA8, // DIV as u8, EightBit as u8, 12, 5, 0xA8,
ADD as u8, Register8 as u8, 0xA7, 0xB0, 0xA7, // ADD as u8, Register8 as u8, 0xA7, 0xB0, 0xA7,
LOAD as u8, AddrToReg as u8, // LOAD as u8, AddrToReg as u8,
0, 0, 0, 0, 0, 0, 0, 2, // 0, 0, 0, 0, 0, 0, 0, 2,
0xA0, // 0xA0,
JUMP as u8, 0, 0, 0, 0, 0, 0, 0, 0, // JUMP as u8, 0, 0, 0, 0, 0, 0, 0, 0,
]; ];
let mut eng = Engine::new(prog); let mut eng = Engine::new(prog);
// eng.set_timer_callback(time); // eng.set_timer_callback(time);
eng.enviroment_call_table[10] = print_fn; eng.enviroment_call_table[10] = Some(print_fn);
eng.run()?; eng.run()?;
eng.dump(); eng.dump();
println!("{:#?}", eng.registers); println!("{:#?}", eng.registers);