From 2a5bbfe8131e5e863824009cb0eec3d4599d5d7b Mon Sep 17 00:00:00 2001 From: David Li Date: Tue, 5 Jan 2016 11:03:17 -0700 Subject: Initial commit --- .gitignore | 2 ++ Cargo.lock | 20 ++++++++++++++++++++ Cargo.toml | 7 +++++++ src/main.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7aef303 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target +*~ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3c80b43 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,20 @@ +[root] +name = "cacheracer" +version = "0.1.0" +dependencies = [ + "rustv 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "elfloader32" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "elfloader32 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..79086b6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "cacheracer" +version = "0.1.0" +authors = ["David Li "] + +[dependencies] +rustv = "0.2.1" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..b27a89c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,57 @@ +extern crate rustv; + +use std::fs::File; +use std::io::Read; +use std::rc::Rc; +use std::cell::RefCell; +use rustv::elfloader; +use rustv::isa; +use rustv::memory; +use rustv::simulator; + +fn main() { + let mut f = File::open("../riscv/kernel").unwrap(); + let mut buffer = Vec::new(); + + 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 mut text = None; + let mut data = None; + for p in elf.section_headers() { + if p.name.0 == 0x1b { + text = Some((elf.section_data(p), p.addr)); + } + else if p.name.0 == 0x33 { + data = Some((elf.section_data(p), p.addr)); + } + } + + let (text, text_offset) = text.unwrap(); + let (data, data_offset) = data.unwrap(); + + let mmu = memory::IdentityMmu::new(); + let mmu2 = memory::ReverseMmu::new(0x8000); + let mut memory = memory::Memory::new(0x10000); + memory.write_segment(&mmu, text, text_offset as usize); + memory.write_segment(&mmu, data, data_offset as usize); + memory.write_segment(&mmu2, text, text_offset as usize); + memory.write_segment(&mmu2, data, data_offset as usize); + + let memory_box = Box::new(memory) as Box; + let memory_ref = Rc::new(RefCell::new(memory_box)); + let cache = memory::DirectMappedCache::new(4, 4, memory_ref.clone()); + let cache_box = Box::new(cache) as Box; + let cache_ref = Rc::new(RefCell::new(cache_box)); + let core = simulator::Core::new( + start, 0x1000, + cache_ref.clone(), Box::new(mmu)); + let core2 = simulator::Core::new( + start, 0x3000, + cache_ref.clone(), Box::new(mmu2)); + let cores = vec![core, core2]; + let mut simulator = simulator::Simulator::new(cores, memory_ref.clone()); + simulator.run(); +} -- cgit v1.2.3