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

Change subject: arch-arm: Templatize set/getGicReg to support 64bit accesses
......................................................................

arch-arm: Templatize set/getGicReg to support 64bit accesses

In Gicv2, every distributor/cpu interface register is read/written
with 32bit accesses.
The Gicv3 KVM APIs follow the same pattern for distributor and
redistributors; the system register implementation of the cpu interface
in Gicv3 requires 64bit read/writes instead [1]

We now explicitly select the Gic register size via a template
parameter.

[1]:
https://www.kernel.org/doc/html/latest/virt/kvm/devices/arm-vgic-v3.html

Signed-off-by: Giacomo Travaglini <[email protected]>
Change-Id: I471037179bf10e163baccf655cc1492bdfeae17f
---
M src/arch/arm/kvm/gic.cc
M src/arch/arm/kvm/gic.hh
2 files changed, 37 insertions(+), 11 deletions(-)



diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc
index abc92e5..33a3f61 100644
--- a/src/arch/arm/kvm/gic.cc
+++ b/src/arch/arm/kvm/gic.cc
@@ -101,10 +101,11 @@
     vm.setIRQLine(line, high);
 }

-uint32_t
+template <typename Ret>
+Ret
 KvmKernelGic::getGicReg(unsigned group, unsigned vcpu, unsigned offset)
 {
-    uint64_t reg;
+    Ret reg;

     assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
     const uint64_t attr(
@@ -112,14 +113,15 @@
         (offset << KVM_DEV_ARM_VGIC_OFFSET_SHIFT));

     kdev.getAttrPtr(group, attr, &reg);
-    return (uint32_t) reg;
+    return reg;
 }

+template <typename Arg>
 void
 KvmKernelGic::setGicReg(unsigned group, unsigned vcpu, unsigned offset,
-                          unsigned value)
+                        Arg value)
 {
-    uint64_t reg = value;
+    Arg reg = value;

     assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
     const uint64_t attr(
@@ -133,7 +135,7 @@
 KvmKernelGic::readDistributor(ContextID ctx, Addr daddr)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
-    return getGicReg(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr);
+ return getGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr);
 }

 uint32_t
@@ -146,14 +148,14 @@
 KvmKernelGic::readCpu(ContextID ctx, Addr daddr)
 {
     auto vcpu = vm.contextIdToVCpuId(ctx);
-    return getGicReg(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr);
+    return getGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr);
 }

 void
 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);
+    setGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr, data);
 }

 void
@@ -166,7 +168,7 @@
 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);
+    setGicReg<uint32_t>(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr, data);
 }

 KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm,
diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh
index 49edc8e..4ee048d 100644
--- a/src/arch/arm/kvm/gic.hh
+++ b/src/arch/arm/kvm/gic.hh
@@ -144,7 +144,8 @@
      * @param vcpu CPU id within KVM
      * @param offset register offset
      */
-    uint32_t getGicReg(unsigned group, unsigned vcpu, unsigned offset);
+    template <typename Ret>
+    Ret getGicReg(unsigned group, unsigned vcpu, unsigned offset);

     /**
      * Set value of GIC register "from" a cpu
@@ -154,8 +155,9 @@
      * @param offset register offset
      * @param value value to set register to
      */
+    template <typename Arg>
     void setGicReg(unsigned group, unsigned vcpu, unsigned offset,
-                   unsigned value);
+                   Arg value);

     /** KVM VM in the parent system */
     KvmVM &vm;

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