56#include "debug/Checkpoint.hh"
57#include "debug/LLSC.hh"
58#include "debug/MatRegs.hh"
59#include "debug/RiscvMisc.hh"
60#include "debug/VecRegs.hh"
64#include "params/RiscvISA.hh"
318 "VLEN should be greater or equal",
319 "than ELEN. Ch. 2RISC-V vector spec.");
321 inform(
"RVV enabled, VLEN = %d bits, ELEN = %d bits",
372 misa.rvi = misa.rvm = misa.rva = misa.rvf = misa.rvd = misa.rvc = 1;
381 misa.rvs = misa.rvu = 1;
384 misa.rvh = misa.rvs = misa.rvu = 1;
388 panic(
"Privilege mode set config should not reach here");
445 if (hpmcounter < 0 || hpmcounter > 31)
446 panic(
"Illegal HPM counter %d\n", hpmcounter);
454 if (is_time_csr && (sys ==
nullptr || sys->
getClint() ==
nullptr)) {
455 return std::make_shared<IllegalInstFault>(
"Can't find CLINT in system",
465 if (prv <
PRV_M && (
bits(mcounteren, hpmcounter) == 0)) {
466 return std::make_shared<IllegalInstFault>(
467 csprintf(
"Counter %s is disabled from mcounteren bit %d\n",
474 bits(hcounteren, hpmcounter) == 0)
476 return std::make_shared<VirtualInstFault>(
477 csprintf(
"Counter %s is disabled from hcounteren bit %d\n",
482 if (prv ==
PRV_U &&
bits(scounteren, hpmcounter) == 0) {
483 return std::make_shared<IllegalInstFault>(
484 csprintf(
"Counter %s is disabled from scounteren bit %d\n",
496 DPRINTF(RiscvMisc,
"Reading MiscReg %s (%d): %#x.\n",
506 return tc->contextId();
508 return static_cast<RegVal>(
tc->getCpuPtr()->curCycle());
513 panic_if(!sys,
"read MISCREG_TIME not in RiscvSystem");
518 panic_if(!sys,
"read MISCREG_TIME not in RiscvSystem");
522 return static_cast<RegVal>(
tc->getCpuPtr()->totalInsts());
528 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
534 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
535 return ic->readHVIP();
540 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
654 switch(nstatus.mnpp) {
660 nstatus.mnpp =
PRV_S;
682 return tc->getCpuPtr()->curCycle();
697 DPRINTF(RiscvMisc,
"Setting MiscReg %s (%d) to %#x.\n",
745 for (
int i=0;
i < regSize;
i++) {
747 uint8_t cfg_val = (
val >> (8*
i)) & 0xff;
754 bool result = mmu->getPMP()->pmpUpdateCfg(pmp_index,cfg_val);
756 res |= ((
RegVal)cfg_val << (8*
i));
758 res |= (old_val & (0xFF << (8*
i)));
772 if (mmu->getPMP()->pmpUpdateAddr(pmp_index,
val)) {
780 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
788 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
796 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
806 if (new_val.mode != AddrXlateMode::BARE &&
807 new_val.mode != AddrXlateMode::SV39)
808 new_val.mode = cur_val.mode;
827 if (new_val.mode != AddrXlateMode::BARE &&
828 new_val.mode != AddrXlateMode::SV39)
829 new_val.mode = cur_val.mode;
838 SENVCFG panic_mask = 0;
841 SENVCFG wpri_mask = 0;
842 wpri_mask.wpri_1 = ~wpri_mask.wpri_1;
843 wpri_mask.wpri_2 = ~wpri_mask.wpri_2;
844 wpri_mask.wpri_3 = ~wpri_mask.wpri_3;
846 if ((panic_mask &
val) != 0) {
847 panic(
"Tried to write to an unimplemented bitfield in the "
848 "senvcfg CSR!\nThe attempted write was:\n %" PRIu64
"\n",
870 if (new_val.mode != AddrXlateMode::BARE &&
871 new_val.mode != AddrXlateMode::SV39)
873 new_val.mode = cur_val.mode;
890 MISA new_misa = (MISA)
val;
893 if (new_misa.rvc == 0 &&
896 new_misa.rvc = new_misa.rvc | cur_misa.rvc;
901 new_misa.rvs = cur_misa.rvs;
902 new_misa.rvu = cur_misa.rvu;
926 auto sstatus_wmask = wmask_map.find(
CSR_VSSTATUS)->second;
927 val = (cur & ~sstatus_wmask) |
val;
954 tc->getMMUPtr()->flushAll();
960 NSTATUS nstatus =
val;
990 DPRINTF(Checkpoint,
"Serializing Riscv Misc Registers\n");
997 DPRINTF(Checkpoint,
"Unserializing Riscv Misc Registers\n");
1008 Addr snoop_addr = pkt->
getAddr() & cacheBlockMask;
1009 DPRINTF(LLSC,
"Locked snoop on address %x.\n", snoop_addr);
1010 if ((load_reservation_addr & cacheBlockMask) == snoop_addr)
1020 load_reservation_addr = req->getPaddr();
1021 DPRINTF(LLSC,
"[cid:%d]: Reserved address %x.\n",
1022 req->contextId(), req->getPaddr());
1036 DPRINTF(LLSC,
"[cid:%d]: load_reservation_addrs empty? %s.\n",
1038 lr_addr_empty ?
"yes" :
"no");
1039 if (!lr_addr_empty) {
1040 DPRINTF(LLSC,
"[cid:%d]: addr = %x.\n", req->contextId(),
1041 req->getPaddr() & cacheBlockMask);
1042 DPRINTF(LLSC,
"[cid:%d]: last locked addr = %x.\n", req->contextId(),
1043 load_reservation_addr & cacheBlockMask);
1045 if (lr_addr_empty ||
1046 (load_reservation_addr & cacheBlockMask)
1047 != ((req->getPaddr() & cacheBlockMask))) {
1048 req->setExtraData(0);
1049 int stCondFailures =
tc->readStCondFailures();
1050 tc->setStCondFailures(++stCondFailures);
1052 warn(
"%i: context %d: %d consecutive SC failures.\n",
1053 curTick(),
tc->contextId(), stCondFailures);
1061 if (req->isUncacheable()) {
1062 req->setExtraData(2);
1068 DPRINTF(LLSC,
"[cid:%d]: SC success! Current locked addr = %x.\n",
1069 req->contextId(), load_reservation_addr & cacheBlockMask);
1076 tc->getCpuPtr()->wakeup(
tc->threadId());
1096 uint64_t& csr,
RegIndex& midx, std::string& csrName)
1108 default:
return;
break;
1114 panic(
"Bad remapping of virtualized CSR");
1116 midx = csr_data_it->second.physIndex;
1117 csrName = csr_data_it->second.name;
1126 return std::make_shared<IllegalInstFault>(
1127 "SATP access with TVM enabled\n",
1133 if (hstatus.vtvm == 1)
1134 return std::make_shared<VirtualInstFault>(
1135 "VSATP access with hstatus.vtvm enabled",
1141 return std::make_shared<IllegalInstFault>(
1142 "HGATP access with TVM enabled\n",
1158 "Illegal CSR passed to backdoorReadCSRAllBits");
1160 auto midx = csr_it->second.physIndex;
1184 mask(64) : mask_it->second;
1212 readval |= (mip.vssi << 2);
1228 "Illegal CSR passed to writeCSR");
1231 auto midx = csr_it->second.physIndex;
1238 writeData &= mideleg;
1253 writeData &= hideleg;
1270 auto write_mask_it = csr_write_masks.find(csr);
1271 if (write_mask_it != csr_write_masks.end()) {
1272 write_mask = write_mask_it->second;
1274 auto read_mask_it = csr_read_masks.find(csr);
1275 if (read_mask_it != csr_read_masks.end()) {
1276 write_mask = read_mask_it->second;
1280 auto writeDataMasked = writeData & write_mask;
1292 auto new_reg_data_all = (reg_data_all & ~write_mask)
1293 | (writeData & write_mask);
1306 mip.vssi = (new_reg_data_all &
VSSI_MASK) >> 2;
1332 auto vec =
tc->readMiscRegNoEffect(idx);
1334 if (intr &&
bits(
vec, 1, 0) == 1)
1377 return std::make_shared<IllegalInstFault>(
"FPU is off", machInst);
1405 return std::make_shared<IllegalInstFault>(
1406 "RVV is disabled or VPU is off", machInst);
1409 if (check_vill && machInst.vill) {
1410 return std::make_shared<IllegalInstFault>(
"VILL is set", machInst);
1435 return os <<
"PRV_U";
1437 return os <<
"PRV_S";
1439 return os <<
"PRV_M";
1441 return os <<
"PRV_<invalid>";
void serialize(CheckpointOut &cp) const override
Serialize an object.
BaseISA(const SimObjectParams &p, const std::string &name)
The ExecContext is an abstract base class the provides the interface used by the ISA to manipulate th...
virtual RegVal readMiscReg(int misc_reg)=0
Reads a miscellaneous register, handling any architectural side effects due to reading that register.
virtual void setMiscReg(int misc_reg, RegVal val)=0
Sets a miscellaneous register, handling any architectural side effects due to writing that register.
virtual std::string name() const
const bool _wfiResumeOnPending
The WFI instruction can halt the execution of a hart.
virtual const std::unordered_map< int, CSRMetadata > & getCSRDataMap() const
void setMiscReg(RegIndex idx, RegVal val) override
void handleLockedSnoop(PacketPtr pkt, Addr cacheBlockMask) override
virtual const std::unordered_map< int, RegVal > & getCSRMaskMap() const
RegVal readMiscReg(RegIndex idx) override
void globalClearExclusive() override
void serialize(CheckpointOut &cp) const override
Serialize an object.
void resetThread() override
PrivilegeModeSet _privilegeModeSet
The combination of privilege modes in Privilege Levels section of RISC-V privileged spec.
Fault hpmCounterCheck(int counter, ExtMachInst machInst) const
Addr rvSext(Addr addr) const
void setMiscRegNoEffect(RegIndex idx, RegVal val) override
RegVal readMiscRegNoEffect(RegIndex idx) const override
unsigned elen
Length of each vector element in bits.
Fault tvmChecks(uint64_t csr, PrivilegeMode pm, ExtMachInst machInst)
void copyRegsFrom(ThreadContext *src) override
bool handleLockedWrite(const RequestPtr &req, Addr cacheBlockMask) override
unsigned vlen
Length of each vector register in bits.
void swapToVirtCSR(uint64_t &csr, RegIndex &midx, std::string &csrName)
bool getEnableRvv() const
void writeCSR(ExecContext *xc, uint64_t csr, RegVal writeData)
bool _enableSmrnmi
Resumable non-maskable interrupt Set true to make NMI recoverable.
RegVal readCSR(ExecContext *xc, uint64_t csr)
std::vector< RegVal > miscRegFile
bool inUserMode() const override
void unserialize(CheckpointIn &cp) override
Unserialize an object.
const Addr INVALID_RESERVATION_ADDR
bool _enableZcd
Enable Zcd extensions.
virtual Addr getFaultHandlerAddr(RegIndex idx, uint64_t cause, bool intr) const
bool virtualizationEnabled() const
unsigned getVecLenInBytes()
std::unordered_map< int, Addr > load_reservation_addrs
PrivilegeModeSet getPrivilegeModeSet()
virtual const std::unordered_map< int, RegVal > & getCSRWriteMaskMap() const
void handleLockedRead(const RequestPtr &req) override
RegVal backdoorReadCSRAllBits(ExecContext *xc, uint64_t csr)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr) override
Clint * getClint() const
Get a pointer to the system's CLINT model.
uint64_t tryReadMtime() const
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 const PCStateBase & pcState() const =0
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
#define panic(...)
This implements a cprintf based panic() function.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
#define UNSERIALIZE_CONTAINER(member)
#define SERIALIZE_CONTAINER(member)
constexpr RegClass matRegClass
constexpr RegClass vecElemClass
constexpr RegClass vecPredRegClass
constexpr RegClass ccRegClass
constexpr enums::RiscvType RV32
constexpr RegClass floatRegClass(FloatRegClass, FloatRegClassName, float_reg::NumRegs, debug::FloatRegs)
Fault updateVPUStatus(ExecContext *xc, ExtMachInst machInst, bool set_dirty, bool check_vill)
gem5::VecRegContainer< MaxVecLenInBytes > VecRegContainer
const RegVal HS_INTERRUPTS
Fault updateFPUStatus(ExecContext *xc, ExtMachInst machInst, bool set_dirty)
const RegVal STATUS_VS_MASK
void resetV(ExecContext *xc)
const RegVal STATUS_SXL_MASK
const RegVal STATUS_UXL_MASK
constexpr RegClass intRegClass(IntRegClass, IntRegClassName, int_reg::NumRegs, debug::IntRegs)
const std::unordered_map< int, RegVal > CSRWriteMasks[enums::Num_RiscvType][enums::Num_PrivilegeModeSet]
const std::array< const char *, NUM_MISCREGS > MiscRegNames
constexpr RegClass vecRegClass
bool virtualizationEnabled(ExecContext *xc)
constexpr enums::RiscvType RV64
const RegVal MI_MASK[enums::Num_PrivilegeModeSet]
void setV(ExecContext *xc)
constexpr RegClass miscRegClass(MiscRegClass, MiscRegClassName, NUM_MISCREGS, debug::MiscRegs)
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
std::shared_ptr< Request > RequestPtr
constexpr char CCRegClassName[]
constexpr char VecPredRegClassName[]
Tick curTick()
The universal simulation clock.
std::ostream CheckpointOut
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
std::string csprintf(const char *format, const Args &...args)
constexpr char MatRegClassName[]
constexpr decltype(nullptr) NoFault
@ MatRegClass
Matrix Register.
@ CCRegClass
Condition-code register.
@ VecElemClass
Vector Register Native Elem lane.
constexpr char VecElemClassName[]
Declaration of the Packet class.
Declaration of a request, the overall memory request consisting of the parts of the request that are ...
std::ostream & operator<<(std::ostream &os, gem5::RiscvISA::PrivilegeMode pm)