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.");
|
+ ") 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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user