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());
223 satp.mode != AddrXlateMode::BARE) {
233 return context()->getProcessPtr()->pTable->lookup(va) !=
nullptr;
253 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n",
size());
256 if (rv_gdb !=
nullptr) {
265 r.pc =
context->pcState().instAddr();
270 r.fflags =
context->readMiscRegNoEffect(
272 r.frm =
context->readMiscRegNoEffect(
278 r.cycle =
context->readMiscRegNoEffect(
280 r.cycleh =
context->readMiscRegNoEffect(
282 r.time =
context->readMiscRegNoEffect(
284 r.timeh =
context->readMiscRegNoEffect(
292 r.utvec =
context->readMiscRegNoEffect(
294 r.uscratch =
context->readMiscRegNoEffect(
296 r.uepc =
context->readMiscRegNoEffect(
298 r.ucause =
context->readMiscRegNoEffect(
300 r.utval =
context->readMiscRegNoEffect(
308 r.sedeleg =
context->readMiscRegNoEffect(
310 r.sideleg =
context->readMiscRegNoEffect(
314 r.stvec =
context->readMiscRegNoEffect(
316 r.scounteren =
context->readMiscRegNoEffect(
318 r.sscratch =
context->readMiscRegNoEffect(
322 r.scause =
context->readMiscRegNoEffect(
324 r.stval =
context->readMiscRegNoEffect(
328 r.satp =
context->readMiscRegNoEffect(
330 r.senvcfg =
context->readMiscRegNoEffect(
334 r.mvendorid =
context->readMiscRegNoEffect(
336 r.marchid =
context->readMiscRegNoEffect(
338 r.mimpid =
context->readMiscRegNoEffect(
343 r.misa =
context->readMiscRegNoEffect(
345 r.medeleg =
context->readMiscRegNoEffect(
347 r.mideleg =
context->readMiscRegNoEffect(
351 r.mtvec =
context->readMiscRegNoEffect(
353 r.mcounteren =
context->readMiscRegNoEffect(
357 r.mscratch =
context->readMiscRegNoEffect(
361 r.mcause =
context->readMiscRegNoEffect(
363 r.mtval =
context->readMiscRegNoEffect(
374 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
377 if (rv_gdb !=
nullptr) {
462 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n",
size());
465 if (rv_gdb !=
nullptr) {
474 r.pc =
context->pcState().instAddr();
479 r.fflags =
context->readMiscRegNoEffect(
481 r.frm =
context->readMiscRegNoEffect(
487 r.cycle =
context->readMiscRegNoEffect(
489 r.time =
context->readMiscRegNoEffect(
497 r.utvec =
context->readMiscRegNoEffect(
499 r.uscratch =
context->readMiscRegNoEffect(
501 r.uepc =
context->readMiscRegNoEffect(
503 r.ucause =
context->readMiscRegNoEffect(
505 r.utval =
context->readMiscRegNoEffect(
513 r.sedeleg =
context->readMiscRegNoEffect(
515 r.sideleg =
context->readMiscRegNoEffect(
519 r.stvec =
context->readMiscRegNoEffect(
521 r.scounteren =
context->readMiscRegNoEffect(
523 r.sscratch =
context->readMiscRegNoEffect(
527 r.scause =
context->readMiscRegNoEffect(
529 r.stval =
context->readMiscRegNoEffect(
533 r.satp =
context->readMiscRegNoEffect(
535 r.senvcfg =
context->readMiscRegNoEffect(
539 r.mvendorid =
context->readMiscRegNoEffect(
541 r.marchid =
context->readMiscRegNoEffect(
543 r.mimpid =
context->readMiscRegNoEffect(
548 r.misa =
context->readMiscRegNoEffect(
550 r.medeleg =
context->readMiscRegNoEffect(
552 r.mideleg =
context->readMiscRegNoEffect(
556 r.mtvec =
context->readMiscRegNoEffect(
558 r.mcounteren =
context->readMiscRegNoEffect(
560 r.mscratch =
context->readMiscRegNoEffect(
564 r.mcause =
context->readMiscRegNoEffect(
566 r.mtval =
context->readMiscRegNoEffect(
577 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
580 if (rv_gdb !=
nullptr) {
670#define GDB_XML(x, s) \
672 x, std::string(reinterpret_cast<const char *>(Blobs::s), \
675 static const std::map<std::string, std::string> annexMaps[enums::Num_RiscvType] = {
676 [
RV32] = {
GDB_XML(
"target.xml", gdb_xml_riscv_32bit_target),
677 GDB_XML(
"riscv-32bit-cpu.xml", gdb_xml_riscv_32bit_cpu),
678 GDB_XML(
"riscv-32bit-fpu.xml", gdb_xml_riscv_32bit_fpu),
679 GDB_XML(
"riscv-32bit-csr.xml", gdb_xml_riscv_32bit_csr)},
680 [
RV64] = {
GDB_XML(
"target.xml", gdb_xml_riscv_64bit_target),
681 GDB_XML(
"riscv-64bit-cpu.xml", gdb_xml_riscv_64bit_cpu),
682 GDB_XML(
"riscv-64bit-fpu.xml", gdb_xml_riscv_64bit_fpu),
683 GDB_XML(
"riscv-64bit-csr.xml", gdb_xml_riscv_64bit_csr)},
685 auto& annexMap = annexMaps[getRvType(context())];
686 auto it = annexMap.find(annex);
687 if (it == annexMap.end())
696 BaseGdbRegCache* regs[enums::Num_RiscvType] = {
697 [
RV32] = ®Cache32,
698 [
RV64] = ®Cache64,
700 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)
PrivilegeMode getMemPriv(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.