summaryrefslogtreecommitdiff
path: root/src/core.rs
diff options
context:
space:
mode:
authorNathan Lee <me@nwlee.tech>2026-06-12 20:47:32 -0500
committerNathan Lee <me@nwlee.tech>2026-06-12 20:47:32 -0500
commitf0007668e61816594734612e7592cbeac1ca5a94 (patch)
treefb17d39b30e1f29da100f8d6fd0dd927fab7b7ad /src/core.rs
parent7e2032ec239b78cbda1bef5667ed96d13ebc5bf9 (diff)
fix memory reservation system
Diffstat (limited to 'src/core.rs')
-rw-r--r--src/core.rs24
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 {