From 4209d9eb204f572131bc6c0dc0f29e3b97b35d4b Mon Sep 17 00:00:00 2001 From: Nav Date: Sun, 1 May 2022 18:44:04 +0100 Subject: [PATCH] New GetTargetProgramCounter TC command --- .../Commands/CommandTypes.hpp | 1 + .../Commands/GetTargetProgramCounter.hpp | 25 +++++++++++++++++++ .../Responses/ResponseTypes.hpp | 1 + .../Responses/TargetProgramCounter.hpp | 24 ++++++++++++++++++ .../TargetControllerComponent.cpp | 13 ++++++++++ .../TargetControllerComponent.hpp | 5 ++++ .../TargetControllerConsole.cpp | 9 +++++++ .../TargetControllerConsole.hpp | 7 ++++++ 8 files changed, 85 insertions(+) create mode 100644 src/TargetController/Commands/GetTargetProgramCounter.hpp create mode 100644 src/TargetController/Responses/TargetProgramCounter.hpp diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index 1ebe8cbb..47ebfba9 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -23,6 +23,7 @@ namespace Bloom::TargetController::Commands GET_TARGET_PIN_STATES, SET_TARGET_PIN_STATE, GET_TARGET_STACK_POINTER, + GET_TARGET_PROGRAM_COUNTER, GET_TARGET_DESCRIPTOR, }; } diff --git a/src/TargetController/Commands/GetTargetProgramCounter.hpp b/src/TargetController/Commands/GetTargetProgramCounter.hpp new file mode 100644 index 00000000..43e1c80c --- /dev/null +++ b/src/TargetController/Commands/GetTargetProgramCounter.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "Command.hpp" + +#include "src/TargetController/Responses/TargetProgramCounter.hpp" + +namespace Bloom::TargetController::Commands +{ + class GetTargetProgramCounter: public Command + { + public: + using SuccessResponseType = Responses::TargetProgramCounter; + + static constexpr CommandType type = CommandType::GET_TARGET_PROGRAM_COUNTER; + static inline const std::string name = "GetTargetProgramCounter"; + + [[nodiscard]] CommandType getType() const override { + return GetTargetProgramCounter::type; + } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } + }; +} diff --git a/src/TargetController/Responses/ResponseTypes.hpp b/src/TargetController/Responses/ResponseTypes.hpp index af717ed5..609c27f8 100644 --- a/src/TargetController/Responses/ResponseTypes.hpp +++ b/src/TargetController/Responses/ResponseTypes.hpp @@ -13,6 +13,7 @@ namespace Bloom::TargetController::Responses TARGET_STATE, TARGET_PIN_STATES, TARGET_STACK_POINTER, + TARGET_PROGRAM_COUNTER, TARGET_DESCRIPTOR, }; } diff --git a/src/TargetController/Responses/TargetProgramCounter.hpp b/src/TargetController/Responses/TargetProgramCounter.hpp new file mode 100644 index 00000000..5c3da181 --- /dev/null +++ b/src/TargetController/Responses/TargetProgramCounter.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "Response.hpp" + +namespace Bloom::TargetController::Responses +{ + class TargetProgramCounter: public Response + { + public: + static constexpr ResponseType type = ResponseType::TARGET_PROGRAM_COUNTER; + + std::uint32_t programCounter; + + explicit TargetProgramCounter(std::uint32_t programCounter) + : programCounter(programCounter) + {} + + [[nodiscard]] ResponseType getType() const override { + return TargetProgramCounter::type; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 6afcd0bc..72a955c9 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -38,12 +38,14 @@ namespace Bloom::TargetController using Commands::GetTargetPinStates; using Commands::SetTargetPinState; using Commands::GetTargetStackPointer; + using Commands::GetTargetProgramCounter; using Responses::Response; using Responses::TargetRegistersRead; using Responses::TargetMemoryRead; using Responses::TargetPinStates; using Responses::TargetStackPointer; + using Responses::TargetProgramCounter; TargetControllerComponent::TargetControllerComponent( const ProjectConfig& projectConfig, @@ -410,6 +412,7 @@ namespace Bloom::TargetController this->deregisterCommandHandler(GetTargetPinStates::type); this->deregisterCommandHandler(SetTargetPinState::type); this->deregisterCommandHandler(GetTargetStackPointer::type); + this->deregisterCommandHandler(GetTargetProgramCounter::type); this->eventListener->deregisterCallbacksForEventType(); @@ -492,6 +495,10 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::handleGetTargetStackPointer, this, std::placeholders::_1) ); + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleGetTargetProgramCounter, this, std::placeholders::_1) + ); + this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1) ); @@ -895,4 +902,10 @@ namespace Bloom::TargetController ) { return std::make_unique(this->target->getStackPointer()); } + + std::unique_ptr TargetControllerComponent::handleGetTargetProgramCounter( + GetTargetProgramCounter& command + ) { + return std::make_unique(this->target->getProgramCounter()); + } } diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index 4d8038c8..83300ad7 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -34,6 +34,7 @@ #include "Commands/GetTargetPinStates.hpp" #include "Commands/SetTargetPinState.hpp" #include "Commands/GetTargetStackPointer.hpp" +#include "Commands/GetTargetProgramCounter.hpp" // Responses #include "Responses/Response.hpp" @@ -43,6 +44,7 @@ #include "Responses/TargetMemoryRead.hpp" #include "Responses/TargetPinStates.hpp" #include "Responses/TargetStackPointer.hpp" +#include "Responses/TargetProgramCounter.hpp" #include "TargetControllerState.hpp" @@ -318,5 +320,8 @@ namespace Bloom::TargetController std::unique_ptr handleGetTargetStackPointer( Commands::GetTargetStackPointer& command ); + std::unique_ptr handleGetTargetProgramCounter( + Commands::GetTargetProgramCounter& command + ); }; } diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index 43c40c5e..b5888224 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -21,6 +21,7 @@ #include "Commands/GetTargetPinStates.hpp" #include "Commands/SetTargetPinState.hpp" #include "Commands/GetTargetStackPointer.hpp" +#include "Commands/GetTargetProgramCounter.hpp" #include "src/Logger/Logger.hpp" @@ -46,6 +47,7 @@ namespace Bloom::TargetController using Commands::GetTargetPinStates; using Commands::SetTargetPinState; using Commands::GetTargetStackPointer; + using Commands::GetTargetProgramCounter; TargetControllerConsole::TargetControllerConsole(EventListener& eventListener) : eventListener(eventListener) @@ -167,6 +169,13 @@ namespace Bloom::TargetController ); } + std::uint32_t TargetControllerConsole::getProgramCounter() { + return this->commandManager.sendCommandAndWaitForResponse( + std::make_unique(), + this->defaultTimeout + )->programCounter; + } + void TargetControllerConsole::setProgramCounter(std::uint32_t address) { this->commandManager.sendCommandAndWaitForResponse( std::make_unique(address), diff --git a/src/TargetController/TargetControllerConsole.hpp b/src/TargetController/TargetControllerConsole.hpp index 22dec3a4..e5c8b49e 100644 --- a/src/TargetController/TargetControllerConsole.hpp +++ b/src/TargetController/TargetControllerConsole.hpp @@ -144,6 +144,13 @@ namespace Bloom::TargetController */ void removeBreakpoint(Targets::TargetBreakpoint breakpoint); + /** + * Retrieves the current program counter value from the target. + * + * @return + */ + std::uint32_t getProgramCounter(); + /** * Sets the target's program counter to the given address. *