Go to the documentation of this file.
55 (
"power_on_reset", 0x001, 0, {{
H,
H,
H}});
59 (
"watch_dog_reset", 0x002, 120, {{
H,
H,
H}});
63 (
"externally_initiated_reset", 0x003, 110, {{
H,
H,
H}});
67 (
"software_initiated_reset", 0x004, 130, {{
SH,
SH,
H}});
71 (
"RED_state_exception", 0x005, 1, {{
H,
H,
H}});
75 (
"store_error", 0x007, 201, {{
H,
H,
H}});
79 (
"instruction_access_exception", 0x008, 300, {{
H,
H,
H}});
88 (
"instruction_access_error", 0x00A, 400, {{
H,
H,
H}});
92 (
"illegal_instruction", 0x010, 620, {{
H,
H,
H}});
96 (
"privileged_opcode", 0x011, 700, {{P,
SH,
SH}});
110 (
"fp_disabled", 0x020, 800, {{P, P,
H}});
116 (
"fp_disabled", 0x020, 800, {{P, P,
H}});
120 (
"fp_exception_ieee_754", 0x021, 1110, {{P, P,
H}});
124 (
"fp_exception_other", 0x022, 1110, {{P, P,
H}});
128 (
"tag_overflow", 0x023, 1400, {{P, P,
H}});
132 (
"clean_window", 0x024, 1010, {{P, P,
H}});
136 (
"division_by_zero", 0x028, 1500, {{P, P,
H}});
140 (
"internal_processor_error", 0x029, 4, {{
H,
H,
H}});
144 (
"instruction_invalid_tsb_entry", 0x02A, 210, {{
H,
H,
SH}});
148 (
"data_invalid_tsb_entry", 0x02B, 1203, {{
H,
H,
H}});
152 (
"data_access_exception", 0x030, 1201, {{
H,
H,
H}});
161 (
"data_access_error", 0x032, 1210, {{
H,
H,
H}});
165 (
"data_access_protection", 0x033, 1207, {{
H,
H,
H}});
169 (
"mem_address_not_aligned", 0x034, 1020, {{
H,
H,
H}});
173 (
"LDDF_mem_address_not_aligned", 0x035, 1010, {{
H,
H,
H}});
177 (
"STDF_mem_address_not_aligned", 0x036, 1010, {{
H,
H,
H}});
181 (
"privileged_action", 0x037, 1110, {{
H,
H,
SH}});
185 (
"LDQF_mem_address_not_aligned", 0x038, 1010, {{
H,
H,
H}});
189 (
"STQF_mem_address_not_aligned", 0x039, 1010, {{
H,
H,
H}});
193 (
"instruction_real_translation_miss", 0x03E, 208, {{
H,
H,
SH}});
197 (
"data_real_translation_miss", 0x03F, 1203, {{
H,
H,
H}});
206 (
"interrupt_level_n", 0x040, 0, {{P, P,
SH}});
210 (
"hstick_match", 0x05E, 1601, {{
H,
H,
H}});
214 (
"trap_level_zero", 0x05F, 202, {{
H,
H,
SH}});
218 (
"interrupt_vector", 0x060, 2630, {{
H,
H,
H}});
222 (
"PA_watchpoint", 0x061, 1209, {{
H,
H,
H}});
226 (
"VA_watchpoint", 0x062, 1120, {{P, P,
SH}});
230 (
"fast_instruction_access_MMU_miss", 0x064, 208, {{
H,
H,
SH}});
234 (
"fast_data_access_MMU_miss", 0x068, 1203, {{
H,
H,
H}});
238 (
"fast_data_access_protection", 0x06C, 1207, {{
H,
H,
H}});
242 (
"instruction_break", 0x076, 610, {{
H,
H,
H}});
246 (
"cpu_mondo", 0x07C, 1608, {{P, P,
SH}});
250 (
"dev_mondo", 0x07D, 1611, {{P, P,
SH}});
254 (
"resume_error", 0x07E, 3330, {{P, P,
SH}});
258 (
"spill_n_normal", 0x080, 900, {{P, P,
H}});
262 (
"spill_n_other", 0x0A0, 900, {{P, P,
H}});
266 (
"fill_n_normal", 0x0C0, 900, {{P, P,
H}});
270 (
"fill_n_other", 0x0E0, 900, {{P, P,
H}});
274 (
"trap_instruction", 0x100, 1602, {{P, P,
H}});
345 bool priv = pstate.priv;
357 bool changedCWP =
true;
360 else if (0x80 <= tt && tt <= 0xbf)
361 CWP += (CANSAVE + 2);
362 else if (0xc0 <= tt && tt <= 0xff)
448 pstate.cle = pstate.tle;
453 bool changedCWP =
true;
456 else if (0x80 <= tt && tt <= 0xbf)
457 CWP += (CANSAVE + 2);
458 else if (0xc0 <= tt && tt <= 0xff)
473 const Addr RSTVAddr = 0xFFF0000000ULL;
474 PC = RSTVAddr | ((TT << 5) & 0xFF);
482 PC = (HTBA & ~
mask(14)) | ((TT << 5) &
mask(14));
490 PC = (TBA & ~
mask(15)) |
491 (TL > 1 ? (1 << 14) : 0) |
492 ((TT << 5) &
mask(14));
516 else if (pstate.priv)
523 if (hpstate.red || (
tl ==
MaxTL - 1)) {
530 panic(
"Should go to error state here.. crap\n");
630 panic_if(!pte,
"Tried to execute unmapped address %#x.\n",
vaddr);
632 Addr alignedvaddr =
p->pTable->pageAlign(
vaddr);
643 bool is_real_address = !
bits(tlbdata, 4);
647 bool trapped =
bits(tlbdata, 18, 16) > 0;
653 int primary_context =
bits(tlbdata, 47, 32);
656 int const partition_id = 0;
660 int context_id = (is_real_address || trapped) ? 0 : primary_context;
672 alignedvaddr, partition_id, context_id,
686 if (!pte &&
p->fixupFault(
vaddr))
687 pte =
p->pTable->lookup(
vaddr);
688 panic_if(!pte,
"Tried to access unmapped address %#x.\n",
vaddr);
690 Addr alignedvaddr =
p->pTable->pageAlign(
vaddr);
704 int primary_context =
bits(tlbdata, 47, 32);
720 int is_real_address = !
bits(tlbdata, 5);
732 ASI asi =
static_cast<ASI>(reg_asi);
738 bool trapped =
bits(tlbdata, 18, 16) > 0;
742 int context_id = ((!
hpriv && !
red && is_real_address) ||
745 ? 0 : primary_context;
748 int const partition_id = 0;
760 alignedvaddr, partition_id, context_id,
@ MISCREG_ASI
Ancillary State Registers.
virtual System * getSystemPtr()=0
virtual TrapType trapType()=0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual RegVal getReg(const RegId ®) const
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual BaseMMU * getMMUPtr()=0
virtual const PCStateBase & pcState() const =0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
constexpr void replaceBits(T &val, unsigned first, unsigned last, B bit_val)
A convenience function to replace bits first to last of val with bit_val in place.
virtual PrivilegeLevel getNextLevel(PrivilegeLevel current)=0
Workload * workload
OS kernel.
@ MISCREG_HPSTATE
Hyper privileged registers.
void doNormalFault(ThreadContext *tc, TrapType tt, bool gotoHpriv)
This sets everything up for a normal trap except for actually jumping to the handler.
constexpr uint64_t mask(unsigned nbits)
Generate a 64-bit mask of 'nbits' 1s, right justified.
void getPrivVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT, RegVal TL)
void getHyperVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT)
ThreadContext is the external interface to all thread state for anything outside of the CPU.
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
SignedBitfield< 15, 8 > SH
void getREDVector(RegVal TT, Addr &PC, Addr &NPC)
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void doREDFault(ThreadContext *tc, TrapType tt)
This sets everything up for a RED state trap except for actually jumping to the handler.
virtual void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual Process * getProcessPtr()=0
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
MipsFaultBase::FaultVals FaultVals
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual void handleTrap(ThreadContext *tc, int trapNum)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
@ MISCREG_TPC
Privilged Registers.
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
void enterREDState(ThreadContext *tc)
This causes the thread context to enter RED state.
#define panic(...)
This implements a cprintf based panic() function.
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
Generated on Sun Jul 30 2023 01:56:46 for gem5 by doxygen 1.8.17