#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); std::sort( gpRegisterDescriptors.begin(), gpRegisterDescriptors.end(), [](const TargetRegisterDescriptor& descriptorA, const TargetRegisterDescriptor& descriptorB) { return descriptorA.startAddress.value() < descriptorB.startAddress.value(); } ); for (std::size_t descriptorIndex = 0; descriptorIndex < gpRegisterDescriptors.size(); descriptorIndex++) { this->registerNumberToDescriptorMapping.insert(std::pair( static_cast(descriptorIndex), gpRegisterDescriptors[descriptorIndex] )); } this->registerNumberToDescriptorMapping.insert(std::pair( static_cast(32), registerDescriptorsByType.at(TargetRegisterType::STATUS_REGISTER).front() )); this->registerNumberToDescriptorMapping.insert(std::pair( static_cast(33), registerDescriptorsByType.at(TargetRegisterType::STACK_POINTER).front() )); this->registerNumberToDescriptorMapping.insert(std::pair( static_cast(34), registerDescriptorsByType.at(TargetRegisterType::PROGRAM_COUNTER).front() )); } void AvrGdbRsp::init() { this->loadRegisterNumberToDescriptorMapping(); GdbRspDebugServer::init(); }