summaryrefslogtreecommitdiff
path: root/src/arch/arm/kvm/gic.hh
diff options
context:
space:
mode:
authorCurtis Dunham <Curtis.Dunham@arm.com>2017-01-27 20:21:59 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-04-03 16:51:46 +0000
commit567a9b0a085d79c6bc9128204946cd6155960a9f (patch)
tree98f7c28fe491614659d2ac627bd64d935d99b5ca /src/arch/arm/kvm/gic.hh
parent60075068ea6340e89a4b0cd4bd79c6ee3de44893 (diff)
downloadgem5-567a9b0a085d79c6bc9128204946cd6155960a9f.tar.xz
arm, kvm: implement GIC state transfer
This also allows checkpointing of a Kvm GIC via the Pl390 model. Change-Id: Ic85d81cfefad630617491b732398f5e6a5f34c0b Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/2444 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Weiping Liao <weipingliao@google.com>
Diffstat (limited to 'src/arch/arm/kvm/gic.hh')
-rw-r--r--src/arch/arm/kvm/gic.hh51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh
index 7e2e772b8..b5544486c 100644
--- a/src/arch/arm/kvm/gic.hh
+++ b/src/arch/arm/kvm/gic.hh
@@ -54,7 +54,7 @@
* model. It exposes an API that is similar to that of
* software-emulated GIC models in gem5.
*/
-class KvmKernelGicV2
+class KvmKernelGicV2 : public BaseGicRegisters
{
public:
/**
@@ -117,6 +117,14 @@ class KvmKernelGicV2
/** 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;
+
+ void writeDistributor(ContextID ctx, Addr daddr,
+ uint32_t data) override;
+ void writeCpu(ContextID ctx, Addr daddr, uint32_t data) override;
+
/* @} */
protected:
@@ -130,6 +138,26 @@ class KvmKernelGicV2
*/
void setIntState(unsigned type, unsigned vcpu, unsigned irq, bool high);
+ /**
+ * Get value of GIC register "from" a cpu
+ *
+ * @param group Distributor or CPU (KVM_DEV_ARM_VGIC_GRP_{DIST,CPU}_REGS)
+ * @param vcpu CPU id within KVM
+ * @param offset register offset
+ */
+ uint32_t getGicReg(unsigned group, unsigned vcpu, unsigned offset);
+
+ /**
+ * Set value of GIC register "from" a cpu
+ *
+ * @param group Distributor or CPU (KVM_DEV_ARM_VGIC_GRP_{DIST,CPU}_REGS)
+ * @param vcpu CPU id within KVM
+ * @param offset register offset
+ * @param value value to set register to
+ */
+ void setGicReg(unsigned group, unsigned vcpu, unsigned offset,
+ unsigned value);
+
/** KVM VM in the parent system */
KvmVM &vm;
@@ -146,7 +174,10 @@ class MuxingKvmGic : public Pl390
MuxingKvmGic(const MuxingKvmGicParams *p);
~MuxingKvmGic();
+ void loadState(CheckpointIn &cp) override;
+
void startup() override;
+ DrainState drain() override;
void drainResume() override;
void serialize(CheckpointOut &cp) const override;
@@ -176,9 +207,25 @@ class MuxingKvmGic : public Pl390
private:
bool usingKvm;
- /** Multiplexing implementation: state transfer functions */
+ /** Multiplexing implementation */
void fromPl390ToKvm();
void fromKvmToPl390();
+
+ void copyGicState(BaseGicRegisters* from, BaseGicRegisters* to);
+
+ void copyDistRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+ ContextID ctx, Addr daddr);
+ void copyCpuRegister(BaseGicRegisters* from, BaseGicRegisters* to,
+ ContextID ctx, Addr daddr);
+
+ void copyBankedDistRange(BaseGicRegisters* from, BaseGicRegisters* to,
+ Addr daddr, size_t size);
+ void clearBankedDistRange(BaseGicRegisters* to,
+ Addr daddr, size_t size);
+ void copyDistRange(BaseGicRegisters* from, BaseGicRegisters* to,
+ Addr daddr, size_t size);
+ void clearDistRange(BaseGicRegisters* to,
+ Addr daddr, size_t size);
};
#endif // __ARCH_ARM_KVM_GIC_HH__