From 5600ebffdf12117d398476f93897a8cc289eb468 Mon Sep 17 00:00:00 2001 From: David Li Date: Thu, 14 Jan 2016 15:57:12 -0700 Subject: Match rustv refactor, check traps properly --- src/main.rs | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'src/main.rs') 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(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(memory: &mut memory::Memory, start } +fn generate_payload() -> isa::Byte { + let mut payload = rand::random::(); + while payload == shareable_cache::WRITE_TRAP_VALUE.0 || + payload == shareable_cache::AREA_TRAP_VALUE.0 { + payload = rand::random::(); + } + + 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::(); - let payload2 = rand::random::(); + 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); } -- cgit v1.2.3