Go to the documentation of this file.
52 (
"power_on_reset", 0x001, 0, {{
H,
H,
H}});
56 (
"watch_dog_reset", 0x002, 120, {{
H,
H,
H}});
60 (
"externally_initiated_reset", 0x003, 110, {{
H,
H,
H}});
64 (
"software_initiated_reset", 0x004, 130, {{
SH,
SH,
H}});
68 (
"RED_state_exception", 0x005, 1, {{
H,
H,
H}});
72 (
"store_error", 0x007, 201, {{
H,
H,
H}});
76 (
"instruction_access_exception", 0x008, 300, {{
H,
H,
H}});
85 (
"instruction_access_error", 0x00A, 400, {{
H,
H,
H}});
89 (
"illegal_instruction", 0x010, 620, {{
H,
H,
H}});
93 (
"privileged_opcode", 0x011, 700, {{P,
SH,
SH}});
107 (
"fp_disabled", 0x020, 800, {{P, P,
H}});
113 (
"fp_disabled", 0x020, 800, {{P, P,
H}});
117 (
"fp_exception_ieee_754", 0x021, 1110, {{P, P,
H}});
121 (
"fp_exception_other", 0x022, 1110, {{P, P,
H}});
125 (
"tag_overflow", 0x023, 1400, {{P, P,
H}});
129 (
"clean_window", 0x024, 1010, {{P, P,
H}});
133 (
"division_by_zero", 0x028, 1500, {{P, P,
H}});
137 (
"internal_processor_error", 0x029, 4, {{
H,
H,
H}});
141 (
"instruction_invalid_tsb_entry", 0x02A, 210, {{
H,
H,
SH}});
145 (
"data_invalid_tsb_entry", 0x02B, 1203, {{
H,
H,
H}});
149 (
"data_access_exception", 0x030, 1201, {{
H,
H,
H}});
158 (
"data_access_error", 0x032, 1210, {{
H,
H,
H}});
162 (
"data_access_protection", 0x033, 1207, {{
H,
H,
H}});
166 (
"mem_address_not_aligned", 0x034, 1020, {{
H,
H,
H}});
170 (
"LDDF_mem_address_not_aligned", 0x035, 1010, {{
H,
H,
H}});
174 (
"STDF_mem_address_not_aligned", 0x036, 1010, {{
H,
H,
H}});
178 (
"privileged_action", 0x037, 1110, {{
H,
H,
SH}});
182 (
"LDQF_mem_address_not_aligned", 0x038, 1010, {{
H,
H,
H}});
186 (
"STQF_mem_address_not_aligned", 0x039, 1010, {{
H,
H,
H}});
190 (
"instruction_real_translation_miss", 0x03E, 208, {{
H,
H,
SH}});
194 (
"data_real_translation_miss", 0x03F, 1203, {{
H,
H,
H}});
203 (
"interrupt_level_n", 0x040, 0, {{P, P,
SH}});
207 (
"hstick_match", 0x05E, 1601, {{
H,
H,
H}});
211 (
"trap_level_zero", 0x05F, 202, {{
H,
H,
SH}});
215 (
"interrupt_vector", 0x060, 2630, {{
H,
H,
H}});
219 (
"PA_watchpoint", 0x061, 1209, {{
H,
H,
H}});
223 (
"VA_watchpoint", 0x062, 1120, {{P, P,
SH}});
227 (
"fast_instruction_access_MMU_miss", 0x064, 208, {{
H,
H,
SH}});
231 (
"fast_data_access_MMU_miss", 0x068, 1203, {{
H,
H,
H}});
235 (
"fast_data_access_protection", 0x06C, 1207, {{
H,
H,
H}});
239 (
"instruction_break", 0x076, 610, {{
H,
H,
H}});
243 (
"cpu_mondo", 0x07C, 1608, {{P, P,
SH}});
247 (
"dev_mondo", 0x07D, 1611, {{P, P,
SH}});
251 (
"resume_error", 0x07E, 3330, {{P, P,
SH}});
255 (
"spill_n_normal", 0x080, 900, {{P, P,
H}});
259 (
"spill_n_other", 0x0A0, 900, {{P, P,
H}});
263 (
"fill_n_normal", 0x0C0, 900, {{P, P,
H}});
267 (
"fill_n_other", 0x0E0, 900, {{P, P,
H}});
271 (
"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 = 0xFFF0000000
ULL;
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 current = Hyperprivileged;
517 else if (pstate.priv)
518 current = Privileged;
524 if (hpstate.red || (
tl ==
MaxTL - 1)) {
531 panic(
"Should go to error state here.. crap\n");
539 }
else if (
level == Hyperprivileged ||
540 (
level == Privileged && trapType() >= 384)) {
625 SparcFaultBase::invoke(tc, inst);
631 panic_if(!pte,
"Tried to execute unmapped address %#x.\n",
vaddr);
633 Addr alignedvaddr =
p->pTable->pageAlign(
vaddr);
644 bool is_real_address = !
bits(tlbdata, 4);
648 bool trapped =
bits(tlbdata, 18, 16) > 0;
654 int primary_context =
bits(tlbdata, 47, 32);
657 int const partition_id = 0;
661 int context_id = (is_real_address || trapped) ? 0 : primary_context;
673 insert(alignedvaddr, partition_id, context_id,
false, entry.
pte);
680 SparcFaultBase::invoke(tc, inst);
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 insert(alignedvaddr, partition_id, context_id,
false, entry.
pte);
767 SparcFaultBase::invoke(tc, inst);
786 SparcFaultBase::invoke(tc, inst);
805 SparcFaultBase::invoke(tc, inst);
818 sp->handleTrap(_n, tc);
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
void replaceBits(T &val, int first, int last, B bit_val)
A convenience function to replace bits first to last of val with bit_val in place.
void getHyperVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT)
void getPrivVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT, RegVal TL)
virtual void invoke(ThreadContext *tc, const StaticInstPtr &inst=StaticInst::nullStaticInstPtr)
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
virtual Process * getProcessPtr()=0
@ MISCREG_TPC
Privilged Registers.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
SignedBitfield< 15, 8 > SH
void getREDVector(RegVal TT, Addr &PC, Addr &NPC)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
virtual BaseTLB * getITBPtr()=0
virtual TheISA::PCState pcState() const =0
void doREDFault(ThreadContext *tc, TrapType tt)
This sets everything up for a RED state trap except for actually jumping to the handler.
@ MISCREG_HPSTATE
Hyper privileged registers.
MipsFaultBase::FaultVals FaultVals
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
@ MISCREG_ASI
Ancillary State Registers.
Overload hash function for BasicBlockRange type.
void enterREDState(ThreadContext *tc)
This causes the thread context to enter RED state.
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual RegVal readIntReg(RegIndex reg_idx) const =0
void doNormalFault(ThreadContext *tc, TrapType tt, bool gotoHpriv)
This sets everything up for a normal trap except for actually jumping to the handler.
#define ULL(N)
uint64_t constant
virtual BaseTLB * getDTBPtr()=0
#define panic(...)
This implements a cprintf based panic() function.
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Generated on Wed Sep 30 2020 14:01:59 for gem5 by doxygen 1.8.17