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

Change subject: arch-arm, kvm: Define a base KvmKernelGic
......................................................................

arch-arm, kvm: Define a base KvmKernelGic

This patch is defining a base KvmKernelGic class to be
subclassed by post Gicv2 (e.g. Gicv3) implementations.

Change-Id: I1b79d4813208f78f7a0fc311bdc362414e4a3dcc
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
---
M src/arch/arm/kvm/gic.cc
M src/arch/arm/kvm/gic.hh
2 files changed, 80 insertions(+), 47 deletions(-)



diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc
index fc1ed98..ae4314f 100644
--- a/src/arch/arm/kvm/gic.cc
+++ b/src/arch/arm/kvm/gic.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017 ARM Limited
+ * Copyright (c) 2015-2017, 2021 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -47,55 +47,47 @@
 namespace gem5
 {

-KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr,
-                               unsigned it_lines)
-    : cpuRange(RangeSize(cpu_addr, KVM_VGIC_V2_CPU_SIZE)),
-      distRange(RangeSize(dist_addr, KVM_VGIC_V2_DIST_SIZE)),
-      vm(_vm),
-      kdev(vm.createDevice(KVM_DEV_TYPE_ARM_VGIC_V2))
+KvmKernelGic::KvmKernelGic(KvmVM &_vm, uint32_t dev, unsigned it_lines)
+    : vm(_vm),
+      kdev(vm.createDevice(dev))
 {
     // Tell the VM that we will emulate the GIC in the kernel. This
     // disables IRQ and FIQ handling in the KVM CPU model.
     vm.enableKernelIRQChip();

-    kdev.setAttr<uint64_t>(
-        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_DIST, dist_addr);
-    kdev.setAttr<uint64_t>(
-        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, cpu_addr);
-
     kdev.setAttr<uint32_t>(KVM_DEV_ARM_VGIC_GRP_NR_IRQS, 0, it_lines);
 }

-KvmKernelGicV2::~KvmKernelGicV2()
+KvmKernelGic::~KvmKernelGic()
 {
 }

 void
-KvmKernelGicV2::setSPI(unsigned spi)
+KvmKernelGic::setSPI(unsigned spi)
 {
     setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, true);
 }

 void
-KvmKernelGicV2::clearSPI(unsigned spi)
+KvmKernelGic::clearSPI(unsigned spi)
 {
     setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, false);
 }

 void
-KvmKernelGicV2::setPPI(unsigned vcpu, unsigned ppi)
+KvmKernelGic::setPPI(unsigned vcpu, unsigned ppi)
 {
     setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, true);
 }

 void
-KvmKernelGicV2::clearPPI(unsigned vcpu, unsigned ppi)
+KvmKernelGic::clearPPI(unsigned vcpu, unsigned ppi)
 {
     setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, false);
 }

 void
-KvmKernelGicV2::setIntState(unsigned type, unsigned vcpu, unsigned irq,
+KvmKernelGic::setIntState(unsigned type, unsigned vcpu, unsigned irq,
                             bool high)
 {
     assert(type <= KVM_ARM_IRQ_TYPE_MASK);
@@ -110,7 +102,7 @@
 }

 uint32_t
-KvmKernelGicV2::getGicReg(unsigned group, unsigned vcpu, unsigned offset)
+KvmKernelGic::getGicReg(unsigned group, unsigned vcpu, unsigned offset)
 {
     uint64_t reg;

@@ -124,7 +116,7 @@
 }

 void
-KvmKernelGicV2::setGicReg(unsigned group, unsigned vcpu, unsigned offset,
+KvmKernelGic::setGicReg(unsigned group, unsigned vcpu, unsigned offset,
                           unsigned value)
 {
     uint64_t reg = value;
@@ -138,34 +130,44 @@
 }

 uint32_t
-KvmKernelGicV2::readDistributor(ContextID ctx, Addr daddr)
+KvmKernelGic::readDistributor(ContextID ctx, Addr daddr)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
     return getGicReg(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr);
 }

 uint32_t
-KvmKernelGicV2::readCpu(ContextID ctx, Addr daddr)
+KvmKernelGic::readCpu(ContextID ctx, Addr daddr)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
     return getGicReg(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr);
 }

 void
-KvmKernelGicV2::writeDistributor(ContextID ctx, Addr daddr, uint32_t data)
+KvmKernelGic::writeDistributor(ContextID ctx, Addr daddr, uint32_t data)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
     setGicReg(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr, data);
 }

 void
-KvmKernelGicV2::writeCpu(ContextID ctx, Addr daddr, uint32_t data)
+KvmKernelGic::writeCpu(ContextID ctx, Addr daddr, uint32_t data)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
     setGicReg(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr, data);
 }

-
+KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr,
+                               unsigned it_lines)
+    : KvmKernelGic(_vm, KVM_DEV_TYPE_ARM_VGIC_V2, it_lines),
+      cpuRange(RangeSize(cpu_addr, KVM_VGIC_V2_CPU_SIZE)),
+      distRange(RangeSize(dist_addr, KVM_VGIC_V2_DIST_SIZE))
+{
+    kdev.setAttr<uint64_t>(
+        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_DIST, dist_addr);
+    kdev.setAttr<uint64_t>(
+        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, cpu_addr);
+}

 MuxingKvmGic::MuxingKvmGic(const MuxingKvmGicParams &p)
     : GicV2(p),
@@ -190,14 +192,14 @@
     GicV2::startup();
     usingKvm = (kernelGic != nullptr) && system.validKvmEnvironment();
     if (usingKvm)
-        fromGicV2ToKvm();
+        fromGicToKvm();
 }

 DrainState
 MuxingKvmGic::drain()
 {
     if (usingKvm)
-        fromKvmToGicV2();
+        fromKvmToGic();
     return GicV2::drain();
 }

@@ -209,7 +211,7 @@
     if (use_kvm != usingKvm) {
         // Should only occur due to CPU switches
         if (use_kvm) // from simulation to KVM emulation
-            fromGicV2ToKvm();
+            fromGicToKvm();
         // otherwise, drain() already sync'd the state back to the GicV2

         usingKvm = use_kvm;
@@ -284,13 +286,13 @@
 }

 void
-MuxingKvmGic::fromGicV2ToKvm()
+MuxingKvmGic::fromGicToKvm()
 {
     copyGicState(static_cast<GicV2*>(this), kernelGic);
 }

 void
-MuxingKvmGic::fromKvmToGicV2()
+MuxingKvmGic::fromKvmToGic()
 {
     copyGicState(kernelGic, static_cast<GicV2*>(this));

diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh
index f7ae715..bf3a106 100644
--- a/src/arch/arm/kvm/gic.hh
+++ b/src/arch/arm/kvm/gic.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017 ARM Limited
+ * Copyright (c) 2015-2017, 2021 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -54,7 +54,7 @@
  * model. It exposes an API that is similar to that of
  * software-emulated GIC models in gem5.
  */
-class KvmKernelGicV2 : public BaseGicRegisters
+class KvmKernelGic : public BaseGicRegisters
 {
   public:
     /**
@@ -68,14 +68,13 @@
      * @param dist_addr GIC distributor base address
      * @param it_lines Number of interrupt lines to support
      */
-    KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr,
-                   unsigned it_lines);
-    virtual ~KvmKernelGicV2();
+    KvmKernelGic(KvmVM &vm, uint32_t dev, unsigned it_lines);
+    virtual ~KvmKernelGic();

-    KvmKernelGicV2(const KvmKernelGicV2 &other) = delete;
-    KvmKernelGicV2(const KvmKernelGicV2 &&other) = delete;
-    KvmKernelGicV2 &operator=(const KvmKernelGicV2 &&rhs) = delete;
-    KvmKernelGicV2 &operator=(const KvmKernelGicV2 &rhs) = delete;
+    KvmKernelGic(const KvmKernelGic &other) = delete;
+    KvmKernelGic(const KvmKernelGic &&other) = delete;
+    KvmKernelGic &operator=(const KvmKernelGic &&rhs) = delete;
+    KvmKernelGic &operator=(const KvmKernelGic &rhs) = delete;

   public:
     /**
@@ -112,11 +111,6 @@
      */
     void clearPPI(unsigned vcpu, unsigned ppi);

-    /** Address range for the CPU interfaces */
-    const AddrRange cpuRange;
-    /** Address range for the distributor interface */
-    const AddrRange distRange;
-
     /** BaseGicRegisters interface */
     uint32_t readDistributor(ContextID ctx, Addr daddr) override;
     uint32_t readCpu(ContextID ctx, Addr daddr) override;
@@ -165,6 +159,30 @@
     KvmDevice kdev;
 };

+class KvmKernelGicV2 : public KvmKernelGic
+{
+  public:
+    /**
+     * Instantiate a KVM in-kernel GIC model.
+     *
+     * This constructor instantiates an in-kernel GIC model and wires
+     * it up to the virtual memory system.
+     *
+     * @param vm KVM VM representing this system
+     * @param cpu_addr GIC CPU interface base address
+     * @param dist_addr GIC distributor base address
+     * @param it_lines Number of interrupt lines to support
+     */
+    KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr,
+                   unsigned it_lines);
+
+  private:
+    /** Address range for the CPU interfaces */
+    const AddrRange cpuRange;
+    /** Address range for the distributor */
+    const AddrRange distRange;
+
+};

 struct MuxingKvmGicParams;

@@ -197,14 +215,14 @@
     System &system;

     /** Kernel GIC device */
-    KvmKernelGicV2 *kernelGic;
+    KvmKernelGic *kernelGic;

   private:
     bool usingKvm;

     /** Multiplexing implementation */
-    void fromGicV2ToKvm();
-    void fromKvmToGicV2();
+    void fromGicToKvm();
+    void fromKvmToGic();
 };

 } // namespace gem5

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/55610
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: I1b79d4813208f78f7a0fc311bdc362414e4a3dcc
Gerrit-Change-Number: 55610
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