Renamed GDB & TargetConrollerConsole read & write register functions/classes to a more generic name.
This commit is contained in:
@@ -100,8 +100,8 @@ add_executable(Bloom
|
|||||||
src/DebugServers/GdbRsp/CommandPackets/CommandPacket.cpp
|
src/DebugServers/GdbRsp/CommandPackets/CommandPacket.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp
|
src/DebugServers/GdbRsp/CommandPackets/CommandPacketFactory.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/SupportedFeaturesQuery.cpp
|
src/DebugServers/GdbRsp/CommandPackets/SupportedFeaturesQuery.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/ReadGeneralRegisters.cpp
|
src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/WriteGeneralRegister.cpp
|
src/DebugServers/GdbRsp/CommandPackets/WriteRegister.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/ContinueExecution.cpp
|
src/DebugServers/GdbRsp/CommandPackets/ContinueExecution.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/StepExecution.cpp
|
src/DebugServers/GdbRsp/CommandPackets/StepExecution.cpp
|
||||||
src/DebugServers/GdbRsp/CommandPackets/InterruptExecution.cpp
|
src/DebugServers/GdbRsp/CommandPackets/InterruptExecution.cpp
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ std::unique_ptr<CommandPacket> CommandPacketFactory::create(std::vector<unsigned
|
|||||||
return std::make_unique<CommandPackets::SupportedFeaturesQuery>(rawPacket);
|
return std::make_unique<CommandPackets::SupportedFeaturesQuery>(rawPacket);
|
||||||
|
|
||||||
} else if (rawPacketString[1] == 'g' || rawPacketString[1] == 'p') {
|
} else if (rawPacketString[1] == 'g' || rawPacketString[1] == 'p') {
|
||||||
return std::make_unique<CommandPackets::ReadGeneralRegisters>(rawPacket);
|
return std::make_unique<CommandPackets::ReadRegisters>(rawPacket);
|
||||||
|
|
||||||
} else if (rawPacketString[1] == 'P') {
|
} else if (rawPacketString[1] == 'P') {
|
||||||
return std::make_unique<CommandPackets::WriteGeneralRegister>(rawPacket);
|
return std::make_unique<CommandPackets::WriteRegister>(rawPacket);
|
||||||
|
|
||||||
} else if (rawPacketString[1] == 'c') {
|
} else if (rawPacketString[1] == 'c') {
|
||||||
return std::make_unique<CommandPackets::ContinueExecution>(rawPacket);
|
return std::make_unique<CommandPackets::ContinueExecution>(rawPacket);
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
#include "CommandPacket.hpp"
|
#include "CommandPacket.hpp"
|
||||||
#include "InterruptExecution.hpp"
|
#include "InterruptExecution.hpp"
|
||||||
#include "SupportedFeaturesQuery.hpp"
|
#include "SupportedFeaturesQuery.hpp"
|
||||||
#include "ReadGeneralRegisters.hpp"
|
#include "ReadRegisters.hpp"
|
||||||
#include "WriteGeneralRegister.hpp"
|
#include "WriteRegister.hpp"
|
||||||
#include "ReadMemory.hpp"
|
#include "ReadMemory.hpp"
|
||||||
#include "WriteMemory.hpp"
|
#include "WriteMemory.hpp"
|
||||||
#include "StepExecution.hpp"
|
#include "StepExecution.hpp"
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
#include "ReadGeneralRegisters.hpp"
|
#include "ReadRegisters.hpp"
|
||||||
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
||||||
|
|
||||||
using namespace Bloom::DebugServers::Gdb::CommandPackets;
|
using namespace Bloom::DebugServers::Gdb::CommandPackets;
|
||||||
|
|
||||||
void ReadGeneralRegisters::init() {
|
void ReadRegisters::init() {
|
||||||
if (this->data.size() >= 2 && this->data.front() == 'p') {
|
if (this->data.size() >= 2 && this->data.front() == 'p') {
|
||||||
// This command packet is requesting a specific register
|
// This command packet is requesting a specific register
|
||||||
this->registerNumber = static_cast<size_t>(std::stoi(std::string(this->data.begin() + 1, this->data.end())));
|
this->registerNumber = static_cast<size_t>(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);
|
gdbRspDebugServer.handleGdbPacket(*this);
|
||||||
}
|
}
|
||||||
@@ -7,11 +7,11 @@
|
|||||||
namespace Bloom::DebugServers::Gdb::CommandPackets
|
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
|
* packets, the server is expected to send register values for all registers (for "g" packets) or for a single
|
||||||
* register (for "p" packets).
|
* register (for "p" packets).
|
||||||
*/
|
*/
|
||||||
class ReadGeneralRegisters: public CommandPacket
|
class ReadRegisters: public CommandPacket
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
@@ -26,7 +26,7 @@ namespace Bloom::DebugServers::Gdb::CommandPackets
|
|||||||
*/
|
*/
|
||||||
std::optional<int> registerNumber;
|
std::optional<int> registerNumber;
|
||||||
|
|
||||||
explicit ReadGeneralRegisters(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
explicit ReadRegisters(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
||||||
init();
|
init();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
#include "WriteGeneralRegister.hpp"
|
#include "WriteRegister.hpp"
|
||||||
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
||||||
#include "src/Exceptions/Exception.hpp"
|
#include "src/Exceptions/Exception.hpp"
|
||||||
|
|
||||||
using namespace Bloom::DebugServers::Gdb::CommandPackets;
|
using namespace Bloom::DebugServers::Gdb::CommandPackets;
|
||||||
using namespace Bloom::Exceptions;
|
using namespace Bloom::Exceptions;
|
||||||
|
|
||||||
void WriteGeneralRegister::init() {
|
void WriteRegister::init() {
|
||||||
// The P packet updates a single register
|
// The P packet updates a single register
|
||||||
auto packet = std::string(this->data.begin(), this->data.end());
|
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());
|
std::reverse(this->registerValue.begin(), this->registerValue.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteGeneralRegister::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) {
|
void WriteRegister::dispatchToHandler(Gdb::GdbRspDebugServer& gdbRspDebugServer) {
|
||||||
gdbRspDebugServer.handleGdbPacket(*this);
|
gdbRspDebugServer.handleGdbPacket(*this);
|
||||||
}
|
}
|
||||||
@@ -8,10 +8,10 @@
|
|||||||
namespace Bloom::DebugServers::Gdb::CommandPackets
|
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.
|
* server is expected to update a register value to the target.
|
||||||
*/
|
*/
|
||||||
class WriteGeneralRegister: public CommandPacket
|
class WriteRegister: public CommandPacket
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
@@ -20,7 +20,7 @@ namespace Bloom::DebugServers::Gdb::CommandPackets
|
|||||||
int registerNumber = 0;
|
int registerNumber = 0;
|
||||||
std::vector<unsigned char> registerValue;
|
std::vector<unsigned char> registerValue;
|
||||||
|
|
||||||
explicit WriteGeneralRegister(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
explicit WriteRegister(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
||||||
init();
|
init();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,19 +54,20 @@ void GdbRspDebugServer::init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (::setsockopt(
|
if (::setsockopt(
|
||||||
socketFileDescriptor,
|
socketFileDescriptor,
|
||||||
SOL_SOCKET,
|
SOL_SOCKET,
|
||||||
SO_REUSEADDR,
|
SO_REUSEADDR,
|
||||||
&this->enableReuseAddressSocketOption,
|
&(this->enableReuseAddressSocketOption),
|
||||||
sizeof(this->enableReuseAddressSocketOption)) < 0
|
sizeof(this->enableReuseAddressSocketOption)
|
||||||
|
) < 0
|
||||||
) {
|
) {
|
||||||
Logger::error("Failed to set socket SO_REUSEADDR option.");
|
Logger::error("Failed to set socket SO_REUSEADDR option.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (::bind(
|
if (::bind(
|
||||||
socketFileDescriptor,
|
socketFileDescriptor,
|
||||||
reinterpret_cast<const sockaddr*>(&(this->socketAddress)),
|
reinterpret_cast<const sockaddr*>(&(this->socketAddress)),
|
||||||
sizeof(this->socketAddress)
|
sizeof(this->socketAddress)
|
||||||
) < 0
|
) < 0
|
||||||
) {
|
) {
|
||||||
throw Exception("Failed to bind address. The selected port number ("
|
throw Exception("Failed to bind address. The selected port number ("
|
||||||
@@ -258,11 +259,12 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::SupportedFeaturesQuery&
|
|||||||
this->clientConnection->writePacket(response);
|
this->clientConnection->writePacket(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadGeneralRegisters& packet) {
|
void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadRegisters& packet) {
|
||||||
Logger::debug("Handling ReadGeneralRegisters packet");
|
Logger::debug("Handling ReadRegisters packet");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto descriptors = TargetRegisterDescriptors();
|
auto descriptors = TargetRegisterDescriptors();
|
||||||
|
auto registerNumberToDescriptorMapping = this->getRegisterNumberToDescriptorMapping();
|
||||||
|
|
||||||
if (packet.registerNumber.has_value()) {
|
if (packet.registerNumber.has_value()) {
|
||||||
Logger::debug("Reading register number: " + std::to_string(packet.registerNumber.value()));
|
Logger::debug("Reading register number: " + std::to_string(packet.registerNumber.value()));
|
||||||
@@ -270,14 +272,12 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadGeneralRegisters& pa
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Read all descriptors
|
// Read all descriptors
|
||||||
auto descriptorMapping = this->getRegisterNumberToDescriptorMapping();
|
for (auto& descriptor : registerNumberToDescriptorMapping.getMap()) {
|
||||||
for (auto& descriptor : descriptorMapping.getMap()) {
|
|
||||||
descriptors.push_back(descriptor.second);
|
descriptors.push_back(descriptor.second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto registerSet = this->targetControllerConsole.readGeneralRegisters(descriptors);
|
auto registerSet = this->targetControllerConsole.readRegisters(descriptors);
|
||||||
auto registerNumberToDescriptorMapping = this->getRegisterNumberToDescriptorMapping();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove any registers that are not mapped to GDB register numbers (as we won't know where to place
|
* 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) {
|
void GdbRspDebugServer::handleGdbPacket(CommandPackets::WriteRegister& packet) {
|
||||||
Logger::debug("Handling WriteGeneralRegisters packet");
|
Logger::debug("Handling WriteRegister packet");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto registerDescriptor = this->getRegisterDescriptorFromNumber(packet.registerNumber);
|
auto registerDescriptor = this->getRegisterDescriptorFromNumber(packet.registerNumber);
|
||||||
this->targetControllerConsole.writeGeneralRegisters({
|
this->targetControllerConsole.writeRegisters({
|
||||||
TargetRegister(registerDescriptor, packet.registerValue)
|
TargetRegister(registerDescriptor, packet.registerValue)
|
||||||
});
|
});
|
||||||
this->clientConnection->writePacket(ResponsePacket({'O', 'K'}));
|
this->clientConnection->writePacket(ResponsePacket({'O', 'K'}));
|
||||||
|
|
||||||
} catch (const Exception& exception) {
|
} catch (const Exception& exception) {
|
||||||
|
|||||||
@@ -140,10 +140,10 @@ namespace Bloom::DebugServers::Gdb
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
virtual BiMap<
|
virtual const BiMap<
|
||||||
GdbRegisterNumber,
|
GdbRegisterNumber,
|
||||||
Targets::TargetRegisterDescriptor
|
Targets::TargetRegisterDescriptor
|
||||||
> getRegisterNumberToDescriptorMapping() = 0;
|
>& getRegisterNumberToDescriptorMapping() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains the appropriate register descriptor from a register number.
|
* Obtains the appropriate register descriptor from a register number.
|
||||||
@@ -197,14 +197,14 @@ namespace Bloom::DebugServers::Gdb
|
|||||||
*
|
*
|
||||||
* @param packet
|
* @param packet
|
||||||
*/
|
*/
|
||||||
virtual void handleGdbPacket(CommandPackets::ReadGeneralRegisters& packet);
|
virtual void handleGdbPacket(CommandPackets::ReadRegisters& packet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the write general register ("P") command packet.
|
* Handles the write general register ("P") command packet.
|
||||||
*
|
*
|
||||||
* @param packet
|
* @param packet
|
||||||
*/
|
*/
|
||||||
virtual void handleGdbPacket(CommandPackets::WriteGeneralRegister& packet);
|
virtual void handleGdbPacket(CommandPackets::WriteRegister& packet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the continue execution ("c") command packet.
|
* Handles the continue execution ("c") command packet.
|
||||||
|
|||||||
@@ -10,20 +10,20 @@ using namespace Bloom::Events;
|
|||||||
using namespace Bloom::Exceptions;
|
using namespace Bloom::Exceptions;
|
||||||
|
|
||||||
TargetControllerState TargetControllerConsole::getTargetControllerState() {
|
TargetControllerState TargetControllerConsole::getTargetControllerState() {
|
||||||
auto getStateEvent = std::make_shared<Events::ReportTargetControllerState>();
|
auto getStateEvent = std::make_shared<ReportTargetControllerState>();
|
||||||
this->eventManager.triggerEvent(getStateEvent);
|
this->eventManager.triggerEvent(getStateEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::TargetControllerStateReported,
|
TargetControllerStateReported,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, getStateEvent->id);
|
>(this->defaultTimeout, getStateEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::TargetControllerStateReported>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<TargetControllerStateReported>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto stateReportedEvent = std::get<SharedEventPointer<Events::TargetControllerStateReported>>(responseEvent.value());
|
auto stateReportedEvent = std::get<SharedEventPointer<TargetControllerStateReported>>(responseEvent.value());
|
||||||
return stateReportedEvent->state;
|
return stateReportedEvent->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,41 +37,41 @@ bool TargetControllerConsole::isTargetControllerInService() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Targets::TargetDescriptor TargetControllerConsole::getTargetDescriptor() {
|
Targets::TargetDescriptor TargetControllerConsole::getTargetDescriptor() {
|
||||||
auto extractEvent = std::make_shared<Events::ExtractTargetDescriptor>();
|
auto extractEvent = std::make_shared<ExtractTargetDescriptor>();
|
||||||
this->eventManager.triggerEvent(extractEvent);
|
this->eventManager.triggerEvent(extractEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::TargetDescriptorExtracted,
|
TargetDescriptorExtracted,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, extractEvent->id);
|
>(this->defaultTimeout, extractEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::TargetDescriptorExtracted>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<TargetDescriptorExtracted>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto descriptorExtracted = std::get<SharedEventPointer<Events::TargetDescriptorExtracted>>(responseEvent.value());
|
auto descriptorExtracted = std::get<SharedEventPointer<TargetDescriptorExtracted>>(responseEvent.value());
|
||||||
return descriptorExtracted->targetDescriptor;
|
return descriptorExtracted->targetDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::stopTargetExecution() {
|
void TargetControllerConsole::stopTargetExecution() {
|
||||||
auto stopTargetEvent = std::make_shared<Events::StopTargetExecution>();
|
auto stopTargetEvent = std::make_shared<StopTargetExecution>();
|
||||||
this->eventManager.triggerEvent(stopTargetEvent);
|
this->eventManager.triggerEvent(stopTargetEvent);
|
||||||
|
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::TargetExecutionStopped,
|
TargetExecutionStopped,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, stopTargetEvent->id);
|
>(this->defaultTimeout, stopTargetEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::TargetExecutionStopped>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<TargetExecutionStopped>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::continueTargetExecution(std::optional<std::uint32_t> fromAddress) {
|
void TargetControllerConsole::continueTargetExecution(std::optional<std::uint32_t> fromAddress) {
|
||||||
auto resumeExecutionEvent = std::make_shared<Events::ResumeTargetExecution>();
|
auto resumeExecutionEvent = std::make_shared<ResumeTargetExecution>();
|
||||||
|
|
||||||
if (fromAddress.has_value()) {
|
if (fromAddress.has_value()) {
|
||||||
resumeExecutionEvent->fromProgramCounter = fromAddress.value();
|
resumeExecutionEvent->fromProgramCounter = fromAddress.value();
|
||||||
@@ -79,19 +79,19 @@ void TargetControllerConsole::continueTargetExecution(std::optional<std::uint32_
|
|||||||
|
|
||||||
this->eventManager.triggerEvent(resumeExecutionEvent);
|
this->eventManager.triggerEvent(resumeExecutionEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::TargetExecutionResumed,
|
TargetExecutionResumed,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, resumeExecutionEvent->id);
|
>(this->defaultTimeout, resumeExecutionEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::TargetExecutionResumed>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<TargetExecutionResumed>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::stepTargetExecution(std::optional<std::uint32_t> fromAddress) {
|
void TargetControllerConsole::stepTargetExecution(std::optional<std::uint32_t> fromAddress) {
|
||||||
auto stepExecutionEvent = std::make_shared<Events::StepTargetExecution>();
|
auto stepExecutionEvent = std::make_shared<StepTargetExecution>();
|
||||||
|
|
||||||
if (fromAddress.has_value()) {
|
if (fromAddress.has_value()) {
|
||||||
stepExecutionEvent->fromProgramCounter = fromAddress.value();
|
stepExecutionEvent->fromProgramCounter = fromAddress.value();
|
||||||
@@ -99,51 +99,51 @@ void TargetControllerConsole::stepTargetExecution(std::optional<std::uint32_t> f
|
|||||||
|
|
||||||
this->eventManager.triggerEvent(stepExecutionEvent);
|
this->eventManager.triggerEvent(stepExecutionEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::TargetExecutionResumed,
|
TargetExecutionResumed,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, stepExecutionEvent->id);
|
>(this->defaultTimeout, stepExecutionEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::TargetExecutionResumed>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<TargetExecutionResumed>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetRegisters TargetControllerConsole::readGeneralRegisters(TargetRegisterDescriptors descriptors) {
|
TargetRegisters TargetControllerConsole::readRegisters(const TargetRegisterDescriptors& descriptors) {
|
||||||
auto readRegistersEvent = std::make_shared<Events::RetrieveRegistersFromTarget>();
|
auto readRegistersEvent = std::make_shared<RetrieveRegistersFromTarget>();
|
||||||
readRegistersEvent->descriptors = descriptors;
|
readRegistersEvent->descriptors = descriptors;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(readRegistersEvent);
|
this->eventManager.triggerEvent(readRegistersEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::RegistersRetrievedFromTarget,
|
RegistersRetrievedFromTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, readRegistersEvent->id);
|
>(this->defaultTimeout, readRegistersEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::RegistersRetrievedFromTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<RegistersRetrievedFromTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto retrievedRegistersEvent = std::get<SharedEventPointer<Events::RegistersRetrievedFromTarget>>(
|
auto retrievedRegistersEvent = std::get<SharedEventPointer<RegistersRetrievedFromTarget>>(
|
||||||
responseEvent.value()
|
responseEvent.value()
|
||||||
);
|
);
|
||||||
return retrievedRegistersEvent->registers;
|
return retrievedRegistersEvent->registers;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::writeGeneralRegisters(TargetRegisters registers) {
|
void TargetControllerConsole::writeRegisters(const TargetRegisters& registers) {
|
||||||
auto event = std::make_shared<Events::WriteRegistersToTarget>();
|
auto event = std::make_shared<WriteRegistersToTarget>();
|
||||||
event->registers = registers;
|
event->registers = std::move(registers);
|
||||||
|
|
||||||
this->eventManager.triggerEvent(event);
|
this->eventManager.triggerEvent(event);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::RegistersWrittenToTarget,
|
RegistersWrittenToTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, event->id);
|
>(this->defaultTimeout, event->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::RegistersWrittenToTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<RegistersWrittenToTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
@@ -154,24 +154,24 @@ TargetMemoryBuffer TargetControllerConsole::readMemory(
|
|||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
std::uint32_t bytes
|
std::uint32_t bytes
|
||||||
) {
|
) {
|
||||||
auto readMemoryEvent = std::make_shared<Events::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;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(readMemoryEvent);
|
this->eventManager.triggerEvent(readMemoryEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::MemoryRetrievedFromTarget,
|
MemoryRetrievedFromTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, readMemoryEvent->id);
|
>(this->defaultTimeout, readMemoryEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::MemoryRetrievedFromTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<MemoryRetrievedFromTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto retrievedRegistersEvent = std::get<SharedEventPointer<Events::MemoryRetrievedFromTarget>>(
|
auto retrievedRegistersEvent = std::get<SharedEventPointer<MemoryRetrievedFromTarget>>(
|
||||||
responseEvent.value()
|
responseEvent.value()
|
||||||
);
|
);
|
||||||
return retrievedRegistersEvent->data;
|
return retrievedRegistersEvent->data;
|
||||||
@@ -182,67 +182,67 @@ void TargetControllerConsole::writeMemory(
|
|||||||
std::uint32_t startAddress,
|
std::uint32_t startAddress,
|
||||||
const TargetMemoryBuffer& buffer
|
const TargetMemoryBuffer& buffer
|
||||||
) {
|
) {
|
||||||
auto writeMemoryEvent = std::make_shared<Events::WriteMemoryToTarget>();
|
auto writeMemoryEvent = std::make_shared<WriteMemoryToTarget>();
|
||||||
writeMemoryEvent->memoryType = memoryType;
|
writeMemoryEvent->memoryType = memoryType;
|
||||||
writeMemoryEvent->startAddress = startAddress;
|
writeMemoryEvent->startAddress = startAddress;
|
||||||
writeMemoryEvent->buffer = buffer;
|
writeMemoryEvent->buffer = buffer;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(writeMemoryEvent);
|
this->eventManager.triggerEvent(writeMemoryEvent);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::MemoryWrittenToTarget,
|
MemoryWrittenToTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, writeMemoryEvent->id);
|
>(this->defaultTimeout, writeMemoryEvent->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::MemoryWrittenToTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<MemoryWrittenToTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::setBreakpoint(TargetBreakpoint breakpoint) {
|
void TargetControllerConsole::setBreakpoint(TargetBreakpoint breakpoint) {
|
||||||
auto event = std::make_shared<Events::SetBreakpointOnTarget>();
|
auto event = std::make_shared<SetBreakpointOnTarget>();
|
||||||
event->breakpoint = breakpoint;
|
event->breakpoint = breakpoint;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(event);
|
this->eventManager.triggerEvent(event);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::BreakpointSetOnTarget,
|
BreakpointSetOnTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, event->id);
|
>(this->defaultTimeout, event->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::BreakpointSetOnTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<BreakpointSetOnTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::removeBreakpoint(TargetBreakpoint breakpoint) {
|
void TargetControllerConsole::removeBreakpoint(TargetBreakpoint breakpoint) {
|
||||||
auto event = std::make_shared<Events::RemoveBreakpointOnTarget>();
|
auto event = std::make_shared<RemoveBreakpointOnTarget>();
|
||||||
event->breakpoint = breakpoint;
|
event->breakpoint = breakpoint;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(event);
|
this->eventManager.triggerEvent(event);
|
||||||
auto responseEvent = this->eventListener.waitForEvent<
|
auto responseEvent = this->eventListener.waitForEvent<
|
||||||
Events::BreakpointRemovedOnTarget,
|
BreakpointRemovedOnTarget,
|
||||||
Events::TargetControllerErrorOccurred
|
TargetControllerErrorOccurred
|
||||||
>(this->defaultTimeout, event->id);
|
>(this->defaultTimeout, event->id);
|
||||||
|
|
||||||
if (!responseEvent.has_value()
|
if (!responseEvent.has_value()
|
||||||
|| !std::holds_alternative<SharedEventPointer<Events::BreakpointRemovedOnTarget>>(responseEvent.value())
|
|| !std::holds_alternative<SharedEventPointer<BreakpointRemovedOnTarget>>(responseEvent.value())
|
||||||
) {
|
) {
|
||||||
throw Exception("Unexpected response from TargetController");
|
throw Exception("Unexpected response from TargetController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::requestPinStates(int variantId) {
|
void TargetControllerConsole::requestPinStates(int variantId) {
|
||||||
auto requestEvent = std::make_shared<Events::RetrieveTargetPinStates>();
|
auto requestEvent = std::make_shared<RetrieveTargetPinStates>();
|
||||||
requestEvent->variantId = variantId;
|
requestEvent->variantId = variantId;
|
||||||
|
|
||||||
this->eventManager.triggerEvent(requestEvent);
|
this->eventManager.triggerEvent(requestEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetControllerConsole::setPinState(int variantId, TargetPinDescriptor pinDescriptor, TargetPinState pinState) {
|
void TargetControllerConsole::setPinState(int variantId, TargetPinDescriptor pinDescriptor, TargetPinState pinState) {
|
||||||
auto updateEvent = std::make_shared<Events::SetTargetPinState>();
|
auto updateEvent = std::make_shared<SetTargetPinState>();
|
||||||
updateEvent->variantId = variantId;
|
updateEvent->variantId = variantId;
|
||||||
updateEvent->pinDescriptor = std::move(pinDescriptor);
|
updateEvent->pinDescriptor = std::move(pinDescriptor);
|
||||||
updateEvent->pinState = pinState;
|
updateEvent->pinState = pinState;
|
||||||
|
|||||||
@@ -75,14 +75,14 @@ namespace Bloom
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Targets::TargetRegisters readGeneralRegisters(Targets::TargetRegisterDescriptors descriptors);
|
Targets::TargetRegisters readRegisters(const Targets::TargetRegisterDescriptors& descriptors);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests the TargetController to write register values to the target.
|
* Requests the TargetController to write register values to the target.
|
||||||
*
|
*
|
||||||
* @param registers
|
* @param registers
|
||||||
*/
|
*/
|
||||||
void writeGeneralRegisters(Targets::TargetRegisters registers);
|
void writeRegisters(const Targets::TargetRegisters& registers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests the TargetController to read memory from the target.
|
* Requests the TargetController to read memory from the target.
|
||||||
|
|||||||
Reference in New Issue
Block a user