(bus: &mut SystemBus, addr: u64, bits: u64, funct3: u8)
| 329 | addr: u64, |
| 330 | val: u64, |
| 331 | ) -> Result<u64, VmError> { |
| 332 | let is_word = funct3 == 2; |
| 333 | |
| 334 | // Natural alignment is required for all atomics: 4-byte for .W, 8-byte for .D. |
| 335 | let align = if is_word { 4u64 } else { 8u64 }; |
| 336 | if !addr.is_multiple_of(align) { |
| 337 | return Err(VmError::StoreAccessFault(addr)); |
| 338 | } |
| 339 | |
| 340 | match funct5 { |
| 341 | // LR |
| 342 | 0x02 => { |
| 343 | *reservation = Some(addr); |
| 344 | let result = if is_word { |
| 345 | let w = bus |
| 346 | .read_word(addr) |
| 347 | .map_err(|_| VmError::LoadAccessFault(addr))?; |
| 348 | (w as i32) as i64 as u64 |
no test coverage detected