GDB register descriptor
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
#include "src/DebugServers/GdbRsp/GdbRspDebugServer.hpp"
|
||||||
#include "src/DebugServers/GdbRsp/Register.hpp"
|
#include "src/DebugServers/GdbRsp/RegisterDescriptor.hpp"
|
||||||
#include "src/Helpers/BiMap.hpp"
|
#include "src/Helpers/BiMap.hpp"
|
||||||
|
|
||||||
namespace Bloom::DebugServers::Gdb
|
namespace Bloom::DebugServers::Gdb
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include "CommandPacket.hpp"
|
#include "CommandPacket.hpp"
|
||||||
|
|
||||||
|
#include "src/DebugServers/GdbRsp/RegisterDescriptor.hpp"
|
||||||
|
|
||||||
namespace Bloom::DebugServers::Gdb::CommandPackets
|
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
|
* 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.
|
* with values for all registers.
|
||||||
*/
|
*/
|
||||||
std::optional<int> registerNumber;
|
std::optional<GdbRegisterNumberType> registerNumber;
|
||||||
|
|
||||||
explicit ReadRegisters(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
explicit ReadRegisters(const std::vector<unsigned char>& rawPacket): CommandPacket(rawPacket) {
|
||||||
init();
|
init();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "../DebugServer.hpp"
|
#include "../DebugServer.hpp"
|
||||||
#include "Connection.hpp"
|
#include "Connection.hpp"
|
||||||
#include "Signal.hpp"
|
#include "Signal.hpp"
|
||||||
#include "Register.hpp"
|
#include "RegisterDescriptor.hpp"
|
||||||
#include "Feature.hpp"
|
#include "Feature.hpp"
|
||||||
#include "src/Helpers/EventNotifier.hpp"
|
#include "src/Helpers/EventNotifier.hpp"
|
||||||
#include "src/Helpers/BiMap.hpp"
|
#include "src/Helpers/BiMap.hpp"
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace Bloom::DebugServers::Gdb
|
|
||||||
{
|
|
||||||
using GdbRegisterNumber = int;
|
|
||||||
}
|
|
||||||
67
src/DebugServers/GdbRsp/RegisterDescriptor.hpp
Normal file
67
src/DebugServers/GdbRsp/RegisterDescriptor.hpp
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
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<Bloom::DebugServers::Gdb::RegisterDescriptor>
|
||||||
|
{
|
||||||
|
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<size_t>(descriptor.number);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user