Giacomo Travaglini has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/70469?usp=email )

Change subject: arch-arm: Remove ISA::initID64
......................................................................

arch-arm: Remove ISA::initID64

Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Change-Id: I3d03ee15df46fa7d9a9ec439b26e99baf33cbb5e
Reviewed-by: Richard Cooper <richard.coo...@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70469
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/arm/isa.cc
M src/arch/arm/isa.hh
M src/arch/arm/regs/misc.cc
3 files changed, 123 insertions(+), 125 deletions(-)

Approvals:
  Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc
index b1e463a..d87e9c5 100644
--- a/src/arch/arm/isa.cc
+++ b/src/arch/arm/isa.cc
@@ -142,12 +142,6 @@
         miscRegs[idx] = lookUpMiscReg[idx].reset();
     }

-    // We always initialize AArch64 ID registers even
-    // if we are in AArch32. This is done since if we
-    // are in SE mode we don't know if our ArmProcess is
-    // AArch32 or AArch64
-    initID64(p);
-
     if (FullSystem && system->highestELIs64()) {
         // Initialize AArch64 state
         clear64(p);
@@ -256,124 +250,6 @@
 }

 void
-ISA::initID64(const ArmISAParams &p)
-{
-    // Initialize configurable id registers
-    miscRegs[MISCREG_ID_AA64AFR0_EL1] = p.id_aa64afr0_el1;
-    miscRegs[MISCREG_ID_AA64AFR1_EL1] = p.id_aa64afr1_el1;
-
-    AA64DFR0 dfr0_el1 = p.id_aa64dfr0_el1;
-    dfr0_el1.pmuver = p.pmu ? 1 : 0; // Enable PMUv3
-    miscRegs[MISCREG_ID_AA64DFR0_EL1] = dfr0_el1;
-
-    miscRegs[MISCREG_ID_AA64DFR1_EL1] = p.id_aa64dfr1_el1;
-
-    // SVE
-    miscRegs[MISCREG_ID_AA64ZFR0_EL1] = 0;  // SVEver 0
-    if (release->has(ArmExtension::SECURITY)) {
-        miscRegs[MISCREG_ZCR_EL3] = sveVL - 1;
-    } else if (release->has(ArmExtension::VIRTUALIZATION)) {
-        miscRegs[MISCREG_ZCR_EL2] = sveVL - 1;
-    } else {
-        miscRegs[MISCREG_ZCR_EL1] = sveVL - 1;
-    }
-
-    // SME
-
-    // Set up the SME SMIDR
-    // [63:32] RES0
-    // [31:24] Implementer - default this to Arm Limited
-    // [23:16] SMCU Revision - set to 0 as we don't model an SMCU
-    // [15]    SMPS - We don't do priorities in gem5, so disable
-    // [14:12] RES0
-    // [11:0]  Affinity - we implement per-CPU SME, so set to 0 (no SMCU)
-    SMIDR smidr_el1 = 0;
-    smidr_el1.affinity = 0;
-    smidr_el1.smps = 0;
-    smidr_el1.implementer = 0x41;
-    miscRegs[MISCREG_SMIDR_EL1] = smidr_el1;
-
-    AA64SMFR0 smfr0_el1 = 0;
-    smfr0_el1.f32f32 = 0x1;
-    // The following BF16F32 is actually not implemented due to a lack
-    // of BF16 support in gem5's fplib. However, as per the SME spec the
-    // _only_ allowed value is 0x1.
-    smfr0_el1.b16f32 = 0x1;
-    smfr0_el1.f16f32 = 0x1;
-    smfr0_el1.i8i32 = 0xF;
-    smfr0_el1.f64f64 = 0x1;
-    smfr0_el1.i16i64 = 0xF;
-    smfr0_el1.smEver = 0;
-    smfr0_el1.fa64 = 0x1;
-    miscRegs[MISCREG_ID_AA64SMFR0_EL1] = smfr0_el1;
-
-    // We want to support FEAT_SME_FA64. Therefore, we enable it in all
-    // SMCR_ELx registers by default. Runtime software might change this
-    // later, but given that gem5 doesn't disable instructions based on
-    // this flag we default to the most representative value.
-    miscRegs[MISCREG_SMCR_EL3] = 0x1 << 31;
-    miscRegs[MISCREG_SMCR_EL2] = 0x1 << 31;
-    miscRegs[MISCREG_SMCR_EL1] = 0x1 << 31;
-
-    // Set the vector default vector length
-    if (release->has(ArmExtension::SECURITY)) {
-        miscRegs[MISCREG_SMCR_EL3] |= ((smeVL - 1) & 0xF);
-    } else if (release->has(ArmExtension::VIRTUALIZATION)) {
-        miscRegs[MISCREG_SMCR_EL2] |= ((smeVL - 1) & 0xF);
-    } else {
-        miscRegs[MISCREG_SMCR_EL1] |= ((smeVL - 1) & 0xF);
-    }
-
-    AA64PFR0 pfr0_el1 = 0;
-    pfr0_el1.el3 = release->has(ArmExtension::SECURITY) ? 0x2 : 0x0;
-    pfr0_el1.el2 = release->has(ArmExtension::VIRTUALIZATION) ? 0x2 : 0x0;
-    pfr0_el1.sve = release->has(ArmExtension::FEAT_SVE) ? 0x1 : 0x0;
-    pfr0_el1.sel2 = release->has(ArmExtension::FEAT_SEL2) ? 0x1 : 0x0;
-    miscRegs[MISCREG_ID_AA64PFR0_EL1] = pfr0_el1;
-
-    AA64MMFR0 mmfr0_el1 = p.id_aa64mmfr0_el1;
-    mmfr0_el1.asidbits = haveLargeAsid64 ? 0x2 : 0x0;
-    mmfr0_el1.parange = encodePhysAddrRange64(physAddrRange);
-    miscRegs[MISCREG_ID_AA64MMFR0_EL1] = mmfr0_el1;
-
-    AA64ISAR0 isar0_el1 = p.id_aa64isar0_el1;
-    if (release->has(ArmExtension::CRYPTO)) {
-        isar0_el1.crc32 = 1;
-        isar0_el1.sha2 = 1;
-        isar0_el1.sha1 = 1;
-        isar0_el1.aes = 2;
-    } else {
-        isar0_el1.crc32 = 0;
-        isar0_el1.sha2 = 0;
-        isar0_el1.sha1 = 0;
-        isar0_el1.aes = 0;
-    }
-    isar0_el1.atomic = release->has(ArmExtension::FEAT_LSE) ? 0x2 : 0x0;
-    isar0_el1.rdm = release->has(ArmExtension::FEAT_RDM) ? 0x1 : 0x0;
-    isar0_el1.tme = release->has(ArmExtension::TME) ? 0x1 : 0x0;
-    miscRegs[MISCREG_ID_AA64ISAR0_EL1] = isar0_el1;
-
-    AA64ISAR1 isar1_el1 = p.id_aa64isar1_el1;
-    isar1_el1.apa = release->has(ArmExtension::FEAT_PAuth) ? 0x1 : 0x0;
-    isar1_el1.jscvt = release->has(ArmExtension::FEAT_JSCVT) ? 0x1 : 0x0;
-    isar1_el1.fcma = release->has(ArmExtension::FEAT_FCMA) ? 0x1 : 0x0;
-    isar1_el1.gpa = release->has(ArmExtension::FEAT_PAuth) ? 0x1 : 0x0;
-    miscRegs[MISCREG_ID_AA64ISAR1_EL1] = isar1_el1;
-
-    AA64MMFR1 mmfr1_el1 = p.id_aa64mmfr1_el1;
- mmfr1_el1.vmidbits = release->has(ArmExtension::FEAT_VMID16) ? 0x2 : 0x0;
-    mmfr1_el1.vh = release->has(ArmExtension::FEAT_VHE) ? 0x1 : 0x0;
-    mmfr1_el1.hpds = release->has(ArmExtension::FEAT_HPDS) ? 0x1 : 0x0;
-    mmfr1_el1.pan = release->has(ArmExtension::FEAT_PAN) ? 0x1 : 0x0;
-    miscRegs[MISCREG_ID_AA64MMFR1_EL1] = mmfr1_el1;
-
-    AA64MMFR2 mmfr2_el1 = p.id_aa64mmfr2_el1;
-    mmfr2_el1.uao = release->has(ArmExtension::FEAT_UAO) ? 0x1 : 0x0;
-    mmfr2_el1.varange = release->has(ArmExtension::FEAT_LVA) ? 0x1 : 0x0;
-    miscRegs[MISCREG_ID_AA64MMFR2_EL1] = mmfr2_el1;
-}
-
-void
 ISA::startup()
 {
     BaseISA::startup();
diff --git a/src/arch/arm/isa.hh b/src/arch/arm/isa.hh
index 8419641..55fbd03 100644
--- a/src/arch/arm/isa.hh
+++ b/src/arch/arm/isa.hh
@@ -172,7 +172,6 @@
       protected:
         void clear32(const ArmISAParams &p);
         void clear64(const ArmISAParams &p);
-        void initID64(const ArmISAParams &p);

         void addressTranslation(MMU::ArmTranslationType tran_type,
             BaseMMU::Mode mode, Request::Flags flags, RegVal val);
diff --git a/src/arch/arm/regs/misc.cc b/src/arch/arm/regs/misc.cc
index 7cff4ca..ef5d741 100644
--- a/src/arch/arm/regs/misc.cc
+++ b/src/arch/arm/regs/misc.cc
@@ -3692,36 +3692,101 @@
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64PFR0_EL1)
+      .reset([this,release=release,tc=tc](){
+          AA64PFR0 pfr0_el1 = 0;
+          pfr0_el1.el0 = 0x2;
+          pfr0_el1.el1 = 0x2;
+ pfr0_el1.el2 = release->has(ArmExtension::VIRTUALIZATION) ? 0x2 : 0x0;
+          pfr0_el1.el3 = release->has(ArmExtension::SECURITY) ? 0x2 : 0x0;
+          pfr0_el1.sve = release->has(ArmExtension::FEAT_SVE) ? 0x1 : 0x0;
+ pfr0_el1.sel2 = release->has(ArmExtension::FEAT_SEL2) ? 0x1 : 0x0;
+          pfr0_el1.gic = FullSystem && getGICv3CPUInterface(tc) ? 0x1 : 0;
+          return pfr0_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64PFR1_EL1)
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64DFR0_EL1)
+      .reset([p](){
+          AA64DFR0 dfr0_el1 = p.id_aa64dfr0_el1;
+          dfr0_el1.pmuver = p.pmu ? 1 : 0; // Enable PMUv3
+          return dfr0_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64DFR1_EL1)
+      .reset(p.id_aa64dfr1_el1)
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64AFR0_EL1)
+      .reset(p.id_aa64afr0_el1)
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64AFR1_EL1)
+      .reset(p.id_aa64afr1_el1)
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64ISAR0_EL1)
+      .reset([p,release=release](){
+          AA64ISAR0 isar0_el1 = p.id_aa64isar0_el1;
+          if (release->has(ArmExtension::CRYPTO)) {
+              isar0_el1.crc32 = 1;
+              isar0_el1.sha2 = 1;
+              isar0_el1.sha1 = 1;
+              isar0_el1.aes = 2;
+          } else {
+              isar0_el1.crc32 = 0;
+              isar0_el1.sha2 = 0;
+              isar0_el1.sha1 = 0;
+              isar0_el1.aes = 0;
+          }
+ isar0_el1.atomic = release->has(ArmExtension::FEAT_LSE) ? 0x2 : 0x0;
+          isar0_el1.rdm = release->has(ArmExtension::FEAT_RDM) ? 0x1 : 0x0;
+          isar0_el1.tme = release->has(ArmExtension::TME) ? 0x1 : 0x0;
+          return isar0_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64ISAR1_EL1)
+      .reset([p,release=release](){
+          AA64ISAR1 isar1_el1 = p.id_aa64isar1_el1;
+ isar1_el1.apa = release->has(ArmExtension::FEAT_PAuth) ? 0x1 : 0x0; + isar1_el1.jscvt = release->has(ArmExtension::FEAT_JSCVT) ? 0x1 : 0x0; + isar1_el1.fcma = release->has(ArmExtension::FEAT_FCMA) ? 0x1 : 0x0; + isar1_el1.gpa = release->has(ArmExtension::FEAT_PAuth) ? 0x1 : 0x0;
+          return isar1_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64MMFR0_EL1)
+      .reset([p,asidbits=haveLargeAsid64,parange=physAddrRange](){
+          AA64MMFR0 mmfr0_el1 = p.id_aa64mmfr0_el1;
+          mmfr0_el1.asidbits = asidbits ? 0x2 : 0x0;
+          mmfr0_el1.parange = encodePhysAddrRange64(parange);
+          return mmfr0_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64MMFR1_EL1)
+      .reset([p,release=release](){
+          AA64MMFR1 mmfr1_el1 = p.id_aa64mmfr1_el1;
+ mmfr1_el1.vmidbits = release->has(ArmExtension::FEAT_VMID16) ? 0x2 : 0x0;
+          mmfr1_el1.vh = release->has(ArmExtension::FEAT_VHE) ? 0x1 : 0x0;
+ mmfr1_el1.hpds = release->has(ArmExtension::FEAT_HPDS) ? 0x1 : 0x0;
+          mmfr1_el1.pan = release->has(ArmExtension::FEAT_PAN) ? 0x1 : 0x0;
+          return mmfr1_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ID_AA64MMFR2_EL1)
+      .reset([p,release=release](){
+          AA64MMFR2 mmfr2_el1 = p.id_aa64mmfr2_el1;
+          mmfr2_el1.uao = release->has(ArmExtension::FEAT_UAO) ? 0x1 : 0x0;
+ mmfr2_el1.varange = release->has(ArmExtension::FEAT_LVA) ? 0x1 : 0x0;
+          return mmfr2_el1;
+      }())
       .faultRead(EL1, HCR_TRAP(tid3))
       .allPrivileges().exceptUserMode().writes(0);

@@ -5033,9 +5098,11 @@
         .faultRead(EL1, HCR_TRAP(tid3))
         .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_ZCR_EL3)
+        .reset(sveVL - 1)
         .fault(EL3, faultZcrEL3)
         .mon();
     InitReg(MISCREG_ZCR_EL2)
+        .reset(sveVL - 1)
         .fault(EL2, faultZcrEL2)
         .fault(EL3, faultZcrEL3)
         .hyp().mon();
@@ -5044,6 +5111,7 @@
         .fault(EL3, defaultFaultE2H_EL3)
         .mapsTo(MISCREG_ZCR_EL1);
     InitReg(MISCREG_ZCR_EL1)
+        .reset(sveVL - 1)
         .fault(EL1, faultZcrEL1)
         .fault(EL2, faultZcrEL2)
         .fault(EL3, faultZcrEL3)
@@ -5051,22 +5119,77 @@

     // SME
     InitReg(MISCREG_ID_AA64SMFR0_EL1)
+        .reset([](){
+            AA64SMFR0 smfr0_el1 = 0;
+            smfr0_el1.f32f32 = 0x1;
+            // The following BF16F32 is actually not implemented due to a
+            // lack of BF16 support in gem5's fplib. However, as per the
+            // SME spec the _only_ allowed value is 0x1.
+            smfr0_el1.b16f32 = 0x1;
+            smfr0_el1.f16f32 = 0x1;
+            smfr0_el1.i8i32 = 0xF;
+            smfr0_el1.f64f64 = 0x1;
+            smfr0_el1.i16i64 = 0xF;
+            smfr0_el1.smEver = 0;
+            smfr0_el1.fa64 = 0x1;
+            return smfr0_el1;
+        }())
         .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_SVCR)
         .allPrivileges();
     InitReg(MISCREG_SMIDR_EL1)
+        .reset([](){
+            SMIDR smidr_el1 = 0;
+            smidr_el1.affinity = 0;
+            smidr_el1.smps = 0;
+            smidr_el1.implementer = 0x41;
+            return smidr_el1;
+        }())
         .allPrivileges().exceptUserMode().writes(0);
     InitReg(MISCREG_SMPRI_EL1)
         .allPrivileges().exceptUserMode().reads(1);
     InitReg(MISCREG_SMPRIMAP_EL2)
         .hyp().mon();
     InitReg(MISCREG_SMCR_EL3)
+        .reset([this](){
+            // We want to support FEAT_SME_FA64. Therefore, we enable it in
+            // all SMCR_ELx registers by default. Runtime software might
+            // change this later, but given that gem5 doesn't disable
+            // instructions based on this flag we default to the most
+            // representative value.
+            SMCR smcr_el3 = 0;
+            smcr_el3.fa64 = 1;
+            smcr_el3.len = smeVL - 1;
+            return smcr_el3;
+        }())
         .mon();
     InitReg(MISCREG_SMCR_EL2)
+        .reset([this](){
+            // We want to support FEAT_SME_FA64. Therefore, we enable it in
+            // all SMCR_ELx registers by default. Runtime software might
+            // change this later, but given that gem5 doesn't disable
+            // instructions based on this flag we default to the most
+            // representative value.
+            SMCR smcr_el2 = 0;
+            smcr_el2.fa64 = 1;
+            smcr_el2.len = smeVL - 1;
+            return smcr_el2;
+        }())
         .hyp().mon();
     InitReg(MISCREG_SMCR_EL12)
         .allPrivileges().exceptUserMode();
     InitReg(MISCREG_SMCR_EL1)
+        .reset([this](){
+            // We want to support FEAT_SME_FA64. Therefore, we enable it in
+            // all SMCR_ELx registers by default. Runtime software might
+            // change this later, but given that gem5 doesn't disable
+            // instructions based on this flag we default to the most
+            // representative value.
+            SMCR smcr_el1 = 0;
+            smcr_el1.fa64 = 1;
+            smcr_el1.len = smeVL - 1;
+            return smcr_el1;
+        }())
         .allPrivileges().exceptUserMode();
     InitReg(MISCREG_TPIDR2_EL0)
         .allPrivileges();

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

Gerrit-MessageType: merged
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I3d03ee15df46fa7d9a9ec439b26e99baf33cbb5e
Gerrit-Change-Number: 70469
Gerrit-PatchSet: 3
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: Richard Cooper <richard.coo...@arm.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to