(bus: &mut SystemBus, addr: u64, funct3: u8)
| 237 | Ok(dw) |
| 238 | } |
| 239 | 4 => { |
| 240 | let byte = bus |
| 241 | .read_byte(addr) |
| 242 | .map_err(|_| VmError::LoadAccessFault(addr))?; |
| 243 | Ok(byte as u64) |
| 244 | } |
| 245 | 5 => { |
| 246 | let hw = bus |
| 247 | .read_halfword(addr) |
| 248 | .map_err(|_| VmError::LoadAccessFault(addr))?; |
| 249 | Ok(hw as u64) |
| 250 | } |
| 251 | 6 => { |
| 252 | let w = bus |
| 253 | .read_word(addr) |
| 254 | .map_err(|_| VmError::LoadAccessFault(addr))?; |
| 255 | Ok(w as u64) |
| 256 | } |
| 257 | _ => Err(VmError::LoadAccessFault(addr)), |
| 258 | } |
| 259 | } |
| 260 | |
| 261 | // --- Integer store --- |
| 262 | |
| 263 | fn store_int(bus: &mut SystemBus, addr: u64, val: u64, funct3: u8) -> Result<(), VmError> { |
| 264 | match funct3 { |
| 265 | 0 => bus |
| 266 | .write_byte(addr, val as u8) |
| 267 | .map_err(|_| VmError::StoreAccessFault(addr)), |
| 268 | 1 => bus |
| 269 | .write_halfword(addr, val as u16) |
| 270 | .map_err(|_| VmError::StoreAccessFault(addr)), |
| 271 | 2 => bus |
| 272 | .write_word(addr, val as u32) |
| 273 | .map_err(|_| VmError::StoreAccessFault(addr)), |
| 274 | 3 => bus |
| 275 | .write_doubleword(addr, val) |
| 276 | .map_err(|_| VmError::StoreAccessFault(addr)), |
| 277 | _ => Err(VmError::StoreAccessFault(addr)), |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | // --- FP load --- |
| 282 | |
| 283 | fn load_fp(bus: &mut SystemBus, addr: u64, funct3: u8) -> Result<u64, VmError> { |
| 284 | match funct3 { |
| 285 | 2 => { |
| 286 | // FLW: NaN-box |
| 287 | let word = bus |
| 288 | .read_word(addr) |
no test coverage detected