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"
160using namespace RiscvISA;
162template <
typename x
int>
171 newVal = (oldVal & ~mask) | (
val &
mask);
175template <
typename x
int>
184 newVal = (oldVal & ~mask) | (
val &
mask);
189 : BaseRemoteGDB(_system, _listen_config),
190 regCache32(this), regCache64(this)
198 panic_if(!isa,
"Cannot derive rv_type from non-riscv isa");
199 return isa->rvType();
206 panic_if(!isa,
"Cannot derive rv_type from non-riscv isa");
207 return isa->getPrivilegeModeSet();
211RemoteGDB::acc(
Addr va,
size_t len)
215 MMU *mmu =
static_cast<MMU *
>(context()->getMMUPtr());
220 SATP satp = context()->readMiscReg(MISCREG_SATP);
221 MISA misa = tc->readMiscRegNoEffect(MISCREG_ISA);
222 if (misa.rvs && pmode != PrivilegeMode::PRV_M &&
223 satp.mode != AddrXlateMode::BARE) {
226 context(), paddr, logBytes, BaseMMU::Read);
227 if (fault != NoFault)
233 return context()->getProcessPtr()->pTable->lookup(va) !=
nullptr;
237RemoteGDB::insertHardBreak(
Addr addr,
size_t kind)
240 BaseRemoteGDB::insertHardBreak(realAddr, kind);
244RemoteGDB::removeHardBreak(
Addr addr,
size_t kind)
247 BaseRemoteGDB::removeHardBreak(realAddr, kind);
253 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n", size());
256 if (rv_gdb !=
nullptr) {
262 for (
int i = 0;
i < int_reg::NumArchRegs;
i++) {
268 for (
int i = 0;
i < float_reg::NumRegs;
i++)
374 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
377 if (rv_gdb !=
nullptr) {
380 for (
int i = 0;
i < int_reg::NumArchRegs;
i++)
385 for (
int i = 0;
i < float_reg::NumRegs;
i++)
462 DPRINTF(GDBAcc,
"getregs in remotegdb, size %lu\n", size());
465 if (rv_gdb !=
nullptr) {
471 for (
int i = 0;
i < int_reg::NumArchRegs;
i++) {
477 for (
int i = 0;
i < float_reg::NumRegs;
i++)
577 DPRINTF(GDBAcc,
"setregs in remotegdb \n");
580 if (rv_gdb !=
nullptr) {
583 for (
int i = 0;
i < int_reg::NumArchRegs;
i++)
588 for (
int i = 0;
i < float_reg::NumRegs;
i++)
662RemoteGDB::getXferFeaturesRead(
const std::string &annex, std::string &output)
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)
Addr instAddr() const
Returns the memory address of the instruction this PC points to.
PrivilegeMode getMemPriv(ThreadContext *tc, BaseMMU::Mode mode)
virtual PrivilegeModeSet getPrivilegeModeSet(ThreadContext *tc)
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 RegVal getReg(const RegId ®) const
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual BaseISA * getIsaPtr() const =0
virtual void setReg(const RegId ®, RegVal val)
virtual const PCStateBase & pcState() const =0
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
virtual ContextID contextId() 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 RegClass intRegClass
constexpr enums::RiscvType RV32
enums::RiscvType RiscvType
const std::unordered_map< int, CSRMetadata > CSRData
const std::unordered_map< int, RegVal > CSRMasks[enums::Num_RiscvType][enums::Num_PrivilegeModeSet]
constexpr enums::RiscvType RV64
enums::PrivilegeModeSet PrivilegeModeSet
constexpr RegClass floatRegClass
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.
Declarations of a non-full system Page Table.