From 2cf99dbc21150ff8b0736f725f9d9cd9bbb2be0d Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sun, 5 Jan 2025 13:54:53 -0500 Subject: [PATCH] Fix wrapping memory reads for 64-bit addresses --- src/emulator.rs | 7 +++---- src/emulator/shrooms_vb_core.rs | 8 +++++--- src/gdbserver.rs | 7 ++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/emulator.rs b/src/emulator.rs index b52cc75..5ddb560 100644 --- a/src/emulator.rs +++ b/src/emulator.rs @@ -3,7 +3,6 @@ use std::{ fmt::Display, fs::{self, File}, io::{Read, Seek, SeekFrom, Write}, - ops::Range, path::{Path, PathBuf}, sync::{ atomic::{AtomicBool, Ordering}, @@ -529,11 +528,11 @@ impl Emulator { let value = sim.read_register(register); let _ = done.send(value); } - EmulatorCommand::ReadMemory(sim_id, addresses, mut buffer, done) => { + EmulatorCommand::ReadMemory(sim_id, start, length, mut buffer, done) => { let Some(sim) = self.sims.get_mut(sim_id.to_index()) else { return; }; - sim.read_memory(addresses, &mut buffer); + sim.read_memory(start, length, &mut buffer); let _ = done.send(buffer); } EmulatorCommand::AddBreakpoint(sim_id, address) => { @@ -611,7 +610,7 @@ pub enum EmulatorCommand { DebugContinue(SimId), DebugStep(SimId), ReadRegister(SimId, VBRegister, oneshot::Sender), - ReadMemory(SimId, Range, Vec, oneshot::Sender>), + ReadMemory(SimId, u32, usize, Vec, oneshot::Sender>), AddBreakpoint(SimId, u32), RemoveBreakpoint(SimId, u32), SetAudioEnabled(bool, bool), diff --git a/src/emulator/shrooms_vb_core.rs b/src/emulator/shrooms_vb_core.rs index 5ce58de..26aa0cd 100644 --- a/src/emulator/shrooms_vb_core.rs +++ b/src/emulator/shrooms_vb_core.rs @@ -1,4 +1,4 @@ -use std::{ffi::c_void, ops::Range, ptr, slice}; +use std::{ffi::c_void, ptr, slice}; use anyhow::{anyhow, Result}; use bitflags::bitflags; @@ -349,10 +349,12 @@ impl Sim { } } - pub fn read_memory(&mut self, addresses: Range, into: &mut Vec) { - for address in addresses { + pub fn read_memory(&mut self, start: u32, length: usize, into: &mut Vec) { + let mut address = start; + for _ in 0..length { let byte = unsafe { vb_read(self.sim, address, VBDataType::U8) }; into.push(byte as u8); + address = address.wrapping_add(1); } } diff --git a/src/gdbserver.rs b/src/gdbserver.rs index 7e2b5af..b25767a 100644 --- a/src/gdbserver.rs +++ b/src/gdbserver.rs @@ -280,17 +280,18 @@ impl GdbConnection { } } else if let Some(op) = req.match_some_str(["m", "x"]) { let mut read_memory = || { - let start = req.match_hex::()?; + let start = req.match_hex::()? as u32; if !req.match_str(",") { return None; }; - let size = req.match_hex::()?; + let length = req.match_hex::()?; let mut buf = self.memory_buf.take().unwrap_or_default(); buf.clear(); let (tx, rx) = ::oneshot::channel(); self.client.send_command(EmulatorCommand::ReadMemory( self.sim_id, - start..(start + size), + start, + length, buf, tx, ));