diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-07-28 23:25:06 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-07-28 23:25:06 -0500 |
| commit | c43100337514f98c0eeb202980b42b558d303b3e (patch) | |
| tree | 965e47ebb3fd14aee55250d06381ed9b43ff4b9c /src/core.rs | |
| parent | 7b5e07c788bbb1dde8ea4df6643d0868e9ada785 (diff) | |
rework memory system to use actual Sv32 paging
Diffstat (limited to 'src/core.rs')
| -rw-r--r-- | src/core.rs | 57 |
1 files changed, 16 insertions, 41 deletions
diff --git a/src/core.rs b/src/core.rs index 6317c9e..2746d1b 100644 --- a/src/core.rs +++ b/src/core.rs @@ -151,74 +151,53 @@ pub fn sltiu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { state.registers[rd] = if state.registers[rs1] < imm { 1 } else { 0 }; } pub fn lb(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { - let byte = state - .memory - .read((state.registers[rs1] + imm) as usize, 99) - .unwrap(); + let byte = state.memory.read(state.registers[rs1] + imm).unwrap(); state.registers[rd] = (byte as i8) as u32; } pub fn lh(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { - let bytes = state - .memory - .read_multiple_bytes((state.registers[rs1] + imm) as usize, 2, 99) - .unwrap(); - - state.registers[rd] = (((bytes[1] as u16) << 8 | bytes[0] as u16) as i16) as u32; + let halfword = state.memory.read_halfword(state.registers[rs1] + imm).unwrap(); + state.registers[rd] = (halfword as i16) as u32; } pub fn lw(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { - let addr = (state.registers[rs1].wrapping_add(imm)) as usize; - let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap(); - let number = u32::from_le_bytes(slice[0..4].try_into().unwrap()); - - state.registers[rd] = number; + let addr = state.registers[rs1].wrapping_add(imm); + let word = state.memory.read_word(addr).unwrap(); + state.registers[rd] = word; } pub fn lbu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { state.registers[rd] = state .memory - .read((state.registers[rs1] + imm) as usize, 99) + .read(state.registers[rs1].wrapping_add(imm)) .unwrap() as u32; } pub fn lhu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { - let bytes = state - .memory - .read_multiple_bytes((state.registers[rs1] + imm) as usize, 2, 99) - .unwrap(); - - state.registers[rd] = ((bytes[1] as u16) << 8 | bytes[0] as u16) as u32; + state.registers[rd] = state.memory.read_halfword(state.registers[rs1] + imm).unwrap() as u32; } pub fn sb(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { - let addr = (state.registers[rs1] + imm) as usize; + let addr = state.registers[rs1] + imm; state .memory - .write(addr, 99, state.registers[rs2] as u8) + .write(addr, state.registers[rs2] as u8) .unwrap(); - state.release_reservations(&[addr]); + state.release_reservations(&[addr as usize]); } 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; - - state - .memory - .write_multiple_bytes(addr, &[(halfword & 0xFF) as u8, (halfword >> 8) as u8], 99) - .unwrap(); + let halfword= (state.registers[rs2] & 0xFFFF) as u16; + state.memory.write_halfword(addr as u32, halfword).unwrap(); state.release_reservations(&[addr, addr + 1]); } pub fn sw(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { let addr = (state.registers[rs1] + imm) as usize; - state - .memory - .write_multiple_bytes(addr, &state.registers[rs2].to_le_bytes(), 99) - .unwrap(); + state.memory.write_word(addr as u32, state.registers[rs2]).unwrap(); state.release_reservations(&[addr, addr + 1, addr + 2, addr + 3]); } @@ -362,14 +341,10 @@ pub fn amominu_w(state: &mut CpuState, rd: usize, rs1: usize, rs2: usize) { } fn load_word(state: &CpuState, addr: usize) -> u32 { - let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap(); - u32::from_le_bytes(slice[0..4].try_into().unwrap()) + state.memory.read_word(addr as u32).unwrap() } fn store_word(state: &mut CpuState, addr: usize, value: u32) { - state - .memory - .write_multiple_bytes(addr, &value.to_le_bytes(), 99) - .unwrap(); + state.memory.write_word(addr as u32, value).unwrap() } pub fn auipc(state: &mut CpuState, rd: usize, imm: u32) { |
