diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-06-12 20:47:32 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-06-12 20:47:32 -0500 |
| commit | f0007668e61816594734612e7592cbeac1ca5a94 (patch) | |
| tree | fb17d39b30e1f29da100f8d6fd0dd927fab7b7ad /src/core.rs | |
| parent | 7e2032ec239b78cbda1bef5667ed96d13ebc5bf9 (diff) | |
fix memory reservation system
Diffstat (limited to 'src/core.rs')
| -rw-r--r-- | src/core.rs | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/core.rs b/src/core.rs index 3b59782..9e8e8dd 100644 --- a/src/core.rs +++ b/src/core.rs @@ -191,33 +191,35 @@ pub fn lhu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { state.registers[rd] = ((bytes[1] as u16) << 8 | bytes[0] as u16) as u32; } pub fn sb(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { + let addr = (state.registers[rs1] + imm) as usize; state .memory - .write( - (state.registers[rs1] + imm) as usize, - 99, - state.registers[rs2] as u8, - ) + .write(addr, 99, state.registers[rs2] as u8) .unwrap(); + state.release_reservations(&[addr]); } pub fn sh(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { + let addr = (state.registers[rs1] + imm) as usize; + let halfword = state.registers[rs2] & 0xFFFF; - let index = (state.registers[rs1] + imm) as usize; state .memory - .write_multiple_bytes(index, &[(halfword & 0xFF) as u8, (halfword >> 8) as u8], 99) + .write_multiple_bytes(addr, &[(halfword & 0xFF) as u8, (halfword >> 8) as u8], 99) .unwrap(); + + state.release_reservations(&[addr, addr + 1]); } pub fn sw(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { - let index = (state.registers[rs1] + imm) as usize; + let addr = (state.registers[rs1] + imm) as usize; state .memory - .write_multiple_bytes(index, &state.registers[rs2].to_le_bytes(), 99) + .write_multiple_bytes(addr, &state.registers[rs2].to_le_bytes(), 99) .unwrap(); + state.release_reservations(&[addr, addr + 1, addr + 2, addr + 3]); } pub fn beq(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { @@ -271,12 +273,12 @@ pub fn lui(state: &mut CpuState, rd: usize, imm: u32) { pub fn lr_w(state: &mut CpuState, rd: usize, rs1: usize) { let addr = state.registers[rs1] as usize; state.registers[rd] = load_word(state, addr); - state.acquire_reservations(&[addr, addr + 1, addr + 2, addr + 3]); + state.acquire_reservations(addr); } pub fn sc_w(state: &mut CpuState, rd: usize, rs1: usize, rs2: usize) { let addr = state.registers[rs1] as usize; - if state.reservations.contains(&addr) { + if state.is_addr_reserved(addr) { store_word(state, addr, state.registers[rs2]); state.registers[rd] = 0; } else { |
