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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -24,5 +24,5 @@
|
||||
}
|
||||
|
||||
.meta {
|
||||
entry: main
|
||||
ip: main
|
||||
}
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
}
|
||||
|
||||
.meta {
|
||||
entry: main
|
||||
ip: main
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user