Updated target register interface with more generic register access & manipulation functions
This commit is contained in:
@@ -267,20 +267,10 @@ void Avr8::clearAllBreakpoints() {
|
||||
this->avr8Interface->clearAllBreakpoints();
|
||||
}
|
||||
|
||||
TargetRegisters Avr8::readGeneralPurposeRegisters(std::set<std::size_t> registerIds) {
|
||||
return this->avr8Interface->readGeneralPurposeRegisters(registerIds);
|
||||
}
|
||||
|
||||
void Avr8::writeRegisters(const TargetRegisters& registers) {
|
||||
TargetRegisters gpRegisters;
|
||||
|
||||
for (const auto& targetRegister : registers) {
|
||||
if (targetRegister.descriptor.type == TargetRegisterType::GENERAL_PURPOSE_REGISTER
|
||||
&& targetRegister.descriptor.id.has_value()) {
|
||||
gpRegisters.push_back(targetRegister);
|
||||
|
||||
} else if (targetRegister.descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
|
||||
auto programCounterBytes = targetRegister.value;
|
||||
void Avr8::writeRegisters(TargetRegisters registers) {
|
||||
for (auto registerIt = registers.begin(); registerIt != registers.end();) {
|
||||
if (registerIt->descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
|
||||
auto programCounterBytes = registerIt->value;
|
||||
|
||||
if (programCounterBytes.size() < 4) {
|
||||
// All PC register values should be at least 4 bytes in size
|
||||
@@ -294,41 +284,37 @@ void Avr8::writeRegisters(const TargetRegisters& registers) {
|
||||
| programCounterBytes[3]
|
||||
));
|
||||
|
||||
} else if (targetRegister.descriptor.type == TargetRegisterType::STATUS_REGISTER) {
|
||||
this->avr8Interface->setStatusRegister(targetRegister);
|
||||
registerIt = registers.erase(registerIt);
|
||||
|
||||
} else if (targetRegister.descriptor.type == TargetRegisterType::STACK_POINTER) {
|
||||
this->avr8Interface->setStackPointerRegister(targetRegister);
|
||||
} else {
|
||||
registerIt++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gpRegisters.empty()) {
|
||||
this->avr8Interface->writeGeneralPurposeRegisters(gpRegisters);
|
||||
if (!registers.empty()) {
|
||||
this->avr8Interface->writeRegisters(registers);
|
||||
}
|
||||
}
|
||||
|
||||
TargetRegisters Avr8::readRegisters(const TargetRegisterDescriptors& descriptors) {
|
||||
TargetRegisters Avr8::readRegisters(TargetRegisterDescriptors descriptors) {
|
||||
TargetRegisters registers;
|
||||
std::set<std::size_t> gpRegisterIds;
|
||||
|
||||
for (const auto& descriptor : descriptors) {
|
||||
if (descriptor.type == TargetRegisterType::GENERAL_PURPOSE_REGISTER && descriptor.id.has_value()) {
|
||||
gpRegisterIds.insert(descriptor.id.value());
|
||||
for (auto registerDescriptorIt = descriptors.begin(); registerDescriptorIt != descriptors.end();) {
|
||||
auto& descriptor = *registerDescriptorIt;
|
||||
|
||||
} else if (descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
|
||||
if (descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
|
||||
registers.push_back(this->getProgramCounterRegister());
|
||||
|
||||
} else if (descriptor.type == TargetRegisterType::STATUS_REGISTER) {
|
||||
registers.push_back(this->getStatusRegister());
|
||||
registerDescriptorIt = descriptors.erase(registerDescriptorIt);
|
||||
|
||||
} else if (descriptor.type == TargetRegisterType::STACK_POINTER) {
|
||||
registers.push_back(this->getStackPointerRegister());
|
||||
} else {
|
||||
registerDescriptorIt++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gpRegisterIds.empty()) {
|
||||
auto gpRegisters = this->readGeneralPurposeRegisters(gpRegisterIds);
|
||||
registers.insert(registers.end(), gpRegisters.begin(), gpRegisters.end());
|
||||
if (!descriptors.empty()) {
|
||||
auto otherRegisters = this->avr8Interface->readRegisters(descriptors);
|
||||
registers.insert(registers.end(), otherRegisters.begin(), otherRegisters.end());
|
||||
}
|
||||
|
||||
return registers;
|
||||
@@ -361,14 +347,6 @@ TargetRegister Avr8::getProgramCounterRegister() {
|
||||
});
|
||||
}
|
||||
|
||||
TargetRegister Avr8::getStackPointerRegister() {
|
||||
return this->avr8Interface->getStackPointerRegister();
|
||||
}
|
||||
|
||||
TargetRegister Avr8::getStatusRegister() {
|
||||
return this->avr8Interface->getStatusRegister();
|
||||
}
|
||||
|
||||
void Avr8::setProgramCounter(std::uint32_t programCounter) {
|
||||
this->avr8Interface->setProgramCounter(programCounter);
|
||||
}
|
||||
|
||||
@@ -124,9 +124,8 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
|
||||
void removeBreakpoint(std::uint32_t address) override;
|
||||
void clearAllBreakpoints() override;
|
||||
|
||||
TargetRegisters readGeneralPurposeRegisters(std::set<std::size_t> registerIds) override;
|
||||
void writeRegisters(const TargetRegisters& registers) override;
|
||||
TargetRegisters readRegisters(const TargetRegisterDescriptors& descriptors) override;
|
||||
void writeRegisters(TargetRegisters registers) override;
|
||||
TargetRegisters readRegisters(TargetRegisterDescriptors descriptors) override;
|
||||
|
||||
TargetMemoryBuffer readMemory(
|
||||
TargetMemoryType memoryType,
|
||||
@@ -142,12 +141,9 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
|
||||
TargetState getState() override;
|
||||
|
||||
std::uint32_t getProgramCounter() override;
|
||||
TargetRegister getProgramCounterRegister() override;
|
||||
TargetRegister getProgramCounterRegister();
|
||||
void setProgramCounter(std::uint32_t programCounter) override;
|
||||
|
||||
TargetRegister getStackPointerRegister() override;
|
||||
TargetRegister getStatusRegister() override;
|
||||
|
||||
std::map<int, TargetPinState> getPinStates(int variantId) override;
|
||||
void setPinState(
|
||||
int variantId,
|
||||
|
||||
@@ -223,21 +223,12 @@ namespace Bloom::Targets
|
||||
*/
|
||||
virtual void clearAllBreakpoints() = 0;
|
||||
|
||||
/**
|
||||
* Should read general purpose register values, for the given general purpose register ids.
|
||||
*
|
||||
* @param registerIds
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
virtual TargetRegisters readGeneralPurposeRegisters(std::set<std::size_t> registerIds) = 0;
|
||||
|
||||
/**
|
||||
* Should update the value of the given registers.
|
||||
*
|
||||
* @param registers
|
||||
*/
|
||||
virtual void writeRegisters(const TargetRegisters& registers) = 0;
|
||||
virtual void writeRegisters(TargetRegisters registers) = 0;
|
||||
|
||||
/**
|
||||
* Should read register values of the registers described by the given descriptors.
|
||||
@@ -246,7 +237,7 @@ namespace Bloom::Targets
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
virtual TargetRegisters readRegisters(const TargetRegisterDescriptors& descriptors) = 0;
|
||||
virtual TargetRegisters readRegisters(TargetRegisterDescriptors descriptors) = 0;
|
||||
|
||||
/**
|
||||
* Should read memory from the target.
|
||||
@@ -282,13 +273,6 @@ namespace Bloom::Targets
|
||||
*/
|
||||
virtual std::uint32_t getProgramCounter() = 0;
|
||||
|
||||
/**
|
||||
* Same as Target::getProgramCounter() but in the form of a TargetRegister.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
virtual TargetRegister getProgramCounterRegister() = 0;
|
||||
|
||||
/**
|
||||
* Should update the program counter on the target.
|
||||
*
|
||||
@@ -296,20 +280,6 @@ namespace Bloom::Targets
|
||||
*/
|
||||
virtual void setProgramCounter(std::uint32_t programCounter) = 0;
|
||||
|
||||
/**
|
||||
* Should fetch the status register value.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
virtual TargetRegister getStatusRegister() = 0;
|
||||
|
||||
/**
|
||||
* Should fetch the stack pointer register value.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
virtual TargetRegister getStackPointerRegister() = 0;
|
||||
|
||||
/**
|
||||
* Should get the current pin states for each pin on the target, mapped by pin number
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user