Implemented RISC-V register reading/writing (only 32-bit registers are supported, for now)
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user