Giacomo Travaglini has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/55612 )

Change subject: dev-arm: Gicv3 implementation of the BaseGicRegisters interface
......................................................................

dev-arm: Gicv3 implementation of the BaseGicRegisters interface

Signed-off-by: Giacomo Travaglini <[email protected]>
Change-Id: Iba23604cc6f7d5a1de91c287b4546154fcb20535
---
M src/dev/arm/gic_v3.cc
M src/dev/arm/gic_v3.hh
M src/arch/arm/kvm/gic.cc
M src/arch/arm/kvm/gic.hh
M src/dev/arm/gic_v3_distributor.cc
M src/dev/arm/gic_v3_distributor.hh
M src/dev/arm/base_gic.hh
M src/dev/arm/gic_v2.hh
M src/dev/arm/gic_v3_redistributor.cc
M src/dev/arm/gic_v3_redistributor.hh
M src/dev/arm/gic_v3_cpu_interface.cc
M src/dev/arm/gic_v3_cpu_interface.hh
12 files changed, 261 insertions(+), 10 deletions(-)



diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc
index 058ee6b..abc92e5 100644
--- a/src/arch/arm/kvm/gic.cc
+++ b/src/arch/arm/kvm/gic.cc
@@ -137,6 +137,12 @@
 }

 uint32_t
+KvmKernelGic::readRedistributor(ContextID ctx, Addr daddr)
+{
+    panic("%s not supported by KvmKernelGic\n", __func__);
+}
+
+uint32_t
 KvmKernelGic::readCpu(ContextID ctx, Addr daddr)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
@@ -151,6 +157,12 @@
 }

 void
+KvmKernelGic::writeRedistributor(ContextID ctx, Addr daddr, uint32_t data)
+{
+    panic("%s not supported by KvmKernelGic\n", __func__);
+}
+
+void
 KvmKernelGic::writeCpu(ContextID ctx, Addr daddr, uint32_t data)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh
index 3c021a1..49edc8e 100644
--- a/src/arch/arm/kvm/gic.hh
+++ b/src/arch/arm/kvm/gic.hh
@@ -115,10 +115,13 @@

     /** BaseGicRegisters interface */
     uint32_t readDistributor(ContextID ctx, Addr daddr) override;
+    uint32_t readRedistributor(ContextID ctx, Addr daddr) override;
     uint32_t readCpu(ContextID ctx, Addr daddr) override;

     void writeDistributor(ContextID ctx, Addr daddr,
                           uint32_t data) override;
+    void writeRedistributor(ContextID ctx, Addr daddr,
+                            uint32_t data) override;
     void writeCpu(ContextID ctx, Addr daddr, uint32_t data) override;

     /* @} */
@@ -176,6 +179,20 @@
     KvmKernelGicV2(KvmVM &vm,
                    const MuxingKvmGicV2Params &params);

+    /** BaseGicRegisters interface */
+    RegVal
+    readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg) override
+    {
+        panic("%s not supported by KvmKernelGicV2\n", __func__);
+    }
+
+    void
+    writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg,
+             RegVal data) override
+    {
+        panic("%s not supported by KvmKernelGicV2\n", __func__);
+    }
+
   private:
     /** Address range for the CPU interfaces */
     const AddrRange cpuRange;
diff --git a/src/dev/arm/base_gic.hh b/src/dev/arm/base_gic.hh
index 63b8679..277b380 100644
--- a/src/dev/arm/base_gic.hh
+++ b/src/dev/arm/base_gic.hh
@@ -46,6 +46,7 @@
 #include <unordered_map>
 #include <vector>

+#include "arch/arm/regs/misc.hh"
 #include "arch/arm/system.hh"
 #include "dev/intpin.hh"
 #include "dev/io_device.hh"
@@ -73,11 +74,17 @@
 {
   public:
     virtual uint32_t readDistributor(ContextID ctx, Addr daddr) = 0;
+    virtual uint32_t readRedistributor(ContextID ctx, Addr daddr) = 0;
     virtual uint32_t readCpu(ContextID ctx, Addr daddr) = 0;
+ virtual RegVal readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg) = 0;

     virtual void writeDistributor(ContextID ctx, Addr daddr,
                                   uint32_t data) = 0;
+    virtual void writeRedistributor(ContextID ctx, Addr daddr,
+                                    uint32_t data) = 0;
     virtual void writeCpu(ContextID ctx, Addr daddr, uint32_t data) = 0;
+    virtual void writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg,
+                          RegVal data) = 0;
 };

 class BaseGic :  public PioDevice
diff --git a/src/dev/arm/gic_v2.hh b/src/dev/arm/gic_v2.hh
index 84694b6..21e34a5 100644
--- a/src/dev/arm/gic_v2.hh
+++ b/src/dev/arm/gic_v2.hh
@@ -526,12 +526,22 @@
     {
         return readDistributor(ctx, daddr, 4);
     }
