From 7c4e39dd03f27916d3eb8249329f1e123726d6b4 Mon Sep 17 00:00:00 2001 From: Nav Date: Sat, 30 Apr 2022 23:10:07 +0100 Subject: [PATCH] Replaced SetProgramCounterOnTarget event with TC command --- src/EventManager/Events/Event.hpp | 2 -- src/EventManager/Events/Events.hpp | 2 -- .../Events/ProgramCounterSetOnTarget.hpp | 23 ------------- .../Events/SetProgramCounterOnTarget.hpp | 28 ---------------- .../Commands/CommandTypes.hpp | 1 + .../Commands/SetProgramCounter.hpp | 32 +++++++++++++++++++ .../TargetControllerComponent.cpp | 32 ++++++------------- .../TargetControllerComponent.hpp | 10 ++---- .../TargetControllerConsole.cpp | 9 ++++++ .../TargetControllerConsole.hpp | 7 ++++ 10 files changed, 60 insertions(+), 86 deletions(-) delete mode 100644 src/EventManager/Events/ProgramCounterSetOnTarget.hpp delete mode 100644 src/EventManager/Events/SetProgramCounterOnTarget.hpp create mode 100644 src/TargetController/Commands/SetProgramCounter.hpp diff --git a/src/EventManager/Events/Event.hpp b/src/EventManager/Events/Event.hpp index 1caa4524..83027a0d 100644 --- a/src/EventManager/Events/Event.hpp +++ b/src/EventManager/Events/Event.hpp @@ -29,8 +29,6 @@ namespace Bloom::Events TARGET_EXECUTION_RESUMED, TARGET_EXECUTION_STOPPED, MEMORY_WRITTEN_TO_TARGET, - SET_PROGRAM_COUNTER_ON_TARGET, - PROGRAM_COUNTER_SET_ON_TARGET, EXTRACT_TARGET_DESCRIPTOR, TARGET_DESCRIPTOR_EXTRACTED, INSIGHT_THREAD_STATE_CHANGED, diff --git a/src/EventManager/Events/Events.hpp b/src/EventManager/Events/Events.hpp index 5d41d233..2af4d421 100644 --- a/src/EventManager/Events/Events.hpp +++ b/src/EventManager/Events/Events.hpp @@ -16,8 +16,6 @@ #include "TargetExecutionResumed.hpp" #include "TargetExecutionStopped.hpp" #include "MemoryWrittenToTarget.hpp" -#include "SetProgramCounterOnTarget.hpp" -#include "ProgramCounterSetOnTarget.hpp" #include "ExtractTargetDescriptor.hpp" #include "TargetDescriptorExtracted.hpp" #include "InsightThreadStateChanged.hpp" diff --git a/src/EventManager/Events/ProgramCounterSetOnTarget.hpp b/src/EventManager/Events/ProgramCounterSetOnTarget.hpp deleted file mode 100644 index 354eba72..00000000 --- a/src/EventManager/Events/ProgramCounterSetOnTarget.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include - -#include "Event.hpp" - -namespace Bloom::Events -{ - class ProgramCounterSetOnTarget: public Event - { - public: - static constexpr EventType type = EventType::PROGRAM_COUNTER_SET_ON_TARGET; - static inline const std::string name = "ProgramCounterSetOnTarget"; - - [[nodiscard]] EventType getType() const override { - return ProgramCounterSetOnTarget::type; - } - - [[nodiscard]] std::string getName() const override { - return ProgramCounterSetOnTarget::name; - } - }; -} diff --git a/src/EventManager/Events/SetProgramCounterOnTarget.hpp b/src/EventManager/Events/SetProgramCounterOnTarget.hpp deleted file mode 100644 index 7a441ab7..00000000 --- a/src/EventManager/Events/SetProgramCounterOnTarget.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include -#include - -#include "Event.hpp" -#include "ProgramCounterSetOnTarget.hpp" - -namespace Bloom::Events -{ - class SetProgramCounterOnTarget: public Event - { - public: - using TargetControllerResponseType = ProgramCounterSetOnTarget; - - static constexpr EventType type = EventType::SET_PROGRAM_COUNTER_ON_TARGET; - static inline const std::string name = "SetProgramCounterOnTarget"; - std::uint32_t address = 0; - - [[nodiscard]] EventType getType() const override { - return SetProgramCounterOnTarget::type; - } - - [[nodiscard]] std::string getName() const override { - return SetProgramCounterOnTarget::name; - } - }; -} diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index cde70f19..96fbba1c 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -19,5 +19,6 @@ namespace Bloom::TargetController::Commands WRITE_TARGET_MEMORY, SET_BREAKPOINT, REMOVE_BREAKPOINT, + SET_PROGRAM_COUNTER, }; } diff --git a/src/TargetController/Commands/SetProgramCounter.hpp b/src/TargetController/Commands/SetProgramCounter.hpp new file mode 100644 index 00000000..7ded4e70 --- /dev/null +++ b/src/TargetController/Commands/SetProgramCounter.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "Command.hpp" + +#include "src/Targets/TargetBreakpoint.hpp" + +namespace Bloom::TargetController::Commands +{ + class SetProgramCounter: public Command + { + public: + static constexpr CommandType type = CommandType::SET_PROGRAM_COUNTER; + static inline const std::string name = "SetProgramCounter"; + + std::uint32_t address = 0; + + SetProgramCounter() = default; + explicit SetProgramCounter(std::uint32_t address) + : address(address) + {}; + + [[nodiscard]] CommandType getType() const override { + return SetProgramCounter::type; + } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 91862589..572a15cc 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -33,6 +33,7 @@ namespace Bloom::TargetController using Commands::StepTargetExecution; using Commands::SetBreakpoint; using Commands::RemoveBreakpoint; + using Commands::SetProgramCounter; using Responses::Response; using Responses::TargetRegistersRead; @@ -397,10 +398,10 @@ namespace Bloom::TargetController this->deregisterCommandHandler(StepTargetExecution::type); this->deregisterCommandHandler(SetBreakpoint::type); this->deregisterCommandHandler(RemoveBreakpoint::type); + this->deregisterCommandHandler(SetProgramCounter::type); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); - this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); @@ -465,6 +466,10 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::handleRemoveBreakpoint, this, std::placeholders::_1) ); + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleSetProgramCounter, this, std::placeholders::_1) + ); + this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1) ); @@ -473,10 +478,6 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::onExtractTargetDescriptor, this, std::placeholders::_1) ); - this->eventListener->registerCallbackForEventType( - std::bind(&TargetControllerComponent::onSetProgramCounterEvent, this, std::placeholders::_1) - ); - this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onRetrieveTargetPinStatesEvent, this, std::placeholders::_1) ); @@ -871,24 +872,9 @@ namespace Bloom::TargetController return std::make_unique(); } - void TargetControllerComponent::onSetProgramCounterEvent(const Events::SetProgramCounterOnTarget& event) { - try { - if (this->target->getState() != TargetState::STOPPED) { - throw TargetOperationFailure( - "Invalid target state - target must be stopped before the program counter can be updated" - ); - } - - this->target->setProgramCounter(event.address); - auto programCounterSetEvent = std::make_shared(); - programCounterSetEvent->correlationId = event.id; - - EventManager::triggerEvent(programCounterSetEvent); - - } catch (const TargetOperationFailure& exception) { - Logger::error("Failed to set program counter on target - " + exception.getMessage()); - this->emitErrorEvent(event.id, exception.getMessage()); - } + std::unique_ptr TargetControllerComponent::handleSetProgramCounter(SetProgramCounter& command) { + this->target->setProgramCounter(command.address); + return std::make_unique(); } void TargetControllerComponent::onRetrieveTargetPinStatesEvent(const Events::RetrieveTargetPinStates& event) { diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index 6f3b809f..a17b1671 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -29,6 +29,7 @@ #include "Commands/StepTargetExecution.hpp" #include "Commands/SetBreakpoint.hpp" #include "Commands/RemoveBreakpoint.hpp" +#include "Commands/SetProgramCounter.hpp" // Responses #include "Responses/Response.hpp" @@ -310,14 +311,7 @@ namespace Bloom::TargetController std::unique_ptr handleStepTargetExecution(Commands::StepTargetExecution& command); std::unique_ptr handleSetBreakpoint(Commands::SetBreakpoint& command); std::unique_ptr handleRemoveBreakpoint(Commands::RemoveBreakpoint& command); - - /** - * Will update the program counter value on the target. On success, a ProgramCounterSetOnTarget event is - * emitted. - * - * @param event - */ - void onSetProgramCounterEvent(const Events::SetProgramCounterOnTarget& event); + std::unique_ptr handleSetProgramCounter(Commands::SetProgramCounter& command); /** * Will attempt to obtain the pin states from the target. Will emit a TargetPinStatesRetrieved event on success. diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index fd8d7e9d..0f31bf23 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -16,6 +16,7 @@ #include "Commands/StepTargetExecution.hpp" #include "Commands/SetBreakpoint.hpp" #include "Commands/RemoveBreakpoint.hpp" +#include "Commands/SetProgramCounter.hpp" #include "src/Logger/Logger.hpp" @@ -36,6 +37,7 @@ namespace Bloom::TargetController using Commands::StepTargetExecution; using Commands::SetBreakpoint; using Commands::RemoveBreakpoint; + using Commands::SetProgramCounter; TargetControllerConsole::TargetControllerConsole(EventListener& eventListener) : eventListener(eventListener) @@ -156,6 +158,13 @@ namespace Bloom::TargetController ); } + void TargetControllerConsole::setProgramCounter(std::uint32_t address) { + this->commandManager.sendCommandAndWaitForResponse( + std::make_unique(address), + this->defaultTimeout + ); + } + Targets::TargetPinStateMappingType TargetControllerConsole::getPinStates(int variantId) { auto requestEvent = std::make_shared(); requestEvent->variantId = variantId; diff --git a/src/TargetController/TargetControllerConsole.hpp b/src/TargetController/TargetControllerConsole.hpp index fccfe5e5..22dec3a4 100644 --- a/src/TargetController/TargetControllerConsole.hpp +++ b/src/TargetController/TargetControllerConsole.hpp @@ -144,6 +144,13 @@ namespace Bloom::TargetController */ void removeBreakpoint(Targets::TargetBreakpoint breakpoint); + /** + * Sets the target's program counter to the given address. + * + * @param address + */ + void setProgramCounter(std::uint32_t address); + /** * Retrieves the pin states for a particular target variant. *