aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorDavid Li <li.davidm96@gmail.com>2016-01-14 15:57:12 -0700
committerDavid Li <li.davidm96@gmail.com>2016-01-14 15:57:12 -0700
commit5600ebffdf12117d398476f93897a8cc289eb468 (patch)
tree3a8fd401efb4de13704970f715e61adeec7a61a3 /src/main.rs
parent367a945a6a921e4580bb7c1d8bd1db51de0dec2f (diff)
Match rustv refactor, check traps properly
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs36
1 files changed, 24 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index 615a965..ce1f336 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,5 @@
+#![feature(augmented_assignments)]
+
extern crate docopt;
#[macro_use] extern crate log;
extern crate env_logger;
@@ -19,7 +21,7 @@ use std::cell::RefCell;
use docopt::Docopt;
use rustv::elfloader;
-use rustv::isa;
+use rustv::isa::{self, IsaType};
use rustv::memory;
use rustv::memory::Mmu;
use rustv::simulator;
@@ -53,7 +55,7 @@ fn load_program<T: memory::Mmu>(memory: &mut memory::Memory,
f.read_to_end(&mut buffer).unwrap();
let elf = elfloader::ElfBinary::new("test", &buffer).unwrap();
- let start = elf.file_header().entry as isa::Address;
+ let start = isa::Word(elf.file_header().entry);
for p in elf.section_headers() {
if p.flags.0 & elfloader::elf::SHF_ALLOC.0 != 0 {
@@ -64,6 +66,16 @@ fn load_program<T: memory::Mmu>(memory: &mut memory::Memory,
start
}
+fn generate_payload() -> isa::Byte {
+ let mut payload = rand::random::<u8>();
+ while payload == shareable_cache::WRITE_TRAP_VALUE.0 ||
+ payload == shareable_cache::AREA_TRAP_VALUE.0 {
+ payload = rand::random::<u8>();
+ }
+
+ isa::Byte(payload)
+}
+
fn main() {
env_logger::init().unwrap();
@@ -73,14 +85,14 @@ fn main() {
let mmu = memory::IdentityMmu::new();
// TODO: account for word-vs-byte addressed. Use newtype pattern?
- let mmu2 = memory::ReverseMmu::new(0x4000000);
+ let mmu2 = memory::ReverseMmu::new(isa::Word(0x4000000));
let mut memory = memory::Memory::new(0x1000000);
let start1 = load_program(&mut memory, &mmu, &args.arg_program1);
let start2 = load_program(&mut memory, &mmu2, &args.arg_program2);
- let payload1 = rand::random::<u8>();
- let payload2 = rand::random::<u8>();
+ let payload1 = generate_payload();
+ let payload2 = generate_payload();
let memory = MemoryTracker::new(memory, payload1, payload2);
// TODO: initialize global data
@@ -99,11 +111,11 @@ fn main() {
ShareableCache::new(i, cache_ref.clone(), cache2_ref.clone())));
core_caches.push(core_cache.clone());
let mut core = simulator::Core::new(
- i, start1, (0x100000 * (i + 1)) as u32, core_cache,
+ i, start1, isa::Word(0x100000 * (i + 1) as u32), core_cache,
Box::new(memory::IdentityMmu::new())
);
- core.registers().write_word(isa::Register::X10, i as isa::Word);
- core.registers().write_word(isa::Register::X11, payload1 as isa::Word);
+ core.registers().write_word(isa::Register::X10, isa::Word(i as u32));
+ core.registers().write_word(isa::Register::X11, payload1.as_word());
cores.push(core);
}
@@ -112,11 +124,11 @@ fn main() {
ShareableCache::new(i, cache2_ref.clone(), cache_ref.clone())));
core_caches.push(core_cache.clone());
let mut core = simulator::Core::new(
- i, start2, (0x100000 * (i + 1)) as u32, core_cache,
- Box::new(memory::ReverseMmu::new(0x4000000))
+ i, start2, isa::Word(0x100000 * (i + 1) as u32), core_cache,
+ Box::new(memory::ReverseMmu::new(isa::Word(0x4000000)))
);
- core.registers().write_word(isa::Register::X10, (i - 4) as isa::Word);
- core.registers().write_word(isa::Register::X11, payload2 as isa::Word);
+ core.registers().write_word(isa::Register::X10, isa::Word((i - 4) as u32));
+ core.registers().write_word(isa::Register::X11, payload2.as_word());
cores.push(core);
}