+    uint32_t
+    readRedistributor(ContextID ctx, Addr daddr) override
+    {
+        panic("%s not supported by GicV2\n", __func__);
+    }

     /** Handle a read to the cpu portion of the GIC
      * @param pkt packet to respond to
      */
     Tick readCpu(PacketPtr pkt);
     uint32_t readCpu(ContextID ctx, Addr daddr) override;
+    RegVal
+    readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg) override
+    {
+        panic("%s not supported by GicV2\n", __func__);
+    }

     /** Handle a write to the distributor portion of the GIC
      * @param pkt packet to respond to
@@ -544,12 +554,22 @@
     {
         return writeDistributor(ctx, daddr, data, 4);
     }
+    void
+    writeRedistributor(ContextID ctx, Addr daddr, uint32_t data) override
+    {
+        panic("%s not supported by GicV2\n", __func__);
+    }

     /** Handle a write to the cpu portion of the GIC
      * @param pkt packet to respond to
      */
     Tick writeCpu(PacketPtr pkt);
     void writeCpu(ContextID ctx, Addr daddr, uint32_t data) override;
+    void
+ writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg, RegVal data) override
+    {
+        panic("%s not supported by GicV2\n", __func__);
+    }
 };

 } // namespace gem5
diff --git a/src/dev/arm/gic_v3.cc b/src/dev/arm/gic_v3.cc
index 223e86a..52459c2 100644
--- a/src/dev/arm/gic_v3.cc
+++ b/src/dev/arm/gic_v3.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2020 ARM Limited
+ * Copyright (c) 2019-2021 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -269,6 +269,87 @@
 }

 void
+Gicv3::copyRedistRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+                          ContextID ctx, Addr daddr)
+{
+    auto val = from->readRedistributor(ctx, daddr);
+    DPRINTF(GIC, "copy redist 0x%x 0x%08x\n", daddr, val);
+    to->writeRedistributor(ctx, daddr, val);
+}
+
+void
+Gicv3::copyCpuRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+                       ContextID ctx, ArmISA::MiscRegIndex misc_reg)
+{
+    auto val = from->readCpu(ctx, misc_reg);
+ DPRINTF(GIC, "copy cpu %s 0x%08x\n", ArmISA::miscRegName[misc_reg], val);
+    to->writeCpu(ctx, misc_reg, val);
+}
+
+void
+Gicv3::clearRedistRegister(BaseGicRegisters* to,
+                           ContextID ctx, Addr daddr)
+{
+    to->writeRedistributor(ctx, daddr, 0xFFFFFFFF);
+}
+
+void
+Gicv3::copyRedistRange(BaseGicRegisters* from, BaseGicRegisters* to,
+                       ContextID ctx, Addr daddr, size_t size)
+{
+    for (auto a = daddr; a < daddr + size; a += 4)
+        copyRedistRegister(from, to, ctx, a);
+}
+
+uint32_t
+Gicv3::readDistributor(ContextID ctx, Addr daddr)
+{
+    return distributor->read(daddr, 4, false);
+}
+
+uint32_t
+Gicv3::readRedistributor(ContextID ctx, Addr daddr)
+{
+    return redistributors[ctx]->read(daddr, 4, false);
+}
+
+RegVal
+Gicv3::readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg)
+{
+    return cpuInterfaces[ctx]->readMiscReg(misc_reg);
+}
+
+void
+Gicv3::writeDistributor(ContextID ctx, Addr daddr, uint32_t data)
+{
+    distributor->write(daddr, data, sizeof(data), false);
+}
+
+void
+Gicv3::writeRedistributor(ContextID ctx, Addr daddr, uint32_t data)
+{
+    redistributors[ctx]->write(daddr, data, sizeof(data), false);
+}
+
+void
+Gicv3::writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg, RegVal data)
+{
+    cpuInterfaces[ctx]->setMiscReg(misc_reg, data);
+}
+
+void
+Gicv3::copyGicState(BaseGicRegisters* from, BaseGicRegisters* to)
+{
+    distributor->copy(from, to);
+    for (auto& redistributor : redistributors) {
+        redistributor->copy(from, to);
+    }
+    for (auto& cpu_interface : cpuInterfaces) {
+        cpu_interface->copy(from, to);
+    }
+}
+
+void
 Gicv3::serialize(CheckpointOut & cp) const
 {
     distributor->serializeSection(cp, "distributor");
diff --git a/src/dev/arm/gic_v3.hh b/src/dev/arm/gic_v3.hh
index 963beff..ef06b1e 100644
--- a/src/dev/arm/gic_v3.hh
+++ b/src/dev/arm/gic_v3.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 ARM Limited
+ * Copyright (c) 2019, 2021 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -53,7 +53,7 @@
 class Gicv3Redistributor;
 class Gicv3Its;

-class Gicv3 : public BaseGic
+class Gicv3 : public BaseGic, public BaseGicRegisters
 {
   protected:
     friend class Gicv3CPUInterface;
@@ -128,14 +128,7 @@
     Tick write(PacketPtr pkt) override;
     bool supportsVersion(GicVersion version) override;

-    void
-    copyGicState(BaseGicRegisters* from, BaseGicRegisters* to) override
-    {
-        panic("copyGicState unimplemented for Gicv3\n");
-    }
-
   public:
-
     Gicv3(const Params &p);
     void deassertInt(uint32_t cpu, ArmISA::InterruptTypes int_type);
     void deassertAll(uint32_t cpu);
@@ -169,6 +162,38 @@
     getRedistributorByAddr(Addr address) const;

     void postInt(uint32_t cpu, ArmISA::InterruptTypes int_type);
+
+  protected: // GIC state transfer
+    void copyRedistRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+                            ContextID ctx, Addr daddr);
+    void copyCpuRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+                         ContextID ctx, ArmISA::MiscRegIndex misc_reg);
+    void clearRedistRegister(BaseGicRegisters* to,
+                             ContextID ctx, Addr daddr);
+    void copyRedistRange(BaseGicRegisters* from, BaseGicRegisters* to,
+                         ContextID ctx, Addr daddr, size_t size);
+
+  public: // BaseGicRegisters
+ void copyGicState(BaseGicRegisters* from, BaseGicRegisters* to) override;
+
+    uint32_t readDistributor(ContextID ctx, Addr daddr) override;
+    uint32_t readRedistributor(ContextID ctx, Addr daddr) override;
+    RegVal readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg) override;
+    uint32_t
+    readCpu(ContextID ctx, Addr daddr) override
+    {
+        panic("%s not supported by Gicv3\n", __func__);
+    }
+
+ void writeDistributor(ContextID ctx, Addr daddr, uint32_t data) override; + void writeRedistributor(ContextID ctx, Addr daddr, uint32_t data) override;
+    void writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg,
+                  RegVal data) override;
+    void
+    writeCpu(ContextID ctx, Addr daddr, uint32_t data) override
+    {
+        panic("%s not supported by Gicv3\n", __func__);
+    }
 };

 } // namespace gem5
