From ca0bcdeda4bbe51b3f628053cc2471749aaad91e Mon Sep 17 00:00:00 2001 From: Nav Date: Tue, 28 Dec 2021 00:00:45 +0000 Subject: [PATCH] GDB register descriptor --- .../GdbRsp/AvrGdbRsp/AvrGdbRsp.hpp | 2 +- .../GdbRsp/CommandPackets/ReadRegisters.hpp | 4 +- src/DebugServers/GdbRsp/GdbRspDebugServer.hpp | 2 +- src/DebugServers/GdbRsp/Register.hpp | 6 -- .../GdbRsp/RegisterDescriptor.hpp | 67 +++++++++++++++++++ 5 files changed, 72 insertions(+), 9 deletions(-) delete mode 100644 src/DebugServers/GdbRsp/Register.hpp create mode 100644 src/DebugServers/GdbRsp/RegisterDescriptor.hpp diff --git a/src/DebugServers/GdbRsp/AvrGdbRsp/AvrGdbRsp.hpp b/src/DebugServers/GdbRsp/AvrGdbRsp/AvrGdbRsp.hpp index 63342b52..41477a5c 100644 --- a/src/DebugServers/GdbRsp/AvrGdbRsp/AvrGdbRsp.hpp +++ b/src/DebugServers/GdbRsp/AvrGdbRsp/AvrGdbRsp.hpp @@ -3,7 +3,7 @@ #include #include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp" -#include "src/DebugServers/GdbRsp/Register.hpp" +#include "src/DebugServers/GdbRsp/RegisterDescriptor.hpp" #include "src/Helpers/BiMap.hpp" namespace Bloom::DebugServers::Gdb diff --git a/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp index 20055bbe..539d8215 100644 --- a/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp +++ b/src/DebugServers/GdbRsp/CommandPackets/ReadRegisters.hpp @@ -4,6 +4,8 @@ #include "CommandPacket.hpp" +#include "src/DebugServers/GdbRsp/RegisterDescriptor.hpp" + namespace Bloom::DebugServers::Gdb::CommandPackets { /** @@ -21,7 +23,7 @@ namespace Bloom::DebugServers::Gdb::CommandPackets * If the register number is not supplied (as is the case with "g" packets), the server is expected to respond * with values for all registers. */ - std::optional registerNumber; + std::optional registerNumber; explicit ReadRegisters(const std::vector& rawPacket): CommandPacket(rawPacket) { init(); diff --git a/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp b/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp index 95fe2a47..b961f143 100644 --- a/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp +++ b/src/DebugServers/GdbRsp/GdbRspDebugServer.hpp @@ -9,7 +9,7 @@ #include "../DebugServer.hpp" #include "Connection.hpp" #include "Signal.hpp" -#include "Register.hpp" +#include "RegisterDescriptor.hpp" #include "Feature.hpp" #include "src/Helpers/EventNotifier.hpp" #include "src/Helpers/BiMap.hpp" diff --git a/src/DebugServers/GdbRsp/Register.hpp b/src/DebugServers/GdbRsp/Register.hpp deleted file mode 100644 index 98220c1e..00000000 --- a/src/DebugServers/GdbRsp/Register.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -namespace Bloom::DebugServers::Gdb -{ - using GdbRegisterNumber = int; -} diff --git a/src/DebugServers/GdbRsp/RegisterDescriptor.hpp b/src/DebugServers/GdbRsp/RegisterDescriptor.hpp new file mode 100644 index 00000000..e6675efd --- /dev/null +++ b/src/DebugServers/GdbRsp/RegisterDescriptor.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include + +namespace Bloom::DebugServers::Gdb +{ + using GdbRegisterNumberType = int; + + /* + * GDB defines a set of registers for each target architecture. + * + * Each register in the set is assigned a register number, which is used to identify the register. + */ + struct RegisterDescriptor + { + GdbRegisterNumberType number; + std::uint16_t size; + std::string name; + + RegisterDescriptor(GdbRegisterNumberType number, std::uint16_t size, const std::string& name) + : number(number), size(size), name(name) {}; + + bool operator == (const RegisterDescriptor& other) const { + return this->number == other.number; + } + + bool operator != (const RegisterDescriptor& other) const { + return !(*this == other); + } + + bool operator < (const RegisterDescriptor& rhs) const { + return this->number < rhs.number; + } + + bool operator > (const RegisterDescriptor& rhs) const { + return rhs < *this; + } + + bool operator <= (const RegisterDescriptor& rhs) const { + return !(rhs < *this); + } + + bool operator >= (const RegisterDescriptor& rhs) const { + return !(*this < rhs); + } + }; +} + +namespace std +{ + /** + * Hashing function for RegisterDescriptor type. + * + * This is required in order to use RegisterDescriptor as a key in an std::unordered_map (see the BiMap + * class). + */ + template<> + class hash + { + public: + std::size_t operator () (const Bloom::DebugServers::Gdb::RegisterDescriptor& descriptor) const { + // We use the GDB register number as the hash, as it is unique to the register. + return static_cast(descriptor.number); + } + }; +}