Giacomo Travaglini has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/57489 )

Change subject: arch-arm: Define ESR.ISS field as a SubBitUnion
......................................................................

arch-arm: Define ESR.ISS field as a SubBitUnion

This will make it easier for an ArmFault to setup the ISS
field of the syndrome register

Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Change-Id: I970dfea474f2de0a696bef27712bc42daed9f1a0
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/57489
Reviewed-by: Jason Lowe-Power <power...@gmail.com>
Maintainer: Jason Lowe-Power <power...@gmail.com>
Reviewed-by: Andreas Sandberg <andreas.sandb...@arm.com>
Maintainer: Andreas Sandberg <andreas.sandb...@arm.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/arm/faults.cc
M src/arch/arm/faults.hh
M src/arch/arm/regs/misc_types.hh
3 files changed, 126 insertions(+), 62 deletions(-)

Approvals:
Jason Lowe-Power: Looks good to me, but someone else must approve; Looks good to me, approved
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/arch/arm/faults.cc b/src/arch/arm/faults.cc
index ba5bcc9..4e3d10d 100644
--- a/src/arch/arm/faults.cc
+++ b/src/arch/arm/faults.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012-2014, 2016-2019 ARM Limited
+ * Copyright (c) 2010, 2012-2014, 2016-2019, 2022 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -397,42 +397,41 @@
 void
 ArmFault::setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg)
 {
-    uint32_t value;
+    ESR esr = 0;
     uint32_t exc_class = (uint32_t) ec(tc);
-    uint32_t issVal = iss();
+    uint32_t iss_val = iss();

     assert(!from64 || ArmSystem::highestELIs64(tc));

-    value = exc_class << 26;
+    esr.ec = exc_class;

// HSR.IL not valid for Prefetch Aborts (0x20, 0x21) and Data Aborts (0x24,
     // 0x25) for which the ISS information is not valid (ARMv7).
     // @todo: ARMv8 revises AArch32 functionality: when HSR.IL is not
     // valid it is treated as RES1.
     if (to64) {
-        value |= 1 << 25;
+        esr.il = 1;
     } else if ((bits(exc_class, 5, 3) != 4) ||
-               (bits(exc_class, 2) && bits(issVal, 24))) {
+               (bits(exc_class, 2) && bits(iss_val, 24))) {
         if (!machInst.thumb || machInst.bigThumb)
-            value |= 1 << 25;
+            esr.il = 1;
     }
     // Condition code valid for EC[5:4] nonzero
     if (!from64 && ((bits(exc_class, 5, 4) == 0) &&
                     (bits(exc_class, 3, 0) != 0))) {
+
         if (!machInst.thumb) {
-            uint32_t      cond;
- ConditionCode condCode = (ConditionCode) (uint32_t) machInst.condCode; + ConditionCode cond_code = (ConditionCode) (uint32_t) machInst.condCode; // If its on unconditional instruction report with a cond code of
             // 0xE, ie the unconditional code
-            cond  = (condCode == COND_UC) ? COND_AL : condCode;
-            value |= cond << 20;
-            value |= 1    << 24;
+            esr.cond_iss.cv = 1;
+ esr.cond_iss.cond = (cond_code == COND_UC) ? COND_AL : cond_code;
         }
-        value |= bits(issVal, 19, 0);
+        esr.cond_iss.iss = bits(iss_val, 19, 0);
     } else {
-        value |= issVal;
+        esr.iss = iss_val;
     }
-    tc->setMiscReg(syndrome_reg, value);
+    tc->setMiscReg(syndrome_reg, esr);
 }

 void
@@ -1250,18 +1249,6 @@
 }

 template<class T>
-uint32_t
-AbortFault<T>::iss() const
-{
-    uint32_t val;
-
-    val  = srcEncoded & 0x3F;
-    val |= write << 6;
-    val |= s1ptw << 7;
-    return (val);
-}
-
-template<class T>
 bool
 AbortFault<T>::isMMUFault() const
 {
@@ -1311,6 +1298,18 @@
     }
 }

+uint32_t
+PrefetchAbort::iss() const
+{
+    ESR esr = 0;
+    auto& iss = esr.instruction_abort_iss;
+
+    iss.ifsc = srcEncoded & 0x3F;
+    iss.s1ptw = s1ptw;
+
+    return iss;
+}
+
 bool
 PrefetchAbort::routeToMonitor(ThreadContext *tc) const
 {
@@ -1406,28 +1405,29 @@
 uint32_t
 DataAbort::iss() const
 {
-    uint32_t val;
+    ESR esr = 0;
+    auto& iss = esr.data_abort_iss;

-    // Add on the data abort specific fields to the generic abort ISS value
-    val  = AbortFault<DataAbort>::iss();
-
-    val |= cm << 8;
+    iss.dfsc = srcEncoded & 0x3F;
+    iss.wnr = write;
+    iss.s1ptw = s1ptw;
+    iss.cm = cm;

// 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)) {
-        val |= isv << 24;
+        iss.isv = isv;
         if (isv) {
-            val |= sas << 22;
-            val |= sse << 21;
-            val |= srt << 16;
+            iss.sas = sas;
+            iss.sse = sse;
+            iss.srt = srt;
             // AArch64 only. These assignments are safe on AArch32 as well
             // because these vars are initialized to false
-            val |= sf << 15;
-            val |= ar << 14;
+            iss.sf = sf;
+            iss.ar = ar;
         }
     }
-    return (val);
+    return iss;
 }

 void
@@ -1692,14 +1692,11 @@
 uint32_t
 Watchpoint::iss() const
 {
-    uint32_t iss = 0x0022;
-// NV
-//    if (toEL == EL2)
-//        iss |= 0x02000;
-    if (cm)
-        iss |= 0x00100;
-    if (write)
-        iss |= 0x00040;
+    ESR esr = 0;
+    auto& iss = esr.watchpoint_iss;
+    iss.dfsc = 0b100010;
+    iss.cm = cm;
+    iss.wnr = write;
     return iss;
 }

@@ -1778,21 +1775,17 @@
 uint32_t
 SoftwareStepFault::iss() const
 {
-    uint32_t iss= 0x0022;
-    if (stepped) {
-        iss |= 0x1000000;
-    }
-
-    if (isldx) {
-        iss |= 0x40;
-    }
-
+    ESR esr = 0;
+    auto& iss = esr.software_step_iss;
+    iss.ifsc = 0b100010;
+    iss.isv = stepped;
+    iss.ex = isldx;
     return iss;
-
 }

 void
-ArmSev::invoke(ThreadContext *tc, const StaticInstPtr &inst) {
+ArmSev::invoke(ThreadContext *tc, const StaticInstPtr &inst)
+{
     DPRINTF(Faults, "Invoking ArmSev Fault\n");
     if (!FullSystem)
         return;
diff --git a/src/arch/arm/faults.hh b/src/arch/arm/faults.hh
index 688faad..906f704 100644
--- a/src/arch/arm/faults.hh
+++ b/src/arch/arm/faults.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012-2013, 2016-2019 ARM Limited
+ * Copyright (c) 2010, 2012-2013, 2016-2019, 2022 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -476,7 +476,6 @@
     FSR getFsr(ThreadContext *tc) const override;
     uint8_t getFaultStatusCode(ThreadContext *tc) const;
     bool abortDisable(ThreadContext *tc) override;
-    uint32_t iss() const override;
     bool isStage2() const override { return stage2; }
     void annotate(ArmFault::AnnotationIDs id, uint64_t val) override;
void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg) override;
@@ -501,6 +500,7 @@
     // @todo: external aborts should be routed if SCR.EA == 1
     bool routeToMonitor(ThreadContext *tc) const override;
     bool routeToHyp(ThreadContext *tc) const override;
+    uint32_t iss() const override;
     uint32_t vectorCatchFlag() const override { return 0x08000808; }
 };

diff --git a/src/arch/arm/regs/misc_types.hh b/src/arch/arm/regs/misc_types.hh
index 05b00e2..d44651c 100644
--- a/src/arch/arm/regs/misc_types.hh
+++ b/src/arch/arm/regs/misc_types.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2021 Arm Limited
+ * Copyright (c) 2010-2022 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -669,7 +669,59 @@
    BitUnion32(ESR)
         Bitfield<31, 26> ec;
         Bitfield<25> il;
-        Bitfield<15, 0> imm16;
+        Bitfield<24, 0> iss;
+
+        // Generic Condition ISS
+        // Used by exception syndromes holding the condition code of
+        // the trapped instruction. TODO: We should really have a
+        // different SubBitUnion per exception type and avoid
+        // such generic sub-fields
+        SubBitUnion(cond_iss, 24, 0)
+            Bitfield<24> cv;
+            Bitfield<23, 20> cond;
+            Bitfield<19, 0> iss;
+        EndSubBitUnion(cond_iss)
+
+        // Data Abort ISS
+        SubBitUnion(data_abort_iss, 24, 0)
+            Bitfield<24> isv;
+            Bitfield<23, 22> sas;
+            Bitfield<21> sse;
+            Bitfield<20, 16> srt;
+            Bitfield<15> sf;
+            Bitfield<14> ar;
+            Bitfield<13> vncr;
+            Bitfield<10> fnv;
+            Bitfield<9> ea;
+            Bitfield<8> cm;
+            Bitfield<7> s1ptw;
+            Bitfield<6> wnr;
+            Bitfield<5, 0> dfsc;
+        EndSubBitUnion(data_abort_iss)
+
+        // Instruction Abort ISS
+        SubBitUnion(instruction_abort_iss, 24, 0)
+            Bitfield<12, 11> set;
+            Bitfield<10> fnv;
+            Bitfield<9> ea;
+            Bitfield<7> s1ptw;
+            Bitfield<5, 0> ifsc;
+        EndSubBitUnion(instruction_abort_iss)
+
+        // Software Step ISS
+        SubBitUnion(software_step_iss, 24, 0)
+            Bitfield<24> isv;
+            Bitfield<6> ex;
+            Bitfield<5, 0> ifsc;
+        EndSubBitUnion(software_step_iss)
+
+        // Watchpoint ISS
+        SubBitUnion(watchpoint_iss, 24, 0)
+            Bitfield<13> vncr;
+            Bitfield<8> cm;
+            Bitfield<6> wnr;
+            Bitfield<5, 0> dfsc;
+        EndSubBitUnion(watchpoint_iss)
    EndBitUnion(ESR)

    BitUnion32(CPTR)

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/57489
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I970dfea474f2de0a696bef27712bc42daed9f1a0
Gerrit-Change-Number: 57489
Gerrit-PatchSet: 4
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to