diff --git a/src/dev/arm/gic_v3_cpu_interface.cc b/src/dev/arm/gic_v3_cpu_interface.cc
index 393adde..14b6e44 100644
--- a/src/dev/arm/gic_v3_cpu_interface.cc
+++ b/src/dev/arm/gic_v3_cpu_interface.cc
@@ -2593,6 +2593,28 @@
 }

 void
+Gicv3CPUInterface::copy(BaseGicRegisters *from, BaseGicRegisters *to)
+{
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_PMR_EL1);
+
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_AP1R0_EL1);
+    if (PRIORITY_BITS >= 6) {
+        gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_AP1R1_EL1);
+    }
+
+    if (PRIORITY_BITS >= 7) {
+        gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_AP1R2_EL1);
+        gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_AP1R3_EL1);
+    }
+
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_BPR1_EL1);
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_CTLR_EL1);
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_SRE_EL1);
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_IGRPEN0_EL1);
+    gic->copyCpuRegister(from, to, cpuId, MISCREG_ICC_IGRPEN1_EL1);
+}
+
+void
 Gicv3CPUInterface::serialize(CheckpointOut & cp) const
 {
     SERIALIZE_SCALAR(hppi.intid);
diff --git a/src/dev/arm/gic_v3_cpu_interface.hh b/src/dev/arm/gic_v3_cpu_interface.hh
index eb16602..47a44fa 100644
--- a/src/dev/arm/gic_v3_cpu_interface.hh
+++ b/src/dev/arm/gic_v3_cpu_interface.hh
@@ -360,6 +360,9 @@

     void init();

+  public:
+    void copy(BaseGicRegisters *from, BaseGicRegisters *to);
+
   public: // BaseISADevice
     RegVal readMiscReg(int misc_reg) override;
     void setMiscReg(int misc_reg, RegVal val) override;
diff --git a/src/dev/arm/gic_v3_distributor.cc b/src/dev/arm/gic_v3_distributor.cc
index aff6b94..e98ceda 100644
--- a/src/dev/arm/gic_v3_distributor.cc
+++ b/src/dev/arm/gic_v3_distributor.cc
@@ -1182,6 +1182,29 @@
 }

 void
+Gicv3Distributor::copy(BaseGicRegisters *from, BaseGicRegisters *to)
+{
+    const size_t size = itLines / 8;
+
+    gic->copyDistRegister(from, to, 0, GICD_CTLR);
+
+    gic->clearDistRange(to, GICD_ICENABLER.start(), size);
+    gic->clearDistRange(to, GICD_ICPENDR.start(), size);
+    gic->clearDistRange(to, GICD_ICACTIVER.start(), size);
+
+    gic->copyDistRange(from, to, GICD_IGROUPR.start(), size);
+    gic->copyDistRange(from, to, GICD_ISENABLER.start(), size);
+    gic->copyDistRange(from, to, GICD_ISPENDR.start(), size);
+    gic->copyDistRange(from, to, GICD_ISACTIVER.start(), size);
+    gic->copyDistRange(from, to, GICD_IPRIORITYR.start(), size);
+    gic->copyDistRange(from, to, GICD_ITARGETSR.start(), size);
+    gic->copyDistRange(from, to, GICD_ICFGR.start(), size);
+    gic->copyDistRange(from, to, GICD_IGRPMODR.start(), size);
+    gic->copyDistRange(from, to, GICD_NSACR.start(), size);
+    gic->copyDistRange(from, to, GICD_IROUTER.start(), size);
+}
+
+void
 Gicv3Distributor::serialize(CheckpointOut & cp) const
 {
     SERIALIZE_SCALAR(ARE);
diff --git a/src/dev/arm/gic_v3_distributor.hh b/src/dev/arm/gic_v3_distributor.hh
index 22c5ad7..fa89a77 100644
--- a/src/dev/arm/gic_v3_distributor.hh
+++ b/src/dev/arm/gic_v3_distributor.hh
@@ -272,6 +272,8 @@
     uint64_t read(Addr addr, size_t size, bool is_secure_access);
     void write(Addr addr, uint64_t data, size_t size,
                bool is_secure_access);
+
+    void copy(BaseGicRegisters *from, BaseGicRegisters *to);
 };

 } // namespace gem5
diff --git a/src/dev/arm/gic_v3_redistributor.cc b/src/dev/arm/gic_v3_redistributor.cc
index 0d8c7ff..a891b6c 100644
--- a/src/dev/arm/gic_v3_redistributor.cc
+++ b/src/dev/arm/gic_v3_redistributor.cc
@@ -1057,6 +1057,33 @@
 }

 void
+Gicv3Redistributor::copy(BaseGicRegisters *from, BaseGicRegisters *to)
+{
+    // SGI_Base regs
+    gic->copyRedistRegister(from, to, cpuId, GICR_CTLR);
+    gic->copyRedistRegister(from, to, cpuId, GICR_WAKER);
+
+    gic->clearRedistRegister(to, cpuId, GICR_ICENABLER0);
+    gic->clearRedistRegister(to, cpuId, GICR_ICPENDR0);
+    gic->clearRedistRegister(to, cpuId, GICR_ICACTIVER0);
+
+    gic->copyRedistRegister(from, to, cpuId, GICR_ISENABLER0);
+    gic->copyRedistRegister(from, to, cpuId, GICR_ISPENDR0);
+    gic->copyRedistRegister(from, to, cpuId, GICR_ISACTIVER0);
+    gic->copyRedistRegister(from, to, cpuId, GICR_ICFGR0);
+    gic->copyRedistRegister(from, to, cpuId, GICR_ICFGR1);
+    gic->copyRedistRegister(from, to, cpuId, GICR_IGRPMODR0);
+    gic->copyRedistRegister(from, to, cpuId, GICR_NSACR);
+
+    gic->copyRedistRange(from, to, cpuId,
+        GICR_IPRIORITYR.start(), GICR_IPRIORITYR.size());
+
+    // RD_Base regs
+    gic->copyRedistRegister(from, to, cpuId, GICR_PROPBASER);
+    gic->copyRedistRegister(from, to, cpuId, GICR_PENDBASER);
+}
+
+void
 Gicv3Redistributor::serialize(CheckpointOut & cp) const
 {
     SERIALIZE_SCALAR(peInLowPowerState);
diff --git a/src/dev/arm/gic_v3_redistributor.hh b/src/dev/arm/gic_v3_redistributor.hh
index 4d4bc99..d7778b5 100644
--- a/src/dev/arm/gic_v3_redistributor.hh
+++ b/src/dev/arm/gic_v3_redistributor.hh
@@ -260,6 +260,8 @@
     void sendPPInt(uint32_t int_id);
     void clearPPInt(uint32_t int_id);
void write(Addr addr, uint64_t data, size_t size, bool is_secure_access);
+
+    void copy(BaseGicRegisters *from, BaseGicRegisters *to);
 };

 } // namespace gem5

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/55612
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: Iba23604cc6f7d5a1de91c287b4546154fcb20535
Gerrit-Change-Number: 55612
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to