55#include "debug/Checkpoint.hh"
56#include "debug/LLSC.hh"
57#include "debug/MatRegs.hh"
58#include "debug/RiscvMisc.hh"
59#include "debug/VecRegs.hh"
62#include "params/RiscvISA.hh"
316 "VLEN should be greater or equal",
317 "than ELEN. Ch. 2RISC-V vector spec.");
319 inform(
"RVV enabled, VLEN = %d bits, ELEN = %d bits",
370 misa.rvi = misa.rvm = misa.rva = misa.rvf = misa.rvd = misa.rvc = 1;
379 misa.rvs = misa.rvu = 1;
382 misa.rvh = misa.rvs = misa.rvu = 1;
386 panic(
"Privilege mode set config should not reach here");
443 if (hpmcounter < 0 || hpmcounter > 31)
444 panic(
"Illegal HPM counter %d\n", hpmcounter);
455 if (prv <
PRV_M && (
bits(mcounteren, hpmcounter) == 0)) {
456 return std::make_shared<IllegalInstFault>(
457 csprintf(
"Counter %s is disabled from mcounteren bit %d\n",
464 bits(hcounteren, hpmcounter) == 0)
466 return std::make_shared<VirtualInstFault>(
467 csprintf(
"Counter %s is disabled from hcounteren bit %d\n",
472 if (prv ==
PRV_U &&
bits(scounteren, hpmcounter) == 0) {
473 return std::make_shared<IllegalInstFault>(
474 csprintf(
"Counter %s is disabled from scounteren bit %d\n",
486 DPRINTF(RiscvMisc,
"Reading MiscReg %s (%d): %#x.\n",
496 return tc->contextId();
498 return static_cast<RegVal>(
tc->getCpuPtr()->curCycle());
506 return static_cast<RegVal>(
tc->getCpuPtr()->totalInsts());
512 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
518 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
519 return ic->readHVIP();
524 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
638 switch(nstatus.mnpp) {
644 nstatus.mnpp =
PRV_S;
666 return tc->getCpuPtr()->curCycle();
681 DPRINTF(RiscvMisc,
"Setting MiscReg %s (%d) to %#x.\n",
729 for (
int i=0;
i < regSize;
i++) {
731 uint8_t cfg_val = (
val >> (8*
i)) & 0xff;
738 bool result = mmu->getPMP()->pmpUpdateCfg(pmp_index,cfg_val);
740 res |= ((
RegVal)cfg_val << (8*
i));
742 res |= (old_val & (0xFF << (8*
i)));
756 if (mmu->getPMP()->pmpUpdateAddr(pmp_index,
val)) {
771 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
779 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
787 tc->getCpuPtr()->getInterruptController(
tc->threadId()));
797 if (new_val.mode != AddrXlateMode::BARE &&
798 new_val.mode != AddrXlateMode::SV39)
799 new_val.mode = cur_val.mode;
818 if (new_val.mode != AddrXlateMode::BARE &&
819 new_val.mode != AddrXlateMode::SV39)
820 new_val.mode = cur_val.mode;
829 SENVCFG panic_mask = 0;
832 SENVCFG wpri_mask = 0;
833 wpri_mask.wpri_1 = ~wpri_mask.wpri_1;
834 wpri_mask.wpri_2 = ~wpri_mask.wpri_2;
835 wpri_mask.wpri_3 = ~wpri_mask.wpri_3;
837 if ((panic_mask &
val) != 0) {
838 panic(
"Tried to write to an unimplemented bitfield in the "
839 "senvcfg CSR!\nThe attempted write was:\n %" PRIu64
"\n",
861 if (new_val.mode != AddrXlateMode::BARE &&
862 new_val.mode != AddrXlateMode::SV39)
864 new_val.mode = cur_val.mode;
881 MISA new_misa = (MISA)
val;
884 if (new_misa.rvc == 0 &&
887 new_misa.rvc = new_misa.rvc | cur_misa.rvc;
892 new_misa.rvs = cur_misa.rvs;
893 new_misa.rvu = cur_misa.rvu;
917 auto sstatus_wmask = wmask_map.find(
CSR_VSSTATUS)->second;
918 val = (cur & ~sstatus_wmask) |
val;
945 tc->getMMUPtr()->flushAll();
951 NSTATUS nstatus =
val;
981 DPRINTF(Checkpoint,
"Serializing Riscv Misc Registers\n");
988 DPRINTF(Checkpoint,
"Unserializing Riscv Misc Registers\n");
1000 DPRINTF(LLSC,
"Locked snoop on address %x.\n", snoop_addr);
1001 if ((load_reservation_addr & cacheBlockMask) == snoop_addr)
1011 load_reservation_addr = req->getPaddr();
1012 DPRINTF(LLSC,
"[cid:%d]: Reserved address %x.\n",
1013 req->contextId(), req->getPaddr());
1027 DPRINTF(LLSC,
"[cid:%d]: load_reservation_addrs empty? %s.\n",
1029 lr_addr_empty ?
"yes" :
"no");
1030 if (!lr_addr_empty) {
1031 DPRINTF(LLSC,
"[cid:%d]: addr = %x.\n", req->contextId(),
1032 req->getPaddr() & cacheBlockMask);
1033 DPRINTF(LLSC,
"[cid:%d]: last locked addr = %x.\n", req->contextId(),
1034 load_reservation_addr & cacheBlockMask);
1036 if (lr_addr_empty ||
1037 (load_reservation_addr & cacheBlockMask)
1038 != ((req->getPaddr() & cacheBlockMask))) {
1039 req->setExtraData(0);
1040 int stCondFailures =
tc->readStCondFailures();
1041 tc->setStCondFailures(++stCondFailures);
1043 warn(
"%i: context %d: %d consecutive SC failures.\n",
1044 curTick(),
tc->contextId(), stCondFailures);
1052 if (req->isUncacheable()) {
1053 req->setExtraData(2);
1059 DPRINTF(LLSC,
"[cid:%d]: SC success! Current locked addr = %x.\n",
1060 req->contextId(), load_reservation_addr & cacheBlockMask);
1067 tc->getCpuPtr()->wakeup(
tc->threadId());
1087 uint64_t& csr,
RegIndex& midx, std::string& csrName)
1099 default:
return;
break;
1105 panic(
"Bad remapping of virtualized CSR");
1107 midx = csr_data_it->second.physIndex;
1108 csrName = csr_data_it->second.name;
1117 return std::make_shared<IllegalInstFault>(
1118 "SATP access with TVM enabled\n",
1124 if (hstatus.vtvm == 1)
1125 return std::make_shared<VirtualInstFault>(
1126 "VSATP access with hstatus.vtvm enabled",
1132 return std::make_shared<IllegalInstFault>(
1133 "HGATP access with TVM enabled\n",
1149 "Illegal CSR passed to backdoorReadCSRAllBits");
1151 auto midx = csr_it->second.physIndex;
1175 mask(64) : mask_it->second;
1203 readval |= (mip.vssi << 2);
1219 "Illegal CSR passed to writeCSR");
1222 auto midx = csr_it->second.physIndex;
1229 writeData &= mideleg;
1244 writeData &= hideleg;
1261 auto write_mask_it = csr_write_masks.find(csr);
1262 if (write_mask_it != csr_write_masks.end()) {
1263 write_mask = write_mask_it->second;
1265 auto read_mask_it = csr_read_masks.find(csr);
1266 if (read_mask_it != csr_read_masks.end()) {
1267 write_mask = read_mask_it->second;
1271 auto writeDataMasked = writeData & write_mask;
1283 auto new_reg_data_all = (reg_data_all & ~write_mask)
1284 | (writeData & write_mask);
1297 mip.vssi = (new_reg_data_all &
VSSI_MASK) >> 2;
1323 auto vec =
tc->readMiscRegNoEffect(idx);
1325 if (intr &&
bits(
vec, 1, 0) == 1)
1368 return std::make_shared<IllegalInstFault>(
"FPU is off", machInst);
1396 return std::make_shared<IllegalInstFault>(
1397 "RVV is disabled or VPU is off", machInst);
1400 if (check_vill && machInst.vill) {
1401 return std::make_shared<IllegalInstFault>(
"VILL is set", machInst);
1426 return os <<
"PRV_U";
1428 return os <<
"PRV_S";
1430 return os <<
"PRV_M";
1432 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
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]
const RegVal MIDELEG_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)