138#include "arch/riscv/gdb-xml/gdb_xml_riscv_32bit_cpu.hh"
139#include "arch/riscv/gdb-xml/gdb_xml_riscv_32bit_csr.hh"
140#include "arch/riscv/gdb-xml/gdb_xml_riscv_32bit_fpu.hh"
141#include "arch/riscv/gdb-xml/gdb_xml_riscv_32bit_target.hh"
142#include "arch/riscv/gdb-xml/gdb_xml_riscv_64bit_cpu.hh"
143#include "arch/riscv/gdb-xml/gdb_xml_riscv_64bit_csr.hh"
144#include "arch/riscv/gdb-xml/gdb_xml_riscv_64bit_fpu.hh"
145#include "arch/riscv/gdb-xml/gdb_xml_riscv_64bit_target.hh"
153#include "debug/GDBAcc.hh"
162template <
typename x
int>
175template <
typename x
int>
189 : BaseRemoteGDB(_system, _listen_config),
190 regCache32(this), regCache64(this)
197 auto isa =
dynamic_cast<ISA*
>(
tc->getIsaPtr());
198 panic_if(!isa,
"Cannot derive rv_type from non-riscv isa");
199 return isa->rvType();
205 auto isa =
dynamic_cast<ISA*
>(
tc->getIsaPtr());
206 panic_if(!isa,
"Cannot derive rv_type from non-riscv isa");
207 return isa->getPrivilegeModeSet();
215 MMU *mmu =
static_cast<MMU *
>(context()->getMMUPtr());
225 satp.mode != AddrXlateMode::BARE) {
235 return context()->getProcessPtr()->pTable->lookup(va) !=
nullptr;
255 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n",
size());
258 if (rv_gdb !=
nullptr) {
267 r.pc =
context->pcState().instAddr();
272 r.fflags =
context->readMiscRegNoEffect(
274 r.frm =
context->readMiscRegNoEffect(
280 r.cycle =
context->readMiscRegNoEffect(
282 r.cycleh =
context->readMiscRegNoEffect(
284 r.time =
context->readMiscRegNoEffect(
286 r.timeh =
context->readMiscRegNoEffect(
294 r.stvec =
context->readMiscRegNoEffect(
296 r.scounteren =
context->readMiscRegNoEffect(
298 r.sscratch =
context->readMiscRegNoEffect(
302 r.scause =
context->readMiscRegNoEffect(
304 r.stval =
context->readMiscRegNoEffect(
308 r.satp =
context->readMiscRegNoEffect(
310 r.senvcfg =
context->readMiscRegNoEffect(
314 r.mvendorid =
context->readMiscRegNoEffect(
316 r.marchid =
context->readMiscRegNoEffect(
318 r.mimpid =
context->readMiscRegNoEffect(
323 r.misa =
context->readMiscRegNoEffect(
325 r.medeleg =
context->readMiscRegNoEffect(
327 r.mideleg =
context->readMiscRegNoEffect(
331 r.mtvec =
context->readMiscRegNoEffect(
333 r.mcounteren =
context->readMiscRegNoEffect(
337 r.mscratch =
context->readMiscRegNoEffect(
341 r.mcause =
context->readMiscRegNoEffect(
343 r.mtval =
context->readMiscRegNoEffect(
354 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
357 if (rv_gdb !=
nullptr) {
423 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n",
size());
426 if (rv_gdb !=
nullptr) {
435 r.pc =
context->pcState().instAddr();
440 r.fflags =
context->readMiscRegNoEffect(
442 r.frm =
context->readMiscRegNoEffect(
448 r.cycle =
context->readMiscRegNoEffect(
450 r.time =
context->readMiscRegNoEffect(
458 r.stvec =
context->readMiscRegNoEffect(
460 r.scounteren =
context->readMiscRegNoEffect(
462 r.sscratch =
context->readMiscRegNoEffect(
466 r.scause =
context->readMiscRegNoEffect(
468 r.stval =
context->readMiscRegNoEffect(
472 r.satp =
context->readMiscRegNoEffect(
474 r.senvcfg =
context->readMiscRegNoEffect(
478 r.mvendorid =
context->readMiscRegNoEffect(
480 r.marchid =
context->readMiscRegNoEffect(
482 r.mimpid =
context->readMiscRegNoEffect(
487 r.misa =
context->readMiscRegNoEffect(
489 r.medeleg =
context->readMiscRegNoEffect(
491 r.mideleg =
context->readMiscRegNoEffect(
495 r.mtvec =
context->readMiscRegNoEffect(
497 r.mcounteren =
context->readMiscRegNoEffect(
499 r.mscratch =
context->readMiscRegNoEffect(
503 r.mcause =
context->readMiscRegNoEffect(
505 r.mtval =
context->readMiscRegNoEffect(
516 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
519 if (rv_gdb !=
nullptr) {
590#define GDB_XML(x, s) \
592 x, std::string(reinterpret_cast<const char *>(Blobs::s), \
595 static const std::map<std::string, std::string> annexMaps[enums::Num_RiscvType] = {
596 [
RV32] = {
GDB_XML(
"target.xml", gdb_xml_riscv_32bit_target),
597 GDB_XML(
"riscv-32bit-cpu.xml", gdb_xml_riscv_32bit_cpu),
598 GDB_XML(
"riscv-32bit-fpu.xml", gdb_xml_riscv_32bit_fpu),
599 GDB_XML(
"riscv-32bit-csr.xml", gdb_xml_riscv_32bit_csr)},
600 [
RV64] = {
GDB_XML(
"target.xml", gdb_xml_riscv_64bit_target),
601 GDB_XML(
"riscv-64bit-cpu.xml", gdb_xml_riscv_64bit_cpu),
602 GDB_XML(
"riscv-64bit-fpu.xml", gdb_xml_riscv_64bit_fpu),
603 GDB_XML(
"riscv-64bit-csr.xml", gdb_xml_riscv_64bit_csr)},
605 auto& annexMap = annexMaps[getRvType(context())];
606 auto it = annexMap.find(annex);
607 if (it == annexMap.end())
616 BaseGdbRegCache* regs[enums::Num_RiscvType] = {
617 [
RV32] = ®Cache32,
618 [
RV64] = ®Cache64,
620 return regs[getRvType(context())];
RemoteGDB(System *_system, ListenSocketConfig _listen_config)
virtual void removeHardBreak(Addr addr, size_t kind)
ThreadContext * context()
virtual void insertHardBreak(Addr addr, size_t kind)
MemAccessInfo getMemAccessInfo(ThreadContext *tc, BaseMMU::Mode mode)
void getRegs(ThreadContext *)
Fill the raw buffer from the registers in the ThreadContext.
void setRegs(ThreadContext *) const
Set the ThreadContext's registers from the values in the raw buffer.
size_t size() const
Return the size of the raw buffer, in bytes (i.e., half of the number of digits in the g/G packet).
struct gem5::RiscvISA::RemoteGDB::Riscv32GdbRegCache::GEM5_PACKED r
void getRegs(ThreadContext *)
Fill the raw buffer from the registers in the ThreadContext.
struct gem5::RiscvISA::RemoteGDB::Riscv64GdbRegCache::GEM5_PACKED r
size_t size() const
Return the size of the raw buffer, in bytes (i.e., half of the number of digits in the g/G packet).
void setRegs(ThreadContext *) const
Set the ThreadContext's registers from the values in the raw buffer.
void removeHardBreak(Addr addr, size_t kind) override
virtual PrivilegeModeSet getPrivilegeModeSet(ThreadContext *tc)
bool getXferFeaturesRead(const std::string &annex, std::string &output) override
Reply to qXfer:features:read:xxx.xml qeuries.
bool acc(Addr addr, size_t len) override
void insertHardBreak(Addr addr, size_t kind) override
virtual RiscvType getRvType(ThreadContext *tc)
RemoteGDB(System *_system, ListenSocketConfig _listen_config)
Fault startFunctional(ThreadContext *_tc, Addr &addr, unsigned &logBytes, BaseMMU::Mode mode)
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual RegVal readMiscReg(RegIndex misc_reg)=0
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
constexpr uint64_t sext(uint64_t val)
Sign-extend an N-bit value to 64 bits.
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
constexpr enums::RiscvType RV32
constexpr RegClass floatRegClass(FloatRegClass, FloatRegClassName, float_reg::NumRegs, debug::FloatRegs)
enums::PrivilegeModeSet PrivilegeModeSet
enums::RiscvType RiscvType
const std::unordered_map< int, CSRMetadata > CSRData
const std::unordered_map< int, RegVal > CSRMasks[enums::Num_RiscvType][enums::Num_PrivilegeModeSet]
constexpr RegClass intRegClass(IntRegClass, IntRegClassName, int_reg::NumRegs, debug::IntRegs)
constexpr enums::RiscvType RV64
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
static void setRegNoEffectWithMask(ThreadContext *context, RiscvType type, PrivilegeModeSet pms, CSRIndex idx, xint val)
static void setRegWithMask(ThreadContext *context, RiscvType type, PrivilegeModeSet pms, CSRIndex idx, xint val)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
static void output(const char *filename)
constexpr decltype(nullptr) NoFault
Declarations of a non-full system Page Table.