Add memory and register checking when required in the VM

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-02-09 14:10:02 -05:00
parent f1ed41f98b
commit 00027c4542
4 changed files with 71 additions and 44 deletions

View File

@@ -10,7 +10,7 @@ impl Vm {
($mapping:expr) => {{
let (r1, r2) = cursor.next_regs()?;
next_ip = cursor.position();
let value = ($mapping)(self.get_reg(r1), self.get_reg(r2));
let value = ($mapping)(self.get_reg_checked(r1)?, self.get_reg_checked(r2)?);
self.set_reg(r1, value);
}};
}
@@ -25,7 +25,7 @@ impl Vm {
INV => {
let r1 = cursor.next_reg()?;
next_ip = cursor.position();
let value = self.get_reg(r1);
let value = self.get_reg_checked(r1)?;
self.set_reg(r1, !value);
}
NOT => {
@@ -80,8 +80,8 @@ impl Vm {
LOAD => {
let (r1, r2) = cursor.next_regs()?;
next_ip = cursor.position();
let value = self.load(r2);
self.set_reg(r1, value);
let value = self.load(r2)?;
self.set_reg_checked(r1, value)?;
}
REGCOPY => math_inst!(|_: u64, w2: u64| w2),
STOREIMM64 => {
@@ -101,14 +101,14 @@ impl Vm {
MEMCOPY => {
let (r1, r2) = cursor.next_regs()?;
next_ip = cursor.position();
let value = self.load(r2);
self.store(r1, value);
let value = self.load(r2)?;
self.store(r1, value)?;
}
STORE => {
let (r1, r2) = cursor.next_regs()?;
next_ip = cursor.position();
let value = self.get_reg(r1);
self.store(r2, value);
self.store(r2, value)?;
}
HALT => {
next_ip = cursor.position();