From a4bacb9823e8b7ee051dfdcbaff94ee9cbd1a4e9 Mon Sep 17 00:00:00 2001 From: Junshi Wang Date: Sat, 7 Sep 2024 20:48:49 +0800 Subject: [PATCH] arch-arm: Add a method to determine External Abort. - Add `isExternalAbort()` in `AbortFault` to determine external abort. - Add `virtual isExternalAbort()` in `ArmFault` so the method can be used in base class. - Set iss.ea by `isExternalAbort()`. Change-Id: I01c22dc46958ab424b389af96d3c3b6243cbc671 --- src/arch/arm/faults.cc | 12 ++++++++++++ src/arch/arm/faults.hh | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/arch/arm/faults.cc b/src/arch/arm/faults.cc index 12ab132072..b612516fcc 100644 --- a/src/arch/arm/faults.cc +++ b/src/arch/arm/faults.cc @@ -1225,6 +1225,17 @@ AbortFault::isMMUFault() const (source < ArmFault::PermissionLL + 4)); } +template +bool +AbortFault::isExternalAbort() const +{ + return + (source == ArmFault::SynchronousExternalAbort) || + (source == ArmFault::AsynchronousExternalAbort) || + ((source >= ArmFault::SynchExtAbtOnTranslTableWalkLL) && + (source < ArmFault::SynchExtAbtOnTranslTableWalkLL + 4)); +} + template bool AbortFault::getFaultVAddr(Addr &va) const @@ -1368,6 +1379,7 @@ DataAbort::iss() const iss.wnr = write; iss.s1ptw = s1ptw; iss.cm = cm; + iss.ea = isExternalAbort(); // ISS is valid if not caused by a stage 1 page table walk, and when taken // to AArch64 only when directed to EL2 diff --git a/src/arch/arm/faults.hh b/src/arch/arm/faults.hh index ac100208a3..a76439574a 100644 --- a/src/arch/arm/faults.hh +++ b/src/arch/arm/faults.hh @@ -254,6 +254,7 @@ class ArmFault : public FaultBase virtual void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg); virtual bool getFaultVAddr(Addr &va) const { return false; } OperatingMode getToMode() const { return toMode; } + virtual bool isExternalAbort() const { return false; } }; template @@ -511,6 +512,7 @@ class AbortFault : public ArmFaultVals void annotate(ArmFault::AnnotationIDs id, uint64_t val) override; void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg) override; bool isMMUFault() const; + bool isExternalAbort() const override; }; class PrefetchAbort : public AbortFault