diff options
| author | David Li <li.davidm96@gmail.com> | 2016-01-08 10:04:27 -0700 | 
|---|---|---|
| committer | David Li <li.davidm96@gmail.com> | 2016-01-08 10:04:27 -0700 | 
| commit | ad805c698cd1c4d68d090f842fb14621c32ee8d6 (patch) | |
| tree | fd357647c13c461370d34a067b84cc7aac94c7d3 /src/system.rs | |
| parent | 940a5ae77a1efc8f89fe5b56fe4a4ae34a0e480d (diff) | |
Refactor into multiple files
Diffstat (limited to 'src/system.rs')
| -rw-r--r-- | src/system.rs | 67 | 
1 files changed, 67 insertions, 0 deletions
| diff --git a/src/system.rs b/src/system.rs new file mode 100644 index 0000000..faadb13 --- /dev/null +++ b/src/system.rs @@ -0,0 +1,67 @@ +use std; + +use rustv::isa; +use rustv::memory::SharedMemory; +use rustv::register_file::RegisterFile; +use rustv::syscall; +use rustv::trap::Trap; + +pub struct SyscallHandler<'a> { +    memory: SharedMemory<'a>, +} + +impl<'a> SyscallHandler<'a> { +    pub fn new(memory: SharedMemory<'a>) -> SyscallHandler<'a> { +        SyscallHandler { +            memory: memory +        } +    } +} + +impl<'a> SyscallHandler<'a> { +    fn print(&mut self, registers: &mut RegisterFile) -> Option<Trap> { +        let mut base = registers.read_word(isa::Register::X11); +        let mut string = vec![]; + +        loop { +            let c = self.memory.borrow_mut().read_byte(base); + +            if let Ok(0x00) = c { +                break; +            } +            else if let Ok(c) = c { +                string.push(c); +            } + +            base += 1; +        } + +        let result = std::str::from_utf8(&string); +        if let Ok(string) = result { +            println!("{}", string); +        } +        else { +            println!("Error printing string: not valid UTF-8: {:?}", result); +        } +        None + +    } +} + +impl<'a> syscall::SyscallHandler for SyscallHandler<'a> { +    // TODO: is trap really appropriate here? +    fn syscall(&mut self, registers: &mut RegisterFile) -> Option<Trap> { +        let syscall_number = registers.read_word(isa::Register::X10); + +        match syscall_number { +            22 => { +                self.print(registers) +            } + +            _ => { +                // TODO: some sort of error reporting +                None +            } +        } +    } +} | 
