Added support for excluding address ranges from read memory events
This commit is contained in:
@@ -556,7 +556,12 @@ void EdbgAvr8Interface::writeRegisters(const Targets::TargetRegisters& registers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetMemoryBuffer EdbgAvr8Interface::readMemory(TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t bytes) {
|
TargetMemoryBuffer EdbgAvr8Interface::readMemory(
|
||||||
|
TargetMemoryType memoryType,
|
||||||
|
std::uint32_t startAddress,
|
||||||
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges
|
||||||
|
) {
|
||||||
auto avr8MemoryType = Avr8MemoryType::SRAM;
|
auto avr8MemoryType = Avr8MemoryType::SRAM;
|
||||||
|
|
||||||
switch (memoryType) {
|
switch (memoryType) {
|
||||||
@@ -579,9 +584,32 @@ TargetMemoryBuffer EdbgAvr8Interface::readMemory(TargetMemoryType memoryType, st
|
|||||||
case TargetMemoryType::EEPROM: {
|
case TargetMemoryType::EEPROM: {
|
||||||
avr8MemoryType = Avr8MemoryType::EEPROM;
|
avr8MemoryType = Avr8MemoryType::EEPROM;
|
||||||
}
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this->readMemory(avr8MemoryType, startAddress, bytes);
|
/*
|
||||||
|
* The internal readMemory() function accepts excluded addresses in the form of a set of addresses, as
|
||||||
|
* opposed to a set of address ranges.
|
||||||
|
*
|
||||||
|
* We will perform the conversion here.
|
||||||
|
*/
|
||||||
|
auto excludedAddresses = std::set<std::uint32_t>();
|
||||||
|
auto endAddress = startAddress + bytes - 1;
|
||||||
|
|
||||||
|
for (const auto& addressRange : excludedAddressRanges) {
|
||||||
|
if (addressRange.startAddress > endAddress) {
|
||||||
|
// This address range is outside of the range from which we will be reading
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i = addressRange.startAddress; i <= addressRange.endAddress; i++) {
|
||||||
|
excludedAddresses.insert(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this->readMemory(avr8MemoryType, startAddress, bytes, excludedAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdbgAvr8Interface::writeMemory(TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer) {
|
void EdbgAvr8Interface::writeMemory(TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer) {
|
||||||
@@ -611,6 +639,9 @@ void EdbgAvr8Interface::writeMemory(TargetMemoryType memoryType, std::uint32_t s
|
|||||||
case TargetMemoryType::EEPROM: {
|
case TargetMemoryType::EEPROM: {
|
||||||
avr8MemoryType = Avr8MemoryType::EEPROM;
|
avr8MemoryType = Avr8MemoryType::EEPROM;
|
||||||
}
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this->writeMemory(avr8MemoryType, startAddress, buffer);
|
return this->writeMemory(avr8MemoryType, startAddress, buffer);
|
||||||
|
|||||||
@@ -218,7 +218,8 @@ namespace Bloom::DebugToolDrivers::Protocols::CmsisDap::Edbg::Avr
|
|||||||
Targets::TargetMemoryBuffer readMemory(
|
Targets::TargetMemoryBuffer readMemory(
|
||||||
Targets::TargetMemoryType memoryType,
|
Targets::TargetMemoryType memoryType,
|
||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
||||||
) override;
|
) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -157,12 +157,14 @@ namespace Bloom::DebugToolDrivers::TargetInterfaces::Microchip::Avr::Avr8
|
|||||||
* @param memoryType
|
* @param memoryType
|
||||||
* @param startAddress
|
* @param startAddress
|
||||||
* @param bytes
|
* @param bytes
|
||||||
|
* @param excludedAddressRanges
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
virtual Targets::TargetMemoryBuffer readMemory(
|
virtual Targets::TargetMemoryBuffer readMemory(
|
||||||
Targets::TargetMemoryType memoryType,
|
Targets::TargetMemoryType memoryType,
|
||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
||||||
) = 0;
|
) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ namespace Bloom::Events
|
|||||||
Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM;
|
Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM;
|
||||||
std::uint32_t startAddress = 0;
|
std::uint32_t startAddress = 0;
|
||||||
std::uint32_t bytes = 0;
|
std::uint32_t bytes = 0;
|
||||||
|
std::set<Targets::TargetMemoryAddressRange> excludedAddressRanges;
|
||||||
|
|
||||||
[[nodiscard]] EventType getType() const override {
|
[[nodiscard]] EventType getType() const override {
|
||||||
return RetrieveMemoryFromTarget::type;
|
return RetrieveMemoryFromTarget::type;
|
||||||
|
|||||||
@@ -601,7 +601,12 @@ void TargetController::onReadMemoryEvent(const Events::RetrieveMemoryFromTarget&
|
|||||||
try {
|
try {
|
||||||
auto memoryReadEvent = std::make_shared<Events::MemoryRetrievedFromTarget>();
|
auto memoryReadEvent = std::make_shared<Events::MemoryRetrievedFromTarget>();
|
||||||
memoryReadEvent->correlationId = event.id;
|
memoryReadEvent->correlationId = event.id;
|
||||||
memoryReadEvent->data = this->target->readMemory(event.memoryType, event.startAddress, event.bytes);
|
memoryReadEvent->data = this->target->readMemory(
|
||||||
|
event.memoryType,
|
||||||
|
event.startAddress,
|
||||||
|
event.bytes,
|
||||||
|
event.excludedAddressRanges
|
||||||
|
);
|
||||||
|
|
||||||
this->eventManager.triggerEvent(memoryReadEvent);
|
this->eventManager.triggerEvent(memoryReadEvent);
|
||||||
|
|
||||||
|
|||||||
@@ -73,12 +73,14 @@ void TargetControllerConsole::writeRegisters(const TargetRegisters& registers) {
|
|||||||
TargetMemoryBuffer TargetControllerConsole::readMemory(
|
TargetMemoryBuffer TargetControllerConsole::readMemory(
|
||||||
TargetMemoryType memoryType,
|
TargetMemoryType memoryType,
|
||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges
|
||||||
) {
|
) {
|
||||||
auto readMemoryEvent = std::make_shared<RetrieveMemoryFromTarget>();
|
auto readMemoryEvent = std::make_shared<RetrieveMemoryFromTarget>();
|
||||||
readMemoryEvent->memoryType = memoryType;
|
readMemoryEvent->memoryType = memoryType;
|
||||||
readMemoryEvent->startAddress = startAddress;
|
readMemoryEvent->startAddress = startAddress;
|
||||||
readMemoryEvent->bytes = bytes;
|
readMemoryEvent->bytes = bytes;
|
||||||
|
readMemoryEvent->excludedAddressRanges = excludedAddressRanges;
|
||||||
|
|
||||||
return this->triggerTargetControllerEventAndWaitForResponse(readMemoryEvent)->data;
|
return this->triggerTargetControllerEventAndWaitForResponse(readMemoryEvent)->data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,12 +97,14 @@ namespace Bloom
|
|||||||
* @param memoryType
|
* @param memoryType
|
||||||
* @param startAddress
|
* @param startAddress
|
||||||
* @param bytes
|
* @param bytes
|
||||||
|
* @param excludedAddressRanges
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Targets::TargetMemoryBuffer readMemory(
|
Targets::TargetMemoryBuffer readMemory(
|
||||||
Targets::TargetMemoryType memoryType,
|
Targets::TargetMemoryType memoryType,
|
||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -223,8 +223,13 @@ TargetRegisters Avr8::readRegisters(TargetRegisterDescriptors descriptors) {
|
|||||||
return registers;
|
return registers;
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetMemoryBuffer Avr8::readMemory(TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t bytes) {
|
TargetMemoryBuffer Avr8::readMemory(
|
||||||
return this->avr8Interface->readMemory(memoryType, startAddress, bytes);
|
TargetMemoryType memoryType,
|
||||||
|
std::uint32_t startAddress,
|
||||||
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges
|
||||||
|
) {
|
||||||
|
return this->avr8Interface->readMemory(memoryType, startAddress, bytes, excludedAddressRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avr8::writeMemory(TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer) {
|
void Avr8::writeMemory(TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer) {
|
||||||
|
|||||||
@@ -95,7 +95,8 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
|
|||||||
TargetMemoryBuffer readMemory(
|
TargetMemoryBuffer readMemory(
|
||||||
TargetMemoryType memoryType,
|
TargetMemoryType memoryType,
|
||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
||||||
) override;
|
) override;
|
||||||
void writeMemory(
|
void writeMemory(
|
||||||
TargetMemoryType memoryType,
|
TargetMemoryType memoryType,
|
||||||
|
|||||||
@@ -240,10 +240,16 @@ namespace Bloom::Targets
|
|||||||
* @param memoryType
|
* @param memoryType
|
||||||
* @param startAddress
|
* @param startAddress
|
||||||
* @param bytes
|
* @param bytes
|
||||||
|
* @param excludedAddressRanges
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
virtual TargetMemoryBuffer readMemory(TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t bytes) = 0;
|
virtual TargetMemoryBuffer readMemory(
|
||||||
|
TargetMemoryType memoryType,
|
||||||
|
std::uint32_t startAddress,
|
||||||
|
std::uint32_t bytes,
|
||||||
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
||||||
|
) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should write memory to the target.
|
* Should write memory to the target.
|
||||||
|
|||||||
Reference in New Issue
Block a user