diff --git a/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.cpp b/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.cpp index db949326..013ebbcb 100644 --- a/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.cpp +++ b/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.cpp @@ -42,6 +42,10 @@ namespace Bloom::DebugServers::Gdb::AvrGdb + ") not mapped to any target register descriptor."); } + const std::vector& TargetDescriptor::getRegisterNumbers() const { + return this->registerNumbers; + } + void TargetDescriptor::loadRegisterMappings() { auto& registerDescriptorsByType = this->targetDescriptor.registerDescriptorsByType; if (!registerDescriptorsByType.contains(TargetRegisterType::STATUS_REGISTER)) { @@ -62,6 +66,18 @@ namespace Bloom::DebugServers::Gdb::AvrGdb throw Exception("Unexpected general purpose register count"); } + /* + * For AVR targets, avr-gdb defines 35 registers in total: + * + * Register number 0 through 31 are general purpose registers + * Register number 32 is the status register (SREG) + * Register number 33 is the stack pointer register + * Register number 34 is the program counter register + */ + + // Generate 35 register numbers (0 -> 34) + std::iota(this->registerNumbers.begin(), this->registerNumbers.end(), 0); + /* * Worth noting that gpRegisterDescriptors will always be sorted in the correct order, from register 0 to 31. * diff --git a/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.hpp b/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.hpp index 310fc9d1..c751294b 100644 --- a/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.hpp +++ b/src/DebugServers/GdbRsp/AvrGdb/TargetDescriptor.hpp @@ -43,6 +43,8 @@ namespace Bloom::DebugServers::Gdb::AvrGdb GdbRegisterNumberType number ) const override; + const std::vector& getRegisterNumbers() const override; + private: void loadRegisterMappings(); }; diff --git a/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp index 8192c6f3..d3992935 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp +++ b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp @@ -40,8 +40,8 @@ namespace Bloom::DebugServers::Gdb::CommandPackets } else { // Read all target registers mapped to a GDB register - for (const auto& descriptor : targetDescriptor.getRegisterNumberToDescriptorMapping().getMap()) { - descriptors.insert(targetDescriptor.getTargetRegisterDescriptorFromNumber(descriptor.second.number)); + for (const auto& registerNumber : targetDescriptor.getRegisterNumbers()) { + descriptors.insert(targetDescriptor.getTargetRegisterDescriptorFromNumber(registerNumber)); } } diff --git a/src/DebugServers/GdbRsp/TargetDescriptor.hpp b/src/DebugServers/GdbRsp/TargetDescriptor.hpp index bec87f51..3aa4f01b 100644 --- a/src/DebugServers/GdbRsp/TargetDescriptor.hpp +++ b/src/DebugServers/GdbRsp/TargetDescriptor.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "RegisterDescriptor.hpp" @@ -46,5 +47,12 @@ namespace Bloom::DebugServers::Gdb virtual const Targets::TargetRegisterDescriptor& getTargetRegisterDescriptorFromNumber( GdbRegisterNumberType number ) const = 0; + + /** + * Should return all allocated GDB register numbers for the target. + * + * @return + */ + virtual const std::vector& getRegisterNumbers() const = 0; }; }