Add initial register states to meta section; remove entry directive

It makes sense to allow users to set the initial register values. This
allows someone to e.g. enable interrupts once the VM has started, or set
the initial stack pointer value.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-03-10 12:18:31 -04:00
parent 3522b3d0cd
commit 551bd2c3f4
8 changed files with 103 additions and 11 deletions

View File

@@ -40,6 +40,13 @@
.export ivt
}
.meta {
entry: main
.section stack $0x4000 .. $0x5000 {
stack_base:
.export stack_base
}
.meta {
ip: main
sp: stack_base
ivt: ivt
}

View File

@@ -24,5 +24,5 @@
}
.meta {
entry: main
ip: main
}

View File

@@ -26,5 +26,5 @@
}
.meta {
entry: main
ip: main
}

View File

@@ -1,4 +1,13 @@
use crate::{addr::*, error::*, flags::*, inst::*, interrupt::*, mem::*, obj::obj::*, reg::*};
use crate::{
addr::*,
error::*,
flags::*,
inst::*,
interrupt::*,
mem::*,
obj::{obj::*, syn::parser},
reg::*,
};
use std::mem;
pub struct State {
@@ -37,8 +46,32 @@ impl State {
}
}
Section::Meta(MetaSection { entries }) => {
if let Some(addr) = entries.get("entry") {
self.set_reg_unchecked(IP, *addr);
macro_rules! meta_addr {
($($name:expr, $reg:expr);* $(;)?) => {{
$(
if let Some(value) = entries.get($name) {
self.set_reg_unchecked($reg, *value);
}
)*
}};
}
meta_addr!("ip", IP);
meta_addr!("sp", SP);
meta_addr!("flags", FLAGS);
meta_addr!("status", STATUS);
meta_addr!("ivt", IVT);
if let Some(value) = entries.get("fp") {
self.set_reg_unchecked(FP, *value);
} else {
self.set_reg_unchecked(FP, self.get_reg_unchecked(SP));
}
for (reg, value) in entries.iter() {
if let Some(reg) = parser::parse_reg(reg) {
self.set_reg_unchecked(reg, *value);
}
}
}
}