arch-arm: Add a method to determine External Abort.

- Add `isExternalAbort()` in `AbortFault<T>` 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
This commit is contained in:
Junshi Wang
2024-09-07 20:48:49 +08:00
committed by Giacomo Travaglini
parent 9a7a661c66
commit a4bacb9823
2 changed files with 14 additions and 0 deletions

View File

@@ -1225,6 +1225,17 @@ AbortFault<T>::isMMUFault() const
(source < ArmFault::PermissionLL + 4));
}
template<class T>
bool
AbortFault<T>::isExternalAbort() const
{
return
(source == ArmFault::SynchronousExternalAbort) ||
(source == ArmFault::AsynchronousExternalAbort) ||
((source >= ArmFault::SynchExtAbtOnTranslTableWalkLL) &&
(source < ArmFault::SynchExtAbtOnTranslTableWalkLL + 4));
}
template<class T>
bool
AbortFault<T>::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

View File

@@ -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<typename T>
@@ -511,6 +512,7 @@ class AbortFault : public ArmFaultVals<T>
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<PrefetchAbort>