diff --git a/src/EventManager/Events/Event.hpp b/src/EventManager/Events/Event.hpp index 477d53c1..73a2321b 100644 --- a/src/EventManager/Events/Event.hpp +++ b/src/EventManager/Events/Event.hpp @@ -29,8 +29,6 @@ namespace Bloom::Events REGISTERS_WRITTEN_TO_TARGET, TARGET_EXECUTION_RESUMED, TARGET_EXECUTION_STOPPED, - RETRIEVE_MEMORY_FROM_TARGET, - MEMORY_RETRIEVED_FROM_TARGET, WRITE_MEMORY_TO_TARGET, MEMORY_WRITTEN_TO_TARGET, SET_BREAKPOINT_ON_TARGET, diff --git a/src/EventManager/Events/Events.hpp b/src/EventManager/Events/Events.hpp index ec147a45..cbe359f0 100644 --- a/src/EventManager/Events/Events.hpp +++ b/src/EventManager/Events/Events.hpp @@ -16,8 +16,6 @@ #include "RegistersWrittenToTarget.hpp" #include "TargetExecutionResumed.hpp" #include "TargetExecutionStopped.hpp" -#include "RetrieveMemoryFromTarget.hpp" -#include "MemoryRetrievedFromTarget.hpp" #include "WriteMemoryToTarget.hpp" #include "MemoryWrittenToTarget.hpp" #include "SetBreakpointOnTarget.hpp" diff --git a/src/EventManager/Events/MemoryRetrievedFromTarget.hpp b/src/EventManager/Events/MemoryRetrievedFromTarget.hpp deleted file mode 100644 index 4be53eca..00000000 --- a/src/EventManager/Events/MemoryRetrievedFromTarget.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include - -#include "Event.hpp" -#include "src/Targets/TargetMemory.hpp" - -namespace Bloom::Events -{ - class MemoryRetrievedFromTarget: public Event - { - public: - static constexpr EventType type = EventType::MEMORY_RETRIEVED_FROM_TARGET; - static inline const std::string name = "MemoryRetrievedFromTarget"; - Targets::TargetMemoryBuffer data; - - [[nodiscard]] EventType getType() const override { - return MemoryRetrievedFromTarget::type; - } - - [[nodiscard]] std::string getName() const override { - return MemoryRetrievedFromTarget::name; - } - }; -} diff --git a/src/EventManager/Events/RetrieveMemoryFromTarget.hpp b/src/EventManager/Events/RetrieveMemoryFromTarget.hpp deleted file mode 100644 index 7ec96d0f..00000000 --- a/src/EventManager/Events/RetrieveMemoryFromTarget.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include -#include - -#include "Event.hpp" -#include "MemoryRetrievedFromTarget.hpp" -#include "src/Targets/TargetMemory.hpp" - -namespace Bloom::Events -{ - class RetrieveMemoryFromTarget: public Event - { - public: - using TargetControllerResponseType = MemoryRetrievedFromTarget; - - static constexpr EventType type = EventType::RETRIEVE_MEMORY_FROM_TARGET; - static inline const std::string name = "RetrieveMemoryFromTarget"; - Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM; - std::uint32_t startAddress = 0; - std::uint32_t bytes = 0; - std::set excludedAddressRanges; - - [[nodiscard]] EventType getType() const override { - return RetrieveMemoryFromTarget::type; - } - - [[nodiscard]] std::string getName() const override { - return RetrieveMemoryFromTarget::name; - } - }; -} diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index 9615856b..33f78769 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -12,5 +12,6 @@ namespace Bloom::TargetController::Commands RESET_TARGET, READ_TARGET_REGISTERS, WRITE_TARGET_REGISTERS, + READ_TARGET_MEMORY, }; } diff --git a/src/TargetController/Commands/ReadTargetMemory.hpp b/src/TargetController/Commands/ReadTargetMemory.hpp new file mode 100644 index 00000000..147e5f06 --- /dev/null +++ b/src/TargetController/Commands/ReadTargetMemory.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include "Command.hpp" +#include "src/TargetController/Responses/TargetMemoryRead.hpp" + +#include "src/Targets/TargetRegister.hpp" + +namespace Bloom::TargetController::Commands +{ + class ReadTargetMemory: public Command + { + public: + using SuccessResponseType = Responses::TargetMemoryRead; + + static constexpr CommandType type = CommandType::READ_TARGET_MEMORY; + static inline const std::string name = "ReadTargetMemory"; + + Targets::TargetMemoryType memoryType; + std::uint32_t startAddress; + std::uint32_t bytes; + std::set excludedAddressRanges; + + explicit ReadTargetMemory( + Targets::TargetMemoryType memoryType, + std::uint32_t startAddress, + std::uint32_t bytes, + const std::set& excludedAddressRanges + ) + : memoryType(memoryType) + , startAddress(startAddress) + , bytes(bytes) + , excludedAddressRanges(excludedAddressRanges) + {}; + + [[nodiscard]] CommandType getType() const override { + return ReadTargetMemory::type; + } + }; +} diff --git a/src/TargetController/Responses/ResponseTypes.hpp b/src/TargetController/Responses/ResponseTypes.hpp index b2280d48..e8abfa39 100644 --- a/src/TargetController/Responses/ResponseTypes.hpp +++ b/src/TargetController/Responses/ResponseTypes.hpp @@ -9,5 +9,6 @@ namespace Bloom::TargetController::Responses GENERIC, ERROR, TARGET_REGISTERS_READ, + TARGET_MEMORY_READ, }; } diff --git a/src/TargetController/Responses/TargetMemoryRead.hpp b/src/TargetController/Responses/TargetMemoryRead.hpp new file mode 100644 index 00000000..31962cdc --- /dev/null +++ b/src/TargetController/Responses/TargetMemoryRead.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "Response.hpp" + +#include "src/Targets/TargetMemory.hpp" + +namespace Bloom::TargetController::Responses +{ + class TargetMemoryRead: public Response + { + public: + static constexpr ResponseType type = ResponseType::TARGET_MEMORY_READ; + + Targets::TargetMemoryBuffer data; + + TargetMemoryRead(const Targets::TargetMemoryBuffer& data) + : data(data) + {} + + [[nodiscard]] ResponseType getType() const override { + return TargetMemoryRead::type; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index e85a9f31..aced880b 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -27,9 +27,11 @@ namespace Bloom::TargetController using Commands::ResetTarget; using Commands::ReadTargetRegisters; using Commands::WriteTargetRegisters; + using Commands::ReadTargetMemory; using Responses::Response; using Responses::TargetRegistersRead; + using Responses::TargetMemoryRead; TargetControllerComponent::TargetControllerComponent( const ProjectConfig& projectConfig, @@ -379,11 +381,11 @@ namespace Bloom::TargetController this->deregisterCommandHandler(ResetTarget::type); this->deregisterCommandHandler(ReadTargetRegisters::type); this->deregisterCommandHandler(WriteTargetRegisters::type); + this->deregisterCommandHandler(ReadTargetMemory::type); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); - this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); @@ -428,6 +430,10 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::handleWriteTargetRegisters, this, std::placeholders::_1) ); + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleReadTargetMemory, this, std::placeholders::_1) + ); + this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1) ); @@ -440,10 +446,6 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::onStepTargetExecutionEvent, this, std::placeholders::_1) ); - this->eventListener->registerCallbackForEventType( - std::bind(&TargetControllerComponent::onReadMemoryEvent, this, std::placeholders::_1) - ); - this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onWriteMemoryEvent, this, std::placeholders::_1) ); @@ -783,6 +785,15 @@ namespace Bloom::TargetController return std::make_unique(); } + std::unique_ptr TargetControllerComponent::handleReadTargetMemory(ReadTargetMemory& command) { + return std::make_unique(this->target->readMemory( + command.memoryType, + command.startAddress, + command.bytes, + command.excludedAddressRanges + )); + } + void TargetControllerComponent::onStepTargetExecutionEvent(const Events::StepTargetExecution& event) { try { if (this->target->getState() != TargetState::STOPPED) { @@ -807,25 +818,6 @@ namespace Bloom::TargetController } } - void TargetControllerComponent::onReadMemoryEvent(const Events::RetrieveMemoryFromTarget& event) { - try { - auto memoryReadEvent = std::make_shared(); - memoryReadEvent->correlationId = event.id; - memoryReadEvent->data = this->target->readMemory( - event.memoryType, - event.startAddress, - event.bytes, - event.excludedAddressRanges - ); - - EventManager::triggerEvent(memoryReadEvent); - - } catch (const TargetOperationFailure& exception) { - Logger::error("Failed to read memory from target - " + exception.getMessage()); - this->emitErrorEvent(event.id, exception.getMessage()); - } - } - void TargetControllerComponent::onWriteMemoryEvent(const Events::WriteMemoryToTarget& event) { try { const auto& buffer = event.buffer; diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index fcfc7206..413d5835 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -22,10 +22,12 @@ #include "Commands/ResetTarget.hpp" #include "Commands/ReadTargetRegisters.hpp" #include "Commands/WriteTargetRegisters.hpp" +#include "Commands/ReadTargetMemory.hpp" // Responses #include "Responses/Response.hpp" #include "Responses/TargetRegistersRead.hpp" +#include "Responses/TargetMemoryRead.hpp" #include "TargetControllerState.hpp" @@ -298,6 +300,7 @@ namespace Bloom::TargetController Commands::ReadTargetRegisters& command ); std::unique_ptr handleWriteTargetRegisters(Commands::WriteTargetRegisters& command); + std::unique_ptr handleReadTargetMemory(Commands::ReadTargetMemory& command); /** * Will attempt to step execution on the target and emit a TargetExecutionResumed event. @@ -306,13 +309,6 @@ namespace Bloom::TargetController */ void onStepTargetExecutionEvent(const Events::StepTargetExecution& event); - /** - * Will attempt to read memory from the target and include the data in a MemoryRetrievedFromTarget event. - * - * @param event - */ - void onReadMemoryEvent(const Events::RetrieveMemoryFromTarget& event); - /** * Will attempt to write memory to the target. On success, a MemoryWrittenToTarget event is emitted. * diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index 325d682a..c074495d 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -8,6 +8,7 @@ #include "Commands/ResetTarget.hpp" #include "Commands/ReadTargetRegisters.hpp" #include "Commands/WriteTargetRegisters.hpp" +#include "Commands/ReadTargetMemory.hpp" #include "src/Logger/Logger.hpp" @@ -22,6 +23,7 @@ namespace Bloom::TargetController using Commands::ResetTarget; using Commands::ReadTargetRegisters; using Commands::WriteTargetRegisters; + using Commands::ReadTargetMemory; TargetControllerConsole::TargetControllerConsole(EventListener& eventListener) : eventListener(eventListener) @@ -98,13 +100,15 @@ namespace Bloom::TargetController std::uint32_t bytes, const std::set& excludedAddressRanges ) { - auto readMemoryEvent = std::make_shared(); - readMemoryEvent->memoryType = memoryType; - readMemoryEvent->startAddress = startAddress; - readMemoryEvent->bytes = bytes; - readMemoryEvent->excludedAddressRanges = excludedAddressRanges; - - return this->triggerTargetControllerEventAndWaitForResponse(readMemoryEvent)->data; + return this->commandManager.sendCommandAndWaitForResponse( + std::make_unique( + memoryType, + startAddress, + bytes, + excludedAddressRanges + ), + this->defaultTimeout + )->data; } void TargetControllerConsole::writeMemory(