From c17e1ab26f4d6cdb6064241c85ff84029b3e0747 Mon Sep 17 00:00:00 2001
From: David Li
Date: Sat, 9 Jan 2016 15:35:32 -0700
Subject: Add secondary cache syscalls
---
src/system.rs | 35 ++++++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/src/system.rs b/src/system.rs
index faadb13..b8b928e 100644
--- a/src/system.rs
+++ b/src/system.rs
@@ -1,4 +1,6 @@
use std;
+use std::cell::RefCell;
+use std::rc::Rc;
use rustv::isa;
use rustv::memory::SharedMemory;
@@ -6,20 +8,27 @@ use rustv::register_file::RegisterFile;
use rustv::syscall;
use rustv::trap::Trap;
+use shareable_cache::ShareableCache;
+
pub struct SyscallHandler<'a> {
memory: SharedMemory<'a>,
+ caches: Vec>>>,
}
impl<'a> SyscallHandler<'a> {
- pub fn new(memory: SharedMemory<'a>) -> SyscallHandler<'a> {
+ pub fn new(memory: SharedMemory<'a>,
+ caches: Vec>>>)
+ -> SyscallHandler<'a> {
SyscallHandler {
- memory: memory
+ memory: memory,
+ caches: caches,
}
}
}
impl<'a> SyscallHandler<'a> {
- fn print(&mut self, registers: &mut RegisterFile) -> Option {
+ fn print(&mut self, core_id: usize,
+ registers: &mut RegisterFile) -> Option {
let mut base = registers.read_word(isa::Register::X11);
let mut string = vec![];
@@ -44,19 +53,31 @@ impl<'a> SyscallHandler<'a> {
println!("Error printing string: not valid UTF-8: {:?}", result);
}
None
+ }
+ fn enable_secondary(&mut self, core_id: usize,
+ registers: &mut RegisterFile) -> Option {
+ self.caches[core_id].borrow_mut().enable_secondary();
+ None
+ }
+
+ fn disable_secondary(&mut self, core_id: usize,
+ registers: &mut RegisterFile) -> Option {
+ self.caches[core_id].borrow_mut().disable_secondary();
+ None
}
}
impl<'a> syscall::SyscallHandler for SyscallHandler<'a> {
// TODO: is trap really appropriate here?
- fn syscall(&mut self, registers: &mut RegisterFile) -> Option {
+ fn syscall(&mut self, core_id: usize,
+ registers: &mut RegisterFile) -> Option {
let syscall_number = registers.read_word(isa::Register::X10);
match syscall_number {
- 22 => {
- self.print(registers)
- }
+ 22 => self.print(core_id, registers),
+ 23 => self.enable_secondary(core_id, registers),
+ 24 => self.disable_secondary(core_id, registers),
_ => {
// TODO: some sort of error reporting
--
cgit v1.2.3