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:
26
src/Targets/RiscV/Opcodes/Addi.hpp
Normal file
26
src/Targets/RiscV/Opcodes/Addi.hpp
Normal 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
|
||||
;
|
||||
}
|
||||
};
|
||||
}
|
||||
26
src/Targets/RiscV/Opcodes/Lb.hpp
Normal file
26
src/Targets/RiscV/Opcodes/Lb.hpp
Normal 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
|
||||
;
|
||||
}
|
||||
};
|
||||
}
|
||||
26
src/Targets/RiscV/Opcodes/Lw.hpp
Normal file
26
src/Targets/RiscV/Opcodes/Lw.hpp
Normal 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
|
||||
;
|
||||
}
|
||||
};
|
||||
}
|
||||
17
src/Targets/RiscV/Opcodes/Opcode.hpp
Normal file
17
src/Targets/RiscV/Opcodes/Opcode.hpp
Normal 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};
|
||||
}
|
||||
27
src/Targets/RiscV/Opcodes/Sb.hpp
Normal file
27
src/Targets/RiscV/Opcodes/Sb.hpp
Normal 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
|
||||
;
|
||||
}
|
||||
};
|
||||
}
|
||||
27
src/Targets/RiscV/Opcodes/Sw.hpp
Normal file
27
src/Targets/RiscV/Opcodes/Sw.hpp
Normal 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
|
||||
;
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user