Added getRegisterNumbers() member function to GDB target descriptor
This commit is contained in:
@@ -42,6 +42,10 @@ namespace Bloom::DebugServers::Gdb::AvrGdb
|
||||
+ ") not mapped to any target register descriptor.");
|
||||
}
|
||||
|
||||
const std::vector<GdbRegisterNumberType>& 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.
|
||||
*
|
||||
|
||||
@@ -43,6 +43,8 @@ namespace Bloom::DebugServers::Gdb::AvrGdb
|
||||
GdbRegisterNumberType number
|
||||
) const override;
|
||||
|
||||
const std::vector<GdbRegisterNumberType>& getRegisterNumbers() const override;
|
||||
|
||||
private:
|
||||
void loadRegisterMappings();
|
||||
};
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
#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<GdbRegisterNumberType>& getRegisterNumbers() const = 0;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user