Updated AvrGdbRsp debug server to use the provided register descriptors, instead of creating them

This commit is contained in:
Nav
2021-08-07 17:22:59 +01:00
parent d709c8aac9
commit 7ebc447344
6 changed files with 80 additions and 43 deletions

View File

@@ -0,0 +1,58 @@
#include "AvrGdbRsp.hpp"
#include "src/Exceptions/Exception.hpp"
using namespace Bloom::DebugServers::Gdb;
using namespace Bloom::Exceptions;
using Bloom::Targets::TargetRegisterDescriptor;
using Bloom::Targets::TargetRegisterType;
void AvrGdbRsp::loadRegisterNumberToDescriptorMapping() {
auto& registerDescriptorsByType = this->targetDescriptor.registerDescriptorsByType;
if (!registerDescriptorsByType.contains(TargetRegisterType::STATUS_REGISTER)) {
throw Exception("Missing status register descriptor");
}
if (!registerDescriptorsByType.contains(TargetRegisterType::STACK_POINTER)) {
throw Exception("Missing stack pointer register descriptor");
}
if (!registerDescriptorsByType.contains(TargetRegisterType::PROGRAM_COUNTER)) {
throw Exception("Missing program counter register descriptor");
}
if (!registerDescriptorsByType.contains(TargetRegisterType::GENERAL_PURPOSE_REGISTER)
|| registerDescriptorsByType.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER).size() != 32) {
throw Exception("Unexpected general purpose register count");
}
auto& gpRegisterDescriptors = registerDescriptorsByType.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER);
for (const auto& gpRegisterDescriptor : gpRegisterDescriptors) {
this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(gpRegisterDescriptor.id.value()),
gpRegisterDescriptor
));
}
this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(32),
registerDescriptorsByType.at(TargetRegisterType::STATUS_REGISTER).front()
));
this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(33),
registerDescriptorsByType.at(TargetRegisterType::STACK_POINTER).front()
));
this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(34),
registerDescriptorsByType.at(TargetRegisterType::PROGRAM_COUNTER).front()
));
}
void AvrGdbRsp::init() {
this->loadRegisterNumberToDescriptorMapping();
GdbRspDebugServer::init();
}