Implemented memory access via program buffer, in RISC-V debug translator

- Support for multiple memory access strategies (abstract commands and program buffer)
- Probing of memory access strategies
- Included `preferredMemoryAccessStrategy` debug translator config param
- Other bits of tidying in the RISC-V debug translator
This commit is contained in:
Nav
2024-11-23 20:14:47 +00:00
parent e207440cd9
commit d8131080ec
18 changed files with 927 additions and 100 deletions

View File

@@ -0,0 +1,26 @@
#pragma once
#include <cstdint>
#include <cassert>
#include "Opcode.hpp"
namespace Targets::RiscV::Opcodes
{
struct Addi
{
GprNumber destinationRegister;
GprNumber sourceRegister;
std::uint16_t value;
[[nodiscard]] constexpr Opcode opcode() const {
assert(this->value <= 0xFFF);
return Opcode{0x13}
| static_cast<Opcode>(this->destinationRegister) << 7
| static_cast<Opcode>(this->sourceRegister) << 15
| static_cast<Opcode>(this->value & 0xFFF) << 20
;
}
};
}

View File

@@ -0,0 +1,26 @@
#pragma once
#include <cstdint>
#include <cassert>
#include "Opcode.hpp"
namespace Targets::RiscV::Opcodes
{
struct Lb
{
GprNumber destinationRegister;
GprNumber baseAddressRegister;
std::uint16_t addressOffset;
[[nodiscard]] constexpr Opcode opcode() const {
assert(this->addressOffset <= 0xFFF);
return Opcode{0x03}
| static_cast<Opcode>(this->destinationRegister) << 7
| static_cast<Opcode>(this->baseAddressRegister) << 15
| static_cast<Opcode>(this->addressOffset & 0xFFF) << 20
;
}
};
}

View File

@@ -0,0 +1,26 @@
#pragma once
#include <cstdint>
#include <cassert>
#include "Opcode.hpp"
namespace Targets::RiscV::Opcodes
{
struct Lw
{
GprNumber destinationRegister;
GprNumber baseAddressRegister;
std::uint16_t addressOffset;
[[nodiscard]] constexpr Opcode opcode() const {
assert(this->addressOffset <= 0xFFF);
return Opcode{0x2003}
| static_cast<Opcode>(this->destinationRegister) << 7
| static_cast<Opcode>(this->baseAddressRegister) << 15
| static_cast<Opcode>(this->addressOffset & 0xFFF) << 20
;
}
};
}

View File

@@ -0,0 +1,17 @@
#pragma once
#include <cstdint>
namespace Targets::RiscV::Opcodes
{
using Opcode = std::uint32_t;
enum class GprNumber: std::uint8_t
{
X0 = 0, X2 = 2, X3 = 3, X4 = 4, X5 = 5, X6 = 6, X7 = 7, X8 = 8, X9 = 9, X10 = 10, X11 = 11, X12 = 12, X13 = 13,
X14 = 14, X15 = 15, X16 = 16, X17 = 17, X18 = 18, X19 = 19, X20 = 20, X21 = 21, X22 = 22, X23 = 23, X24 = 24,
X25 = 25, X26 = 26, X27 = 27, X28 = 28, X29 = 29, X30 = 30, X31 = 31,
};
static constexpr auto Ebreak = Opcode{0x00100073};
}

View File

@@ -0,0 +1,27 @@
#pragma once
#include <cstdint>
#include <cassert>
#include "Opcode.hpp"
namespace Targets::RiscV::Opcodes
{
struct Sb
{
GprNumber baseAddressRegister;
GprNumber valueRegister;
std::uint16_t addressOffset;
[[nodiscard]] constexpr Opcode opcode() const {
assert(this->addressOffset <= 0xFFF);
return Opcode{0x23}
| static_cast<Opcode>(this->addressOffset & 0x1F) << 7
| static_cast<Opcode>(this->baseAddressRegister) << 15
| static_cast<Opcode>(this->valueRegister) << 20
| static_cast<Opcode>((this->addressOffset >> 5) & 0x7F) << 25
;
}
};
}

View File

@@ -0,0 +1,27 @@
#pragma once
#include <cstdint>
#include <cassert>
#include "Opcode.hpp"
namespace Targets::RiscV::Opcodes
{
struct Sw
{
GprNumber baseAddressRegister;
GprNumber valueRegister;
std::uint16_t addressOffset;
[[nodiscard]] constexpr Opcode opcode() const {
assert(this->addressOffset <= 0xFFF);
return Opcode{0x2023}
| static_cast<Opcode>(this->addressOffset & 0x1F) << 7
| static_cast<Opcode>(this->baseAddressRegister) << 15
| static_cast<Opcode>(this->valueRegister) << 20
| static_cast<Opcode>((this->addressOffset >> 5) & 0x7F) << 25
;
}
};
}