Added getRegisterNumbers() member function to GDB target descriptor

This commit is contained in:
Nav
2022-03-25 00:14:32 +00:00
parent e2bbb72b8a
commit 95b9ffef57
4 changed files with 28 additions and 2 deletions

View File

@@ -42,6 +42,10 @@ namespace Bloom::DebugServers::Gdb::AvrGdb
+ ") not mapped to any target register descriptor."); + ") not mapped to any target register descriptor.");
} }
const std::vector<GdbRegisterNumberType>& TargetDescriptor::getRegisterNumbers() const {
return this->registerNumbers;
}
void TargetDescriptor::loadRegisterMappings() { void TargetDescriptor::loadRegisterMappings() {
auto& registerDescriptorsByType = this->targetDescriptor.registerDescriptorsByType; auto& registerDescriptorsByType = this->targetDescriptor.registerDescriptorsByType;
if (!registerDescriptorsByType.contains(TargetRegisterType::STATUS_REGISTER)) { if (!registerDescriptorsByType.contains(TargetRegisterType::STATUS_REGISTER)) {
@@ -62,6 +66,18 @@ namespace Bloom::DebugServers::Gdb::AvrGdb
throw Exception("Unexpected general purpose register count"); 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. * Worth noting that gpRegisterDescriptors will always be sorted in the correct order, from register 0 to 31.
* *

View File

@@ -43,6 +43,8 @@ namespace Bloom::DebugServers::Gdb::AvrGdb
GdbRegisterNumberType number GdbRegisterNumberType number
) const override; ) const override;
const std::vector<GdbRegisterNumberType>& getRegisterNumbers() const override;
private: private:
void loadRegisterMappings(); void loadRegisterMappings();
}; };

View File

@@ -40,8 +40,8 @@ namespace Bloom::DebugServers::Gdb::CommandPackets
} else { } else {
// Read all target registers mapped to a GDB register // Read all target registers mapped to a GDB register
for (const auto& descriptor : targetDescriptor.getRegisterNumberToDescriptorMapping().getMap()) { for (const auto& registerNumber : targetDescriptor.getRegisterNumbers()) {
descriptors.insert(targetDescriptor.getTargetRegisterDescriptorFromNumber(descriptor.second.number)); descriptors.insert(targetDescriptor.getTargetRegisterDescriptorFromNumber(registerNumber));
} }
} }

View File

@@ -2,6 +2,7 @@
#include <cstdint> #include <cstdint>
#include <optional> #include <optional>
#include <vector>
#include "RegisterDescriptor.hpp" #include "RegisterDescriptor.hpp"
@@ -46,5 +47,12 @@ namespace Bloom::DebugServers::Gdb
virtual const Targets::TargetRegisterDescriptor& getTargetRegisterDescriptorFromNumber( virtual const Targets::TargetRegisterDescriptor& getTargetRegisterDescriptorFromNumber(
GdbRegisterNumberType number GdbRegisterNumberType number
) const = 0; ) const = 0;
/**
* Should return all allocated GDB register numbers for the target.
*
* @return
*/
virtual const std::vector<GdbRegisterNumberType>& getRegisterNumbers() const = 0;
}; };
} }