diff --git a/CMakeLists.txt b/CMakeLists.txt index fc4bb065..bf582b7b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,8 +100,8 @@ add_executable(Bloom src/DebugServers/GdbRsp/CommandPackets/CommandPacket.cpp src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp src/DebugServers/GdbRsp/CommandPackets/SupportedFeaturesQuery.cpp - src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.cpp - src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.cpp + src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp + src/DebugServers/GdbRsp/CommandPackets/WriteRegister.cpp src/DebugServers/GdbRsp/CommandPackets/ContinueExecution.cpp src/DebugServers/GdbRsp/CommandPackets/StepExecution.cpp src/DebugServers/GdbRsp/CommandPackets/InterruptExecution.cpp diff --git a/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp b/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp index 1972d7bd..34e12483 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp +++ b/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp @@ -24,10 +24,10 @@ std::unique_ptr CommandPacketFactory::create(std::vector(rawPacket); } else if (rawPacketString[1] == 'g' || rawPacketString[1] == 'p') { - return std::make_unique(rawPacket); + return std::make_unique(rawPacket); } else if (rawPacketString[1] == 'P') { - return std::make_unique(rawPacket); + return std::make_unique(rawPacket); } else if (rawPacketString[1] == 'c') { return std::make_unique(rawPacket); diff --git a/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.hpp b/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.hpp index 383a0b52..5a19b28a 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.hpp +++ b/src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.hpp @@ -7,8 +7,8 @@ #include "CommandPacket.hpp" #include "InterruptExecution.hpp" #include "SupportedFeaturesQuery.hpp" -#include "ReadGeneralRegisters.hpp" -#include "WriteGeneralRegister.hpp" +#include "ReadRegisters.hpp" +#include "WriteRegister.hpp" #include "ReadMemory.hpp" #include "WriteMemory.hpp" #include "StepExecution.hpp" diff --git a/src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.cpp b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp similarity index 72% rename from src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.cpp rename to src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp index 4e97f536..1b6095d9 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.cpp +++ b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp @@ -1,15 +1,15 @@ -#include "ReadGeneralRegisters.hpp" +#include "ReadRegisters.hpp" #include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp" using namespace Bloom::DebugServers::Gdb::CommandPackets; -void ReadGeneralRegisters::init() { +void ReadRegisters::init() { if (this->data.size() >= 2 && this->data.front() == 'p') { // This command packet is requesting a specific register this->registerNumber = static_cast(std::stoi(std::string(this->data.begin() + 1, this->data.end()))); } } -void ReadGeneralRegisters::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) { +void ReadRegisters::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) { gdbRspDebugServer.handleGdbPacket(*this); } diff --git a/src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.hpp b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp similarity index 76% rename from src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.hpp rename to src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp index 5735992a..22d576bc 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.hpp +++ b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp @@ -7,11 +7,11 @@ namespace Bloom::DebugServers::Gdb::CommandPackets { /** - * The ReadGeneralRegisters class implements a structure for "g" and "p" command packets. In response to these + * The ReadRegisters class implements a structure for "g" and "p" command packets. In response to these * packets, the server is expected to send register values for all registers (for "g" packets) or for a single * register (for "p" packets). */ - class ReadGeneralRegisters: public CommandPacket + class ReadRegisters: public CommandPacket { private: void init(); @@ -26,7 +26,7 @@ namespace Bloom::DebugServers::Gdb::CommandPackets */ std::optional registerNumber; - explicit ReadGeneralRegisters(const std::vector& rawPacket): CommandPacket(rawPacket) { + explicit ReadRegisters(const std::vector& rawPacket): CommandPacket(rawPacket) { init(); }; diff --git a/src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.cpp b/src/DebugServers/GdbRsp/CommandPackets/WriteRegister.cpp similarity index 85% rename from src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.cpp rename to src/DebugServers/GdbRsp/CommandPackets/WriteRegister.cpp index d323b330..48057e14 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.cpp +++ b/src/DebugServers/GdbRsp/CommandPackets/WriteRegister.cpp @@ -1,11 +1,11 @@ -#include "WriteGeneralRegister.hpp" +#include "WriteRegister.hpp" #include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp" #include "src/Exceptions/Exception.hpp" using namespace Bloom::DebugServers::Gdb::CommandPackets; using namespace Bloom::Exceptions; -void WriteGeneralRegister::init() { +void WriteRegister::init() { // The P packet updates a single register auto packet = std::string(this->data.begin(), this->data.end()); @@ -23,6 +23,6 @@ void WriteGeneralRegister::init() { std::reverse(this->registerValue.begin(), this->registerValue.end()); } -void WriteGeneralRegister::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) { +void WriteRegister::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) { gdbRspDebugServer.handleGdbPacket(*this); } diff --git a/src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.hpp b/src/DebugServers/GdbRsp/CommandPackets/WriteRegister.hpp similarity index 64% rename from src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.hpp rename to src/DebugServers/GdbRsp/CommandPackets/WriteRegister.hpp index a5447127..d05a361c 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.hpp +++ b/src/DebugServers/GdbRsp/CommandPackets/WriteRegister.hpp @@ -8,10 +8,10 @@ namespace Bloom::DebugServers::Gdb::CommandPackets { /** - * The WriteGeneralRegisters class implements the structure for "P" packets. Upon receiving this packet, + * The WriteRegisters class implements the structure for "P" packets. Upon receiving this packet, * server is expected to update a register value to the target. */ - class WriteGeneralRegister: public CommandPacket + class WriteRegister: public CommandPacket { private: void init(); @@ -20,7 +20,7 @@ namespace Bloom::DebugServers::Gdb::CommandPackets int registerNumber = 0; std::vector registerValue; - explicit WriteGeneralRegister(const std::vector& rawPacket): CommandPacket(rawPacket) { + explicit WriteRegister(const std::vector& rawPacket): CommandPacket(rawPacket) { init(); }; diff --git a/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp b/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp index 29325c59..c2b4ed00 100644 --- a/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp +++ b/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp @@ -54,19 +54,20 @@ void GdbRspDebugServer::init() { } if (::setsockopt( - socketFileDescriptor, - SOL_SOCKET, - SO_REUSEADDR, - &this->enableReuseAddressSocketOption, - sizeof(this->enableReuseAddressSocketOption)) < 0 + socketFileDescriptor, + SOL_SOCKET, + SO_REUSEADDR, + &(this->enableReuseAddressSocketOption), + sizeof(this->enableReuseAddressSocketOption) + ) < 0 ) { Logger::error("Failed to set socket SO_REUSEADDR option."); } if (::bind( - socketFileDescriptor, - reinterpret_cast(&(this->socketAddress)), - sizeof(this->socketAddress) + socketFileDescriptor, + reinterpret_cast(&(this->socketAddress)), + sizeof(this->socketAddress) ) < 0 ) { throw Exception("Failed to bind address. The selected port number (" @@ -258,11 +259,12 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::SupportedFeaturesQuery& this->clientConnection->writePacket(response); } -void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadGeneralRegisters& packet) { - Logger::debug("Handling ReadGeneralRegisters packet"); +void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadRegisters& packet) { + Logger::debug("Handling ReadRegisters packet"); try { auto descriptors = TargetRegisterDescriptors(); + auto registerNumberToDescriptorMapping = this->getRegisterNumberToDescriptorMapping(); if (packet.registerNumber.has_value()) { Logger::debug("Reading register number: " + std::to_string(packet.registerNumber.value())); @@ -270,14 +272,12 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadGeneralRegisters& pa } else { // Read all descriptors - auto descriptorMapping = this->getRegisterNumberToDescriptorMapping(); - for (auto& descriptor : descriptorMapping.getMap()) { + for (auto& descriptor : registerNumberToDescriptorMapping.getMap()) { descriptors.push_back(descriptor.second); } } - auto registerSet = this->targetControllerConsole.readGeneralRegisters(descriptors); - auto registerNumberToDescriptorMapping = this->getRegisterNumberToDescriptorMapping(); + auto registerSet = this->targetControllerConsole.readRegisters(descriptors); /* * Remove any registers that are not mapped to GDB register numbers (as we won't know where to place @@ -332,14 +332,14 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadGeneralRegisters& pa } } -void GdbRspDebugServer::handleGdbPacket(CommandPackets::WriteGeneralRegister& packet) { - Logger::debug("Handling WriteGeneralRegisters packet"); +void GdbRspDebugServer::handleGdbPacket(CommandPackets::WriteRegister& packet) { + Logger::debug("Handling WriteRegister packet"); try { auto registerDescriptor = this->getRegisterDescriptorFromNumber(packet.registerNumber); - this->targetControllerConsole.writeGeneralRegisters({ - TargetRegister(registerDescriptor, packet.registerValue) - }); + this->targetControllerConsole.writeRegisters({ + TargetRegister(registerDescriptor, packet.registerValue) + }); this->clientConnection->writePacket(ResponsePacket({'O', 'K'})); } catch (const Exception& exception) { diff --git a/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp b/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp index 6f1a875b..3122f033 100644 --- a/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp +++ b/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp @@ -140,10 +140,10 @@ namespace Bloom::DebugServers::Gdb * * @return */ - virtual BiMap< + virtual const BiMap< GdbRegisterNumber, Targets::TargetRegisterDescriptor - > getRegisterNumberToDescriptorMapping() = 0; + >& getRegisterNumberToDescriptorMapping() = 0; /** * Obtains the appropriate register descriptor from a register number. @@ -197,14 +197,14 @@ namespace Bloom::DebugServers::Gdb * * @param packet */ - virtual void handleGdbPacket(CommandPackets::ReadGeneralRegisters& packet); + virtual void handleGdbPacket(CommandPackets::ReadRegisters& packet); /** * Handles the write general register ("P") command packet. * * @param packet */ - virtual void handleGdbPacket(CommandPackets::WriteGeneralRegister& packet); + virtual void handleGdbPacket(CommandPackets::WriteRegister& packet); /** * Handles the continue execution ("c") command packet. diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index 2f3ed66e..9460063b 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -10,20 +10,20 @@ using namespace Bloom::Events; using namespace Bloom::Exceptions; TargetControllerState TargetControllerConsole::getTargetControllerState() { - auto getStateEvent = std::make_shared(); + auto getStateEvent = std::make_shared(); this->eventManager.triggerEvent(getStateEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::TargetControllerStateReported, - Events::TargetControllerErrorOccurred + TargetControllerStateReported, + TargetControllerErrorOccurred >(this->defaultTimeout, getStateEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } - auto stateReportedEvent = std::get>(responseEvent.value()); + auto stateReportedEvent = std::get>(responseEvent.value()); return stateReportedEvent->state; } @@ -37,41 +37,41 @@ bool TargetControllerConsole::isTargetControllerInService() noexcept { } Targets::TargetDescriptor TargetControllerConsole::getTargetDescriptor() { - auto extractEvent = std::make_shared(); + auto extractEvent = std::make_shared(); this->eventManager.triggerEvent(extractEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::TargetDescriptorExtracted, - Events::TargetControllerErrorOccurred + TargetDescriptorExtracted, + TargetControllerErrorOccurred >(this->defaultTimeout, extractEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } - auto descriptorExtracted = std::get>(responseEvent.value()); + auto descriptorExtracted = std::get>(responseEvent.value()); return descriptorExtracted->targetDescriptor; } void TargetControllerConsole::stopTargetExecution() { - auto stopTargetEvent = std::make_shared(); + auto stopTargetEvent = std::make_shared(); this->eventManager.triggerEvent(stopTargetEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::TargetExecutionStopped, - Events::TargetControllerErrorOccurred + TargetExecutionStopped, + TargetControllerErrorOccurred >(this->defaultTimeout, stopTargetEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } void TargetControllerConsole::continueTargetExecution(std::optional fromAddress) { - auto resumeExecutionEvent = std::make_shared(); + auto resumeExecutionEvent = std::make_shared(); if (fromAddress.has_value()) { resumeExecutionEvent->fromProgramCounter = fromAddress.value(); @@ -79,19 +79,19 @@ void TargetControllerConsole::continueTargetExecution(std::optionaleventManager.triggerEvent(resumeExecutionEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::TargetExecutionResumed, - Events::TargetControllerErrorOccurred + TargetExecutionResumed, + TargetControllerErrorOccurred >(this->defaultTimeout, resumeExecutionEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } void TargetControllerConsole::stepTargetExecution(std::optional fromAddress) { - auto stepExecutionEvent = std::make_shared(); + auto stepExecutionEvent = std::make_shared(); if (fromAddress.has_value()) { stepExecutionEvent->fromProgramCounter = fromAddress.value(); @@ -99,51 +99,51 @@ void TargetControllerConsole::stepTargetExecution(std::optional f this->eventManager.triggerEvent(stepExecutionEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::TargetExecutionResumed, - Events::TargetControllerErrorOccurred + TargetExecutionResumed, + TargetControllerErrorOccurred >(this->defaultTimeout, stepExecutionEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } -TargetRegisters TargetControllerConsole::readGeneralRegisters(TargetRegisterDescriptors descriptors) { - auto readRegistersEvent = std::make_shared(); +TargetRegisters TargetControllerConsole::readRegisters(const TargetRegisterDescriptors& descriptors) { + auto readRegistersEvent = std::make_shared(); readRegistersEvent->descriptors = descriptors; this->eventManager.triggerEvent(readRegistersEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::RegistersRetrievedFromTarget, - Events::TargetControllerErrorOccurred + RegistersRetrievedFromTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, readRegistersEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } - auto retrievedRegistersEvent = std::get>( + auto retrievedRegistersEvent = std::get>( responseEvent.value() ); return retrievedRegistersEvent->registers; } -void TargetControllerConsole::writeGeneralRegisters(TargetRegisters registers) { - auto event = std::make_shared(); - event->registers = registers; +void TargetControllerConsole::writeRegisters(const TargetRegisters& registers) { + auto event = std::make_shared(); + event->registers = std::move(registers); this->eventManager.triggerEvent(event); auto responseEvent = this->eventListener.waitForEvent< - Events::RegistersWrittenToTarget, - Events::TargetControllerErrorOccurred + RegistersWrittenToTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, event->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } @@ -154,24 +154,24 @@ TargetMemoryBuffer TargetControllerConsole::readMemory( std::uint32_t startAddress, std::uint32_t bytes ) { - auto readMemoryEvent = std::make_shared(); + auto readMemoryEvent = std::make_shared(); readMemoryEvent->memoryType = memoryType; readMemoryEvent->startAddress = startAddress; readMemoryEvent->bytes = bytes; this->eventManager.triggerEvent(readMemoryEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::MemoryRetrievedFromTarget, - Events::TargetControllerErrorOccurred + MemoryRetrievedFromTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, readMemoryEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } - auto retrievedRegistersEvent = std::get>( + auto retrievedRegistersEvent = std::get>( responseEvent.value() ); return retrievedRegistersEvent->data; @@ -182,67 +182,67 @@ void TargetControllerConsole::writeMemory( std::uint32_t startAddress, const TargetMemoryBuffer& buffer ) { - auto writeMemoryEvent = std::make_shared(); + auto writeMemoryEvent = std::make_shared(); writeMemoryEvent->memoryType = memoryType; writeMemoryEvent->startAddress = startAddress; writeMemoryEvent->buffer = buffer; this->eventManager.triggerEvent(writeMemoryEvent); auto responseEvent = this->eventListener.waitForEvent< - Events::MemoryWrittenToTarget, - Events::TargetControllerErrorOccurred + MemoryWrittenToTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, writeMemoryEvent->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } void TargetControllerConsole::setBreakpoint(TargetBreakpoint breakpoint) { - auto event = std::make_shared(); + auto event = std::make_shared(); event->breakpoint = breakpoint; this->eventManager.triggerEvent(event); auto responseEvent = this->eventListener.waitForEvent< - Events::BreakpointSetOnTarget, - Events::TargetControllerErrorOccurred + BreakpointSetOnTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, event->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } void TargetControllerConsole::removeBreakpoint(TargetBreakpoint breakpoint) { - auto event = std::make_shared(); + auto event = std::make_shared(); event->breakpoint = breakpoint; this->eventManager.triggerEvent(event); auto responseEvent = this->eventListener.waitForEvent< - Events::BreakpointRemovedOnTarget, - Events::TargetControllerErrorOccurred + BreakpointRemovedOnTarget, + TargetControllerErrorOccurred >(this->defaultTimeout, event->id); if (!responseEvent.has_value() - || !std::holds_alternative>(responseEvent.value()) + || !std::holds_alternative>(responseEvent.value()) ) { throw Exception("Unexpected response from TargetController"); } } void TargetControllerConsole::requestPinStates(int variantId) { - auto requestEvent = std::make_shared(); + auto requestEvent = std::make_shared(); requestEvent->variantId = variantId; this->eventManager.triggerEvent(requestEvent); } void TargetControllerConsole::setPinState(int variantId, TargetPinDescriptor pinDescriptor, TargetPinState pinState) { - auto updateEvent = std::make_shared(); + auto updateEvent = std::make_shared(); updateEvent->variantId = variantId; updateEvent->pinDescriptor = std::move(pinDescriptor); updateEvent->pinState = pinState; diff --git a/src/TargetController/TargetControllerConsole.hpp b/src/TargetController/TargetControllerConsole.hpp index 6fb3d05c..34aeeda1 100644 --- a/src/TargetController/TargetControllerConsole.hpp +++ b/src/TargetController/TargetControllerConsole.hpp @@ -75,14 +75,14 @@ namespace Bloom * * @return */ - Targets::TargetRegisters readGeneralRegisters(Targets::TargetRegisterDescriptors descriptors); + Targets::TargetRegisters readRegisters(const Targets::TargetRegisterDescriptors& descriptors); /** * Requests the TargetController to write register values to the target. * * @param registers */ - void writeGeneralRegisters(Targets::TargetRegisters registers); + void writeRegisters(const Targets::TargetRegisters& registers); /** * Requests the TargetController to read memory from the target.