Every component in the memory hierarchy must implement this.
| 17 | pub trait RamImage { |
| 18 | fn ram_len(&self) -> usize; |
| 19 | fn ram_base(&self) -> u64; |
| 20 | fn write_image_into(&self, buf: &mut [u8]); |
| 21 | fn load_image(&mut self, bytes: &[u8]); |
| 22 | } |
| 23 | |
| 24 | /// Every component in the memory hierarchy must implement this. |
| 25 | pub trait MemoryAccess { |
| 26 | fn read_byte(&mut self, addr: u64) -> Result<u8, VmError>; |
| 27 | fn read_halfword(&mut self, addr: u64) -> Result<u16, VmError> { |
| 28 | let lo = self.read_byte(addr)? as u16; |
| 29 | let hi = self.read_byte(addr + 1)? as u16; |
| 30 | Ok(lo | (hi << 8)) |
| 31 | } |
| 32 | fn read_word(&mut self, addr: u64) -> Result<u32, VmError> { |
| 33 | let lo = self.read_halfword(addr)? as u32; |
| 34 | let hi = self.read_halfword(addr + 2)? as u32; |
| 35 | Ok(lo | (hi << 16)) |
| 36 | } |
| 37 | fn read_doubleword(&mut self, addr: u64) -> Result<u64, VmError> { |
| 38 | let lo = self.read_word(addr)? as u64; |
| 39 | let hi = self.read_word(addr + 4)? as u64; |
| 40 | Ok(lo | (hi << 32)) |
| 41 | } |
| 42 | |
| 43 | fn write_byte(&mut self, addr: u64, data: u8) -> Result<(), VmError>; |
| 44 | fn write_halfword(&mut self, addr: u64, data: u16) -> Result<(), VmError> { |
| 45 | self.write_byte(addr, data as u8)?; |
| 46 | self.write_byte(addr + 1, (data >> 8) as u8) |
| 47 | } |
| 48 | fn write_word(&mut self, addr: u64, data: u32) -> Result<(), VmError> { |
| 49 | self.write_halfword(addr, data as u16)?; |
| 50 | self.write_halfword(addr + 2, (data >> 16) as u16) |
| 51 | } |
| 52 | fn write_doubleword(&mut self, addr: u64, data: u64) -> Result<(), VmError> { |
| 53 | self.write_word(addr, data as u32)?; |
no outgoing calls
no test coverage detected