From fa13bc2a992c4fea279729ac53dbc0ad7929193b Mon Sep 17 00:00:00 2001 From: Nav Date: Sat, 25 Nov 2023 07:45:31 +0000 Subject: [PATCH] Implemented RISC-V register reading/writing (only 32-bit registers are supported, for now) --- src/Targets/RiscV/RiscV.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Targets/RiscV/RiscV.cpp b/src/Targets/RiscV/RiscV.cpp index d2322148..58ac0d11 100644 --- a/src/Targets/RiscV/RiscV.cpp +++ b/src/Targets/RiscV/RiscV.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "Registers/RegisterNumbers.hpp" #include "DebugModule/Registers/RegisterAddresses.hpp" @@ -203,12 +204,42 @@ namespace Targets::RiscV } - void RiscV::writeRegisters(TargetRegisters registers) { + TargetRegisters RiscV::readRegisters(const Targets::TargetRegisterDescriptorIds& descriptorIds) { + auto output = TargetRegisters(); + for (const auto& descriptorId : descriptorIds) { + const auto registerValue = this->readRegister(this->registerDescriptorsById.at(descriptorId).number); + output.emplace_back( + descriptorId, + TargetMemoryBuffer({ + static_cast(registerValue >> 24), + static_cast(registerValue >> 16), + static_cast(registerValue >> 8), + static_cast(registerValue), + }) + ); + } + + return output; } - TargetRegisters RiscV::readRegisters(const Targets::TargetRegisterDescriptorIds& descriptorIds) { - return {}; + void RiscV::writeRegisters(const TargetRegisters& registers) { + for (const auto& targetRegister : registers) { + if ((targetRegister.value.size() * 8) > std::numeric_limits::digits) { + throw Exceptions::Exception("Register value bit width exceeds that of std::uintmax_t"); + } + + auto registerValue = std::uintmax_t{0}; + + for (const auto& registerByte : targetRegister.value) { + registerValue = (registerValue << 8) | registerByte; + } + + this->writeRegister( + this->registerDescriptorsById.at(targetRegister.descriptorId).number, + static_cast(registerValue) // TODO: Support larger register values + ); + } } TargetMemoryBuffer RiscV::readMemory(