diff options
author | Curtis Dunham <Curtis.Dunham@arm.com> | 2017-01-27 20:21:59 +0000 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2017-04-03 16:51:46 +0000 |
commit | 567a9b0a085d79c6bc9128204946cd6155960a9f (patch) | |
tree | 98f7c28fe491614659d2ac627bd64d935d99b5ca /src/arch/arm/kvm/gic.hh | |
parent | 60075068ea6340e89a4b0cd4bd79c6ee3de44893 (diff) | |
download | gem5-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.hh | 51 |
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__ |