56(
"power_on_reset", 0x001, 0, {{
H,
H,
H}});
60(
"watch_dog_reset", 0x002, 120, {{
H,
H,
H}});
64(
"externally_initiated_reset", 0x003, 110, {{
H,
H,
H}});
68(
"software_initiated_reset", 0x004, 130, {{
SH,
SH,
H}});
72(
"RED_state_exception", 0x005, 1, {{
H,
H,
H}});
76(
"store_error", 0x007, 201, {{
H,
H,
H}});
80(
"instruction_access_exception", 0x008, 300, {{
H,
H,
H}});
89(
"instruction_access_error", 0x00A, 400, {{
H,
H,
H}});
93(
"illegal_instruction", 0x010, 620, {{
H,
H,
H}});
97(
"privileged_opcode", 0x011, 700, {{P,
SH,
SH}});
111(
"fp_disabled", 0x020, 800, {{P, P,
H}});
117(
"fp_disabled", 0x020, 800, {{P, P,
H}});
121(
"fp_exception_ieee_754", 0x021, 1110, {{P, P,
H}});
125(
"fp_exception_other", 0x022, 1110, {{P, P,
H}});
129(
"tag_overflow", 0x023, 1400, {{P, P,
H}});
133(
"clean_window", 0x024, 1010, {{P, P,
H}});
137(
"division_by_zero", 0x028, 1500, {{P, P,
H}});
141(
"internal_processor_error", 0x029, 4, {{
H,
H,
H}});
145(
"instruction_invalid_tsb_entry", 0x02A, 210, {{
H,
H,
SH}});
149(
"data_invalid_tsb_entry", 0x02B, 1203, {{
H,
H,
H}});
153(
"data_access_exception", 0x030, 1201, {{
H,
H,
H}});
162(
"data_access_error", 0x032, 1210, {{
H,
H,
H}});
166(
"data_access_protection", 0x033, 1207, {{
H,
H,
H}});
170(
"mem_address_not_aligned", 0x034, 1020, {{
H,
H,
H}});
174(
"LDDF_mem_address_not_aligned", 0x035, 1010, {{
H,
H,
H}});
178(
"STDF_mem_address_not_aligned", 0x036, 1010, {{
H,
H,
H}});
182(
"privileged_action", 0x037, 1110, {{
H,
H,
SH}});
186(
"LDQF_mem_address_not_aligned", 0x038, 1010, {{
H,
H,
H}});
190(
"STQF_mem_address_not_aligned", 0x039, 1010, {{
H,
H,
H}});
194(
"instruction_real_translation_miss", 0x03E, 208, {{
H,
H,
SH}});
198(
"data_real_translation_miss", 0x03F, 1203, {{
H,
H,
H}});
207(
"interrupt_level_n", 0x040, 0, {{P, P,
SH}});
211(
"hstick_match", 0x05E, 1601, {{
H,
H,
H}});
215(
"trap_level_zero", 0x05F, 202, {{
H,
H,
SH}});
219(
"interrupt_vector", 0x060, 2630, {{
H,
H,
H}});
223(
"PA_watchpoint", 0x061, 1209, {{
H,
H,
H}});
227(
"VA_watchpoint", 0x062, 1120, {{P, P,
SH}});
231(
"fast_instruction_access_MMU_miss", 0x064, 208, {{
H,
H,
SH}});
235(
"fast_data_access_MMU_miss", 0x068, 1203, {{
H,
H,
H}});
239(
"fast_data_access_protection", 0x06C, 1207, {{
H,
H,
H}});
243(
"instruction_break", 0x076, 610, {{
H,
H,
H}});
247(
"cpu_mondo", 0x07C, 1608, {{P, P,
SH}});
251(
"dev_mondo", 0x07D, 1611, {{P, P,
SH}});
255(
"resume_error", 0x07E, 3330, {{P, P,
SH}});
259(
"spill_n_normal", 0x080, 900, {{P, P,
H}});
263(
"spill_n_other", 0x0A0, 900, {{P, P,
H}});
267(
"fill_n_normal", 0x0C0, 900, {{P, P,
H}});
271(
"fill_n_other", 0x0E0, 900, {{P, P,
H}});
275(
"trap_instruction", 0x100, 1602, {{P, P,
H}});
346 bool priv = pstate.priv;
358 bool changedCWP =
true;
361 else if (0x80 <= tt && tt <= 0xbf)
362 CWP += (CANSAVE + 2);
363 else if (0xc0 <= tt && tt <= 0xff)
449 pstate.cle = pstate.tle;
454 bool changedCWP =
true;
457 else if (0x80 <= tt && tt <= 0xbf)
458 CWP += (CANSAVE + 2);
459 else if (0xc0 <= tt && tt <= 0xff)
474 const Addr RSTVAddr = 0xFFF0000000ULL;
475 PC = RSTVAddr | ((TT << 5) & 0xFF);
483 PC = (HTBA &
~mask(14)) | ((TT << 5) &
mask(14));
491 PC = (TBA &
~mask(15)) |
492 (TL > 1 ? (1 << 14) : 0) |
493 ((TT << 5) &
mask(14));
517 else if (pstate.priv)
524 if (hpstate.red || (
tl ==
MaxTL - 1)) {
531 panic(
"Should go to error state here.. crap\n");
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 alignedvaddr, partition_id, context_id,
687 if (!pte &&
p->fixupFault(
vaddr))
688 pte =
p->pTable->lookup(
vaddr);
689 panic_if(!pte,
"Tried to access unmapped address %#x.\n",
vaddr);
691 Addr alignedvaddr =
p->pTable->pageAlign(
vaddr);
705 int primary_context =
bits(tlbdata, 47, 32);
721 int is_real_address = !
bits(tlbdata, 5);
733 ASI asi =
static_cast<ASI>(reg_asi);
739 bool trapped =
bits(tlbdata, 18, 16) > 0;
743 int context_id = ((!
hpriv && !
red && is_real_address) ||
746 ? 0 : primary_context;
749 int const partition_id = 0;
761 alignedvaddr, partition_id, context_id,
virtual void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
void insertDtlbEntry(Addr vpn, int partition_id, int context_id, bool real, const PageTableEntry &PTE, int entry=-1)
void insertItlbEntry(Addr vpn, int partition_id, int context_id, bool real, const PageTableEntry &PTE, int entry=-1)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual void handleTrap(ThreadContext *tc, int trapNum)
virtual PrivilegeLevel getNextLevel(PrivilegeLevel current)=0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
virtual TrapType trapType()=0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual RegVal getReg(const RegId ®) const
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual System * getSystemPtr()=0
virtual const PCStateBase & pcState() const =0
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
virtual BaseMMU * getMMUPtr()=0
virtual Process * getProcessPtr()=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 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.
#define panic(...)
This implements a cprintf based panic() function.
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
@ MISCREG_HPSTATE
Hyper privileged registers.
@ MISCREG_ASI
Ancillary State Registers.
@ MISCREG_TPC
Privilged Registers.
void getREDVector(RegVal TT, Addr &PC, Addr &NPC)
void getHyperVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT)
GenericISA::DelaySlotUPCState< 4 > PCState
void doREDFault(ThreadContext *tc, TrapType tt)
This sets everything up for a RED state trap except for actually jumping to the handler.
void getPrivVector(ThreadContext *tc, Addr &PC, Addr &NPC, RegVal TT, RegVal TL)
void enterREDState(ThreadContext *tc)
This causes the thread context to enter RED state.
void doNormalFault(ThreadContext *tc, TrapType tt, bool gotoHpriv)
This sets everything up for a normal trap except for actually jumping to the handler.
SignedBitfield< 15, 8 > SH
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
RefCountingPtr< StaticInst > StaticInstPtr
Declarations of a non-full system Page Table.