| 74 | match addr { |
| 75 | a if a == MTIME_BASE => { |
| 76 | self.mtime = (self.mtime & 0xFFFF_FFFF_0000_0000) | data as u64; |
| 77 | Ok(()) |
| 78 | } |
| 79 | a if a == MTIME_BASE + 4 => { |
| 80 | self.mtime = (self.mtime & 0x0000_0000_FFFF_FFFF) | ((data as u64) << 32); |
| 81 | Ok(()) |
| 82 | } |
| 83 | a if a == MTIMECMP_BASE => { |
| 84 | self.mtimecmp = (self.mtimecmp & 0xFFFF_FFFF_0000_0000) | data as u64; |
| 85 | Ok(()) |
| 86 | } |
| 87 | a if a == MTIMECMP_BASE + 4 => { |
| 88 | self.mtimecmp = (self.mtimecmp & 0x0000_0000_FFFF_FFFF) | ((data as u64) << 32); |
| 89 | Ok(()) |
| 90 | } |
| 91 | a if a == MSIP_BASE => { |
| 92 | self.msip = data & 1; |
| 93 | Ok(()) |
| 94 | } |
| 95 | _ => Err(VmError::StoreAccessFault(addr)), |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | fn write_doubleword(&mut self, addr: u64, data: u64) -> Result<(), VmError> { |
| 100 | self.write_word(addr, data as u32)?; |
| 101 | self.write_word(addr + 4, (data >> 32) as u32) |
| 102 | } |
| 103 | } |