diff options
Diffstat (limited to 'src/arch/arm')
-rw-r--r-- | src/arch/arm/faults.cc | 14 | ||||
-rw-r--r-- | src/arch/arm/faults.hh | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/arch/arm/faults.cc b/src/arch/arm/faults.cc index c36848ecf..1d6d01592 100644 --- a/src/arch/arm/faults.cc +++ b/src/arch/arm/faults.cc @@ -1432,6 +1432,20 @@ PCAlignmentFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) tc->setMiscReg(getFaultAddrReg64(), faultPC); } +bool +PCAlignmentFault::routeToHyp(ThreadContext *tc) const +{ + bool toHyp = false; + + SCR scr = tc->readMiscRegNoEffect(MISCREG_SCR_EL3); + HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2); + CPSR cpsr = tc->readMiscRegNoEffect(MISCREG_CPSR); + + // if HCR.TGE is set to 1, take to Hyp mode through Hyp Trap vector + toHyp |= !inSecureState(scr, cpsr) && hcr.tge && (cpsr.el == EL0); + return toHyp; +} + SPAlignmentFault::SPAlignmentFault() {} diff --git a/src/arch/arm/faults.hh b/src/arch/arm/faults.hh index d99116fb9..537405cf2 100644 --- a/src/arch/arm/faults.hh +++ b/src/arch/arm/faults.hh @@ -535,6 +535,7 @@ class PCAlignmentFault : public ArmFaultVals<PCAlignmentFault> {} void invoke(ThreadContext *tc, const StaticInstPtr &inst = StaticInst::nullStaticInstPtr) override; + bool routeToHyp(ThreadContext *tc) const override; }; /// Stack pointer alignment fault (AArch64 only) |