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

Change subject: arch-arm: Add a KvmKernelGicV3 model
......................................................................

arch-arm: Add a KvmKernelGicV3 model

JIRA: https://gem5.atlassian.net/browse/GEM5-1138

Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Change-Id: I7b0db0b8b436a6b2ca47444e4e1f8a2a20bd7c25
---
M src/arch/arm/kvm/KvmGic.py
M src/arch/arm/kvm/gic.cc
M src/arch/arm/kvm/gic.hh
M src/arch/arm/kvm/SConscript
4 files changed, 125 insertions(+), 3 deletions(-)



diff --git a/src/arch/arm/kvm/KvmGic.py b/src/arch/arm/kvm/KvmGic.py
index a192944..856befd 100644
--- a/src/arch/arm/kvm/KvmGic.py
+++ b/src/arch/arm/kvm/KvmGic.py
@@ -36,7 +36,7 @@
 from m5.params import *
 from m5.proxy import *

-from m5.objects.Gic import GicV2
+from m5.objects.Gic import GicV2, Gicv3

 class MuxingKvmGicV2(GicV2):
     type = 'MuxingKvmGicV2'
@@ -46,3 +46,12 @@

     simulate_gic = Param.Bool(False,
"Forcing the simulation to use the gem5 GIC instead of the host GIC")
+
+class MuxingKvmGicV3(Gicv3):
+    type = 'MuxingKvmGicV3'
+    cxx_header = "arch/arm/kvm/gic.hh"
+    cxx_class = 'gem5::MuxingKvmGic<gem5::GicV3Types>'
+    cxx_template_params = [ 'class Types' ]
+
+    simulate_gic = Param.Bool(False,
+ "Forcing the simulation to use the gem5 GIC instead of the host GIC")
diff --git a/src/arch/arm/kvm/SConscript b/src/arch/arm/kvm/SConscript
index d06501f..f25ee96 100644
--- a/src/arch/arm/kvm/SConscript
+++ b/src/arch/arm/kvm/SConscript
@@ -44,7 +44,7 @@
     Return()

 SimObject('KvmGic.py',
-    sim_objects=['MuxingKvmGicV2'], tags='arm isa')
+    sim_objects=['MuxingKvmGicV2', 'MuxingKvmGicV3'], tags='arm isa')
 Source('gic.cc', tags='arm isa')

SimObject('BaseArmKvmCPU.py', sim_objects=['BaseArmKvmCPU'], tags='arm isa')
diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc
index 33a3f61..230fead 100644
--- a/src/arch/arm/kvm/gic.cc
+++ b/src/arch/arm/kvm/gic.cc
@@ -40,6 +40,7 @@
 #include <linux/kvm.h>

 #include "arch/arm/kvm/base_cpu.hh"
+#include "arch/arm/regs/misc.hh"
 #include "debug/GIC.hh"
 #include "debug/Interrupt.hh"
 #include "params/MuxingKvmGicV2.hh"
@@ -183,6 +184,60 @@
         KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, p.cpu_addr);
 }

+#ifndef SZ_64K
+#define SZ_64K 0x00000040
+#endif
+
+KvmKernelGicV3::KvmKernelGicV3(KvmVM &_vm,
+                               const MuxingKvmGicV3Params &p)
+    : KvmKernelGic(_vm, KVM_DEV_TYPE_ARM_VGIC_V3, p.it_lines),
+      redistRange(RangeSize(p.redist_addr, KVM_VGIC_V3_REDIST_SIZE)),
+      distRange(RangeSize(p.dist_addr, KVM_VGIC_V3_DIST_SIZE))
+{
+    kdev.setAttr<uint64_t>(
+ KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_DIST, p.dist_addr);
+    kdev.setAttr<uint64_t>(
+ KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V3_ADDR_TYPE_REDIST, p.redist_addr);
+}
+
+void
+KvmKernelGicV3::startup()
+{
+    kdev.setAttr<uint64_t>(
+        KVM_DEV_ARM_VGIC_GRP_CTRL, KVM_DEV_ARM_VGIC_CTRL_INIT, 0);
+}
+
+uint32_t
+KvmKernelGicV3::readRedistributor(ContextID ctx, Addr daddr)
+{
+    auto vcpu = vm.contextIdToVCpuId(ctx);
+ return getGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_REDIST_REGS, vcpu, daddr);
+}
+
+RegVal
+KvmKernelGicV3::readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg)
+{
+    auto vcpu = vm.contextIdToVCpuId(ctx);
+    auto sys_reg = ArmISA::encodeAArch64SysReg(misc_reg).packed();
+ return getGicReg<RegVal>(KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS, vcpu, sys_reg);
+}
+
+void
+KvmKernelGicV3::writeRedistributor(ContextID ctx, Addr daddr, uint32_t data)
+{
+    auto vcpu = vm.contextIdToVCpuId(ctx);
+ setGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_REDIST_REGS, vcpu, daddr, data);
+}
+
+void
+KvmKernelGicV3::writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg,
+                         RegVal data)
+{
+    auto vcpu = vm.contextIdToVCpuId(ctx);
+    auto sys_reg = ArmISA::encodeAArch64SysReg(misc_reg).packed();
+ setGicReg<RegVal>(KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS, vcpu, sys_reg, data);
+}
+
 template <class Types>
 MuxingKvmGic<Types>::MuxingKvmGic(const Params &p)
   : GuestGic(p),
@@ -202,8 +257,10 @@
 {
     GuestGic::startup();
     usingKvm = (kernelGic != nullptr) && system.validKvmEnvironment();
-    if (usingKvm)
+    if (usingKvm) {
+        kernelGic->startup();
         fromGicToKvm();
+    }
 }

 template <class Types>
@@ -331,5 +388,6 @@
 }

 template class MuxingKvmGic<GicV2Types>;
+template class MuxingKvmGic<GicV3Types>;

 } // namespace gem5
diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh
index 4ee048d..d082b2c 100644
--- a/src/arch/arm/kvm/gic.hh
+++ b/src/arch/arm/kvm/gic.hh
@@ -42,9 +42,11 @@
 #include "cpu/kvm/device.hh"
 #include "cpu/kvm/vm.hh"
 #include "dev/arm/gic_v2.hh"
+#include "dev/arm/gic_v3.hh"
 #include "dev/platform.hh"

 #include "params/MuxingKvmGicV2.hh"
+#include "params/MuxingKvmGicV3.hh"

 namespace gem5
 {
@@ -78,6 +80,8 @@
     KvmKernelGic &operator=(const KvmKernelGic &&rhs) = delete;
     KvmKernelGic &operator=(const KvmKernelGic &rhs) = delete;

+    virtual void startup() {}
+
   public:
     /**
      * @{
@@ -203,6 +207,38 @@

 };

+class KvmKernelGicV3 : public KvmKernelGic
+{
+  public:
+    /**
+     * Instantiate a KVM in-kernel GICv3 model.
+     *
+     * This constructor instantiates an in-kernel GICv3 model and wires
+     * it up to the virtual memory system.
+     *
+     * @param vm KVM VM representing this system
+     * @param params MuxingKvmGicV3 parameters
+     */
+    KvmKernelGicV3(KvmVM &vm,
+                   const MuxingKvmGicV3Params &params);
+
+    void startup() override;
+
+    /** BaseGicRegisters interface */
+    uint32_t readRedistributor(ContextID ctx, Addr daddr) override;
+    RegVal readCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg) override;
+
+    void writeRedistributor(ContextID ctx, Addr daddr,
+                            uint32_t data) override;
+    void writeCpu(ContextID ctx, ArmISA::MiscRegIndex misc_reg,
+                  RegVal data) override;
+  private:
+    /** Address range for the redistributor */
+    const AddrRange redistRange;
+    /** Address range for the distributor */
+    const AddrRange distRange;
+};
+
 struct GicV2Types
 {
     using GuestGic = GicV2;
@@ -210,6 +246,13 @@
     using Params = MuxingKvmGicV2Params;
 };

+struct GicV3Types
+{
+    using GuestGic = Gicv3;
+    using KvmGic = KvmKernelGicV3;
+    using Params = MuxingKvmGicV3Params;
+};
+
 template <class Types>
 class MuxingKvmGic : public Types::GuestGic
 {

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/55614
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: I7b0db0b8b436a6b2ca47444e4e1f8a2a20bd7c25
Gerrit-Change-Number: 55614
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
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