arch-riscv: Add senvcfg CSR
This commit adds the senvcfg CSR, which fixes the 6.11.3 kernel crash documented in issue 1674. I have not added a bitfield and its implementation in isa.cc only uses setMiscRegNoEffect, so this implementation is likely missing some critical components.
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
<reg name="stval" bitsize="32"/>
|
||||
<reg name="sip" bitsize="32"/>
|
||||
<reg name="satp" bitsize="32"/>
|
||||
<reg name="senvcfg" bitsize="32"/>
|
||||
<reg name="mvendorid" bitsize="32"/>
|
||||
<reg name="marchid" bitsize="32"/>
|
||||
<reg name="mimpid" bitsize="32"/>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<reg name="stval" bitsize="64"/>
|
||||
<reg name="sip" bitsize="64"/>
|
||||
<reg name="satp" bitsize="64"/>
|
||||
<reg name="senvcfg" bitsize="64"/>
|
||||
<reg name="mvendorid" bitsize="64"/>
|
||||
<reg name="marchid" bitsize="64"/>
|
||||
<reg name="mimpid" bitsize="64"/>
|
||||
|
||||
@@ -185,6 +185,7 @@ namespace RiscvISA
|
||||
[MISCREG_SCAUSE] = "SCAUSE",
|
||||
[MISCREG_STVAL] = "STVAL",
|
||||
[MISCREG_SATP] = "SATP",
|
||||
[MISCREG_SENVCFG] = "SENVCFG",
|
||||
|
||||
[MISCREG_UTVEC] = "UTVEC",
|
||||
[MISCREG_USCRATCH] = "USCRATCH",
|
||||
@@ -779,6 +780,11 @@ ISA::setMiscReg(RegIndex idx, RegVal val)
|
||||
setMiscRegNoEffect(idx, new_val);
|
||||
}
|
||||
break;
|
||||
case MISCREG_SENVCFG:
|
||||
{
|
||||
setMiscRegNoEffect(idx, val + 1);
|
||||
}
|
||||
break;
|
||||
case MISCREG_TSELECT:
|
||||
{
|
||||
// we don't support debugging, so always set a different value
|
||||
|
||||
@@ -183,6 +183,7 @@ enum MiscRegIndex
|
||||
MISCREG_SCAUSE,
|
||||
MISCREG_STVAL,
|
||||
MISCREG_SATP,
|
||||
MISCREG_SENVCFG,
|
||||
|
||||
MISCREG_UTVEC,
|
||||
MISCREG_USCRATCH,
|
||||
@@ -360,6 +361,7 @@ enum CSRIndex
|
||||
CSR_STVAL = 0x143,
|
||||
CSR_SIP = 0x144,
|
||||
CSR_SATP = 0x180,
|
||||
CSR_SENVCFG = 0x10A, // 20240411 RISCV spec, volume 2
|
||||
|
||||
CSR_MVENDORID = 0xF11,
|
||||
CSR_MARCHID = 0xF12,
|
||||
@@ -777,6 +779,9 @@ const std::unordered_map<int, CSRMetadata> CSRData = {
|
||||
{"sip", MISCREG_SIP, rvTypeFlags(RV64, RV32), isaExtsFlags('s')}},
|
||||
{CSR_SATP,
|
||||
{"satp", MISCREG_SATP, rvTypeFlags(RV64, RV32), isaExtsFlags('s')}},
|
||||
{CSR_SENVCFG,
|
||||
{"senvcfg", MISCREG_SENVCFG, rvTypeFlags(RV64, RV32),
|
||||
isaExtsFlags('s')}},
|
||||
|
||||
{CSR_MVENDORID,
|
||||
{"mvendorid", MISCREG_VENDORID, rvTypeFlags(RV64, RV32),
|
||||
|
||||
@@ -327,6 +327,8 @@ RemoteGDB::Riscv32GdbRegCache::getRegs(ThreadContext *context)
|
||||
CSRData.at(CSR_SIP).physIndex) & RVxCSRMasks.at(CSR_SIP);
|
||||
r.satp = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_SATP).physIndex);
|
||||
r.senvcfg = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_SENVCFG).physIndex);
|
||||
|
||||
// M mode CSR
|
||||
r.mvendorid = context->readMiscRegNoEffect(
|
||||
@@ -426,6 +428,8 @@ RemoteGDB::Riscv32GdbRegCache::setRegs(ThreadContext *context) const
|
||||
CSRData.at(CSR_STVAL).physIndex, r.stval);
|
||||
context->setMiscRegNoEffect(
|
||||
CSRData.at(CSR_SATP).physIndex, r.satp);
|
||||
context->setMiscRegNoEffect(
|
||||
CSRData.at(CSR_SENVCFG).physIndex, r.senvcfg);
|
||||
|
||||
// M mode CSR
|
||||
setRegWithMask(context, RV32, pms, CSR_MSTATUS, r.mstatus);
|
||||
@@ -528,6 +532,8 @@ RemoteGDB::Riscv64GdbRegCache::getRegs(ThreadContext *context)
|
||||
CSRData.at(CSR_SIP).physIndex) & RVxCSRMasks.at(CSR_SIP);
|
||||
r.satp = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_SATP).physIndex);
|
||||
r.senvcfg = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_SENVCFG).physIndex);
|
||||
|
||||
// M mode CSR
|
||||
r.mvendorid = context->readMiscRegNoEffect(
|
||||
@@ -625,7 +631,8 @@ RemoteGDB::Riscv64GdbRegCache::setRegs(ThreadContext *context) const
|
||||
CSRData.at(CSR_STVAL).physIndex, r.stval);
|
||||
context->setMiscRegNoEffect(
|
||||
CSRData.at(CSR_SATP).physIndex, r.satp);
|
||||
|
||||
context->setMiscRegNoEffect(
|
||||
CSRData.at(CSR_SENVCFG).physIndex, r.senvcfg);
|
||||
// M mode CSR
|
||||
setRegWithMask(context, RV64, pms, CSR_MSTATUS, r.mstatus);
|
||||
setRegNoEffectWithMask(context, RV64, pms, CSR_MISA, r.misa);
|
||||
|
||||
@@ -108,6 +108,7 @@ class RemoteGDB : public BaseRemoteGDB
|
||||
uint32_t stval;
|
||||
uint32_t sip;
|
||||
uint32_t satp;
|
||||
uint32_t senvcfg;
|
||||
uint32_t mvendorid;
|
||||
uint32_t marchid;
|
||||
uint32_t mimpid;
|
||||
@@ -192,6 +193,7 @@ class RemoteGDB : public BaseRemoteGDB
|
||||
uint64_t stval;
|
||||
uint64_t sip;
|
||||
uint64_t satp;
|
||||
uint64_t senvcfg;
|
||||
uint64_t mvendorid;
|
||||
uint64_t marchid;
|
||||
uint64_t mimpid;
|
||||
|
||||
Reference in New Issue
Block a user