46 i <
p.port_local_interrupt_pins_connection_count;
48 uint8_t interruptID =
p.local_interrupt_ids[
i];
49 assert(interruptID <= 47);
51 csprintf(
"%s.local_interrupt_pins[%d]",
p.name,
i);
59std::bitset<NumInterruptTypes>
74 mask = ~mideleg | (mideleg & ~hideleg);
84 mask |= (mideleg & ~hideleg);
88 if (vsstatus.sie) {
mask |= (mideleg & hideleg); }
98 panic(
"Unknown privilege mode %d.", prv);
102 return std::bitset<NumInterruptTypes>(
mask);
110 return std::make_shared<NonMaskableInterruptFault>(
nmi_cause);
112 if (((
ISA*)
tc->getIsaPtr())->rvType() ==
RV64) {
133 for (
const int &
id : interrupt_order) {
135 return std::make_shared<InterruptFault>(
id);
138 }
else if (((
ISA*)
tc->getIsaPtr())->rvType() ==
RV32) {
147 for (
const int &
id : interrupt_order) {
149 return std::make_shared<InterruptFault>(
id);
189 tc->getCpuPtr()->postInterrupt(
tc->threadId(), num + 16, 0);
195 unsigned long ip_ulong =
ip.to_ulong();
196 unsigned long hvip_ulong =
hvip.to_ulong();
197 unsigned long ie_ulong =
ie.to_ulong();
206 unsigned long ip_ulong;
207 unsigned long hvip_ulong;
208 unsigned long ie_ulong;
BaseInterrupts(const Params &p)
Ports are used to interface objects to each other.
std::vector< gem5::IntSinkPin< Interrupts > * > localInterruptPins
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Interrupts(const Params &p)
void clear(int int_num, int index) override
bool checkInterrupts() const override
bool checkNonMaskableInterrupt() const
void post(int int_num, int index) override
void serialize(CheckpointOut &cp) const override
Serialize an object.
void raiseInterruptPin(uint32_t num)
Port & getPort(const std::string &if_name, PortID idx) override
Get a port with a given name and index.
std::bitset< NumInterruptTypes > hvip
RiscvInterruptsParams Params
std::bitset< NumInterruptTypes > globalMask() const
std::bitset< NumInterruptTypes > ip
bool checkInterrupt(int num) const
Fault getInterrupt() override
std::bitset< NumInterruptTypes > ie
#define panic(...)
This implements a cprintf based panic() function.
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
constexpr enums::RiscvType RV32
bool virtualizationEnabled(ExecContext *xc)
constexpr enums::RiscvType RV64
@ INT_TIMER_VIRTUAL_SUPER
@ INT_SOFTWARE_VIRTUAL_SUPER
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
std::ostream CheckpointOut
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
std::string csprintf(const char *format, const Args &...args)
IntSinkPinBase IntSinkPin
constexpr decltype(nullptr) NoFault
#define UNSERIALIZE_SCALAR(scalar)
#define SERIALIZE_SCALAR(scalar)