arch-arm: Set CM bit in DataAbort
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 12 Sep 2019 09:23:16 +0000 (10:23 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 3 Oct 2019 09:05:19 +0000 (09:05 +0000)
The CM bit in a DataAbort ISS indicates whether the Data Abort came from
a cache maintenance or address translation instruction.

Change-Id: I8888520446550581c8dd0507a8989935db7047be
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21305
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/faults.cc
src/arch/arm/faults.hh

index c5858c9aee6bcf7056e985fa21b813ae376c9328..b006d12ca62e301e9391b3ad1089ab196b9e4848 100644 (file)
@@ -1369,6 +1369,9 @@ DataAbort::iss() const
 
     // Add on the data abort specific fields to the generic abort ISS value
     val  = AbortFault<DataAbort>::iss();
+
+    val |= cm << 8;
+
     // ISS is valid if not caused by a stage 1 page table walk, and when taken
     // to AArch64 only when directed to EL2
     if (!s1ptw && stage2 && (!to64 || toEL == EL2)) {
@@ -1412,6 +1415,9 @@ DataAbort::annotate(AnnotationIDs id, uint64_t val)
         isv = true;
         ar  = val;
         break;
+      case CM:
+        cm  = val;
+        break;
       // Just ignore unknown ID's
       default:
         break;
index 5e68875f5979df76212137bce57047d66ddc4406..645a461fe59ab0db0edb8a25c9e09da8087b22c8 100644 (file)
@@ -136,6 +136,7 @@ class ArmFault : public FaultBase
         SAS,   // DataAbort: Syndrome Access Size
         SSE,   // DataAbort: Syndrome Sign Extend
         SRT,   // DataAbort: Syndrome Register Transfer
+        CM,    // DataAbort: Cache Maintenance/Address Translation Op
 
         // AArch64 only
         SF,    // DataAbort: width of the accessed register is SixtyFour
@@ -482,6 +483,7 @@ class DataAbort : public AbortFault<DataAbort>
     uint8_t sas;
     uint8_t sse;
     uint8_t srt;
+    uint8_t cm;
 
     // AArch64 only
     bool sf;
@@ -491,7 +493,7 @@ class DataAbort : public AbortFault<DataAbort>
               bool _stage2 = false, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) :
         AbortFault<DataAbort>(_addr, _write, _domain, _source, _stage2,
                               _tranMethod),
-        isv(false), sas (0), sse(0), srt(0), sf(false), ar(false)
+        isv(false), sas (0), sse(0), srt(0), cm(0), sf(false), ar(false)
     {}
 
     ExceptionClass ec(ThreadContext *tc) const override;