arch-arm: adding register control flags enabling LSE implementation
authorJordi Vaquero <jordi.vaquero@metempsy.com>
Tue, 6 Aug 2019 13:49:14 +0000 (15:49 +0200)
committerJordi Vaquero <jordi.vaquero@metempsy.com>
Wed, 7 Aug 2019 14:30:51 +0000 (14:30 +0000)
Added changes on arch-arm architecture to accept Atomic instructions
following ARM v8.1 documentation. That includes enabling atomic bit
in ID registers and add have_lse variable into arm system.

Change-Id: Ic28d3215d74ff129142fb51cb2fa217d3b1482de
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19809
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/ArmSystem.py
src/arch/arm/isa.cc
src/arch/arm/isa.hh
src/arch/arm/system.cc
src/arch/arm/system.hh

index daf94a97e08c9d171cf75ad8bf3733014640e9c4..a92ae4fb70cc83fdbc58a72413b37009c7c5aefa 100644 (file)
@@ -86,6 +86,8 @@ class ArmSystem(System):
         "True if SVE is implemented (ARMv8)")
     sve_vl = Param.SveVectorLength(1,
         "SVE vector length in quadwords (128-bit)")
+    have_lse = Param.Bool(True,
+        "True if LSE is implemented (ARMv8.1)")
     have_pan = Param.Bool(True,
         "True if Priviledge Access Never is implemented (ARMv8.1)")
 
index 23738c6ae37cdd2712153cb538ba30686e2ec921..299698d3d6348c62690caa346cf6d1ce90e10956 100644 (file)
@@ -93,6 +93,7 @@ ISA::ISA(Params *p)
         haveSVE = system->haveSVE();
         havePAN = system->havePAN();
         sveVL = system->sveVL();
+        haveLSE = system->haveLSE();
     } else {
         highestELIs64 = true; // ArmSystem::highestELIs64 does the same
         haveSecurity = haveLPAE = haveVirtualization = false;
@@ -102,6 +103,7 @@ ISA::ISA(Params *p)
         haveSVE = true;
         havePAN = false;
         sveVL = p->sve_vl_se;
+        haveLSE = true;
     }
 
     // Initial rename mode depends on highestEL
@@ -393,6 +395,10 @@ ISA::initID64(const ArmISAParams *p)
     miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
         miscRegs[MISCREG_ID_AA64ISAR0_EL1], 19, 4,
         haveCrypto ? 0x1112 : 0x0);
+    // LSE
+    miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
+        miscRegs[MISCREG_ID_AA64ISAR0_EL1], 23, 20,
+        haveLSE ? 0x2 : 0x0);
     // PAN
     miscRegs[MISCREG_ID_AA64MMFR1_EL1] = insertBits(
         miscRegs[MISCREG_ID_AA64MMFR1_EL1], 23, 20,
index 63051cd8310a26dc897254e21611e316596e8066..5e337c2233f24769e34d5bbbe1810f75a0208b6b 100644 (file)
@@ -95,6 +95,7 @@ namespace ArmISA
         bool haveGICv3CPUInterface;
         uint8_t physAddrRange;
         bool haveSVE;
+        bool haveLSE;
         bool havePAN;
 
         /** SVE vector length in quadwords */
@@ -687,6 +688,7 @@ namespace ArmISA
             SERIALIZE_SCALAR(physAddrRange);
             SERIALIZE_SCALAR(haveSVE);
             SERIALIZE_SCALAR(sveVL);
+            SERIALIZE_SCALAR(haveLSE);
             SERIALIZE_SCALAR(havePAN);
         }
         void unserialize(CheckpointIn &cp)
@@ -704,6 +706,7 @@ namespace ArmISA
             UNSERIALIZE_SCALAR(physAddrRange);
             UNSERIALIZE_SCALAR(haveSVE);
             UNSERIALIZE_SCALAR(sveVL);
+            UNSERIALIZE_SCALAR(haveLSE);
             UNSERIALIZE_SCALAR(havePAN);
         }
 
index 874e3b0212a8a770307e984b81a1ecba51fdb34a..4ea0d1a91253eb7eab1ed9c8f88091decde7754e 100644 (file)
@@ -73,6 +73,7 @@ ArmSystem::ArmSystem(Params *p)
       _haveLargeAsid64(p->have_large_asid_64),
       _haveSVE(p->have_sve),
       _sveVL(p->sve_vl),
+      _haveLSE(p->have_lse),
       _havePAN(p->have_pan),
       _m5opRange(p->m5ops_base ?
                  RangeSize(p->m5ops_base, 0x10000) :
index e09f4770608f9ba710d29a1782b9d8807539f846..46c58e8a16869ad1c10a969e177b499d78980b54 100644 (file)
@@ -130,6 +130,11 @@ class ArmSystem : public System
     /** SVE vector length at reset, in quadwords */
     const unsigned _sveVL;
 
+    /**
+     * True if LSE is implemented (ARMv8.1)
+     */
+    const bool _haveLSE;
+
     /** True if Priviledge Access Never is implemented */
     const unsigned _havePAN;
 
@@ -244,6 +249,9 @@ class ArmSystem : public System
     /** Returns the SVE vector length at reset, in quadwords */
     unsigned sveVL() const { return _sveVL; }
 
+    /** Returns true if LSE is implemented (ARMv8.1) */
+    bool haveLSE() const { return _haveLSE; }
+
     /** Returns true if Priviledge Access Never is implemented */
     bool havePAN() const { return _havePAN; }