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.");
}
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.
*

View File

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

View File

@@ -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));
}
}

View File

@@ -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;
};
}