Implemented RISC-V register reading/writing (only 32-bit registers are supported, for now)

This commit is contained in:
Nav
2023-11-25 07:45:31 +00:00
parent 2fc639fb14
commit fa13bc2a99

View File

@@ -2,6 +2,7 @@
#include <thread> #include <thread>
#include <chrono> #include <chrono>
#include <limits>
#include "Registers/RegisterNumbers.hpp" #include "Registers/RegisterNumbers.hpp"
#include "DebugModule/Registers/RegisterAddresses.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<unsigned char>(registerValue >> 24),
static_cast<unsigned char>(registerValue >> 16),
static_cast<unsigned char>(registerValue >> 8),
static_cast<unsigned char>(registerValue),
})
);
}
return output;
} }
TargetRegisters RiscV::readRegisters(const Targets::TargetRegisterDescriptorIds& descriptorIds) { void RiscV::writeRegisters(const TargetRegisters& registers) {
return {}; for (const auto& targetRegister : registers) {
if ((targetRegister.value.size() * 8) > std::numeric_limits<std::uintmax_t>::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>(registerValue) // TODO: Support larger register values
);
}
} }
TargetMemoryBuffer RiscV::readMemory( TargetMemoryBuffer RiscV::readMemory(