diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc index f6a57da7d2..100f2561cd 100644 --- a/src/arch/arm/kvm/gic.cc +++ b/src/arch/arm/kvm/gic.cc @@ -292,13 +292,15 @@ MuxingKvmGic::blockIntUpdate() const void MuxingKvmGic::fromGicToKvm() { - copyGicState(static_cast(this), kernelGic); + copyGicState(static_cast(this), + static_cast(kernelGic)); } void MuxingKvmGic::fromKvmToGic() { - copyGicState(kernelGic, static_cast(this)); + copyGicState(static_cast(kernelGic), + static_cast(this)); // the values read for the Interrupt Priority Mask Register (PMR) // have been shifted by three bits due to its having been emulated by diff --git a/src/arch/arm/kvm/gic.hh b/src/arch/arm/kvm/gic.hh index 5201f58aff..af520798dd 100644 --- a/src/arch/arm/kvm/gic.hh +++ b/src/arch/arm/kvm/gic.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017, 2021 Arm Limited + * Copyright (c) 2015-2017, 2021-2022 Arm Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -54,7 +54,7 @@ namespace gem5 * model. It exposes an API that is similar to that of * software-emulated GIC models in gem5. */ -class KvmKernelGic : public BaseGicRegisters +class KvmKernelGic { public: /** @@ -131,7 +131,7 @@ class KvmKernelGic : public BaseGicRegisters KvmDevice kdev; }; -class KvmKernelGicV2 : public KvmKernelGic +class KvmKernelGicV2 : public KvmKernelGic, public GicV2Registers { public: /** @@ -148,7 +148,7 @@ class KvmKernelGicV2 : public KvmKernelGic KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr, unsigned it_lines); - public: // BaseGicRegisters + public: // GicV2Registers uint32_t readDistributor(ContextID ctx, Addr daddr) override; uint32_t readCpu(ContextID ctx, Addr daddr) override; diff --git a/src/dev/arm/base_gic.cc b/src/dev/arm/base_gic.cc index c738c71f6f..5694c37399 100644 --- a/src/dev/arm/base_gic.cc +++ b/src/dev/arm/base_gic.cc @@ -80,61 +80,6 @@ BaseGic::params() const return dynamic_cast(_params); } -void -BaseGicRegisters::copyDistRegister(BaseGicRegisters* from, - BaseGicRegisters* to, - ContextID ctx, Addr daddr) -{ - auto val = from->readDistributor(ctx, daddr); - DPRINTF(GIC, "copy dist 0x%x 0x%08x\n", daddr, val); - to->writeDistributor(ctx, daddr, val); -} - -void -BaseGicRegisters::copyCpuRegister(BaseGicRegisters* from, - BaseGicRegisters* to, - ContextID ctx, Addr daddr) -{ - auto val = from->readCpu(ctx, daddr); - DPRINTF(GIC, "copy cpu 0x%x 0x%08x\n", daddr, val); - to->writeCpu(ctx, daddr, val); -} - -void -BaseGicRegisters::copyBankedDistRange(System *sys, BaseGicRegisters* from, - BaseGicRegisters* to, - Addr daddr, size_t size) -{ - for (int ctx = 0; ctx < sys->threads.size(); ++ctx) - for (auto a = daddr; a < daddr + size; a += 4) - copyDistRegister(from, to, ctx, a); -} - -void -BaseGicRegisters::clearBankedDistRange(System *sys, BaseGicRegisters* to, - Addr daddr, size_t size) -{ - for (int ctx = 0; ctx < sys->threads.size(); ++ctx) - for (auto a = daddr; a < daddr + size; a += 4) - to->writeDistributor(ctx, a, 0xFFFFFFFF); -} - -void -BaseGicRegisters::copyDistRange(BaseGicRegisters* from, - BaseGicRegisters* to, - Addr daddr, size_t size) -{ - for (auto a = daddr; a < daddr + size; a += 4) - copyDistRegister(from, to, 0, a); -} - -void -BaseGicRegisters::clearDistRange(BaseGicRegisters* to, Addr daddr, size_t size) -{ - for (auto a = daddr; a < daddr + size; a += 4) - to->writeDistributor(0, a, 0xFFFFFFFF); -} - ArmInterruptPinGen::ArmInterruptPinGen(const ArmInterruptPinParams &p) : SimObject(p) { diff --git a/src/dev/arm/base_gic.hh b/src/dev/arm/base_gic.hh index 7dcb95b2df..1ab8c2a2c8 100644 --- a/src/dev/arm/base_gic.hh +++ b/src/dev/arm/base_gic.hh @@ -134,35 +134,6 @@ class BaseGic : public PioDevice Platform *platform; }; -class BaseGicRegisters -{ - public: - virtual uint32_t readDistributor(ContextID ctx, Addr daddr) = 0; - virtual uint32_t readCpu(ContextID ctx, Addr daddr) = 0; - - virtual void writeDistributor(ContextID ctx, Addr daddr, - uint32_t data) = 0; - virtual void writeCpu(ContextID ctx, Addr daddr, uint32_t data) = 0; - - protected: - static void copyDistRegister(BaseGicRegisters* from, - BaseGicRegisters* to, - ContextID ctx, Addr daddr); - static void copyCpuRegister(BaseGicRegisters* from, - BaseGicRegisters* to, - ContextID ctx, Addr daddr); - static void copyBankedDistRange(System *sys, - BaseGicRegisters* from, - BaseGicRegisters* to, - Addr daddr, size_t size); - static void clearBankedDistRange(System *sys, BaseGicRegisters* to, - Addr daddr, size_t size); - static void copyDistRange(BaseGicRegisters* from, - BaseGicRegisters* to, - Addr daddr, size_t size); - static void clearDistRange(BaseGicRegisters* to, Addr daddr, size_t size); -}; - /** * This SimObject is instantiated in the python world and * serves as an ArmInterruptPin generator. In this way it diff --git a/src/dev/arm/gic_v2.cc b/src/dev/arm/gic_v2.cc index 0a87275f6e..7dc001ed08 100644 --- a/src/dev/arm/gic_v2.cc +++ b/src/dev/arm/gic_v2.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, 2015-2018, 2020-2021 Arm Limited + * Copyright (c) 2010, 2013, 2015-2018, 2020-2022 Arm Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -64,6 +64,61 @@ const AddrRange GicV2::GICD_IPRIORITYR(0x400, 0x800); const AddrRange GicV2::GICD_ITARGETSR (0x800, 0xc00); const AddrRange GicV2::GICD_ICFGR (0xc00, 0xd00); +void +GicV2Registers::copyDistRegister(GicV2Registers* from, + GicV2Registers* to, + ContextID ctx, Addr daddr) +{ + auto val = from->readDistributor(ctx, daddr); + DPRINTF(GIC, "copy dist 0x%x 0x%08x\n", daddr, val); + to->writeDistributor(ctx, daddr, val); +} + +void +GicV2Registers::copyCpuRegister(GicV2Registers* from, + GicV2Registers* to, + ContextID ctx, Addr daddr) +{ + auto val = from->readCpu(ctx, daddr); + DPRINTF(GIC, "copy cpu 0x%x 0x%08x\n", daddr, val); + to->writeCpu(ctx, daddr, val); +} + +void +GicV2Registers::copyBankedDistRange(System *sys, GicV2Registers* from, + GicV2Registers* to, + Addr daddr, size_t size) +{ + for (int ctx = 0; ctx < sys->threads.size(); ++ctx) + for (auto a = daddr; a < daddr + size; a += 4) + copyDistRegister(from, to, ctx, a); +} + +void +GicV2Registers::clearBankedDistRange(System *sys, GicV2Registers* to, + Addr daddr, size_t size) +{ + for (int ctx = 0; ctx < sys->threads.size(); ++ctx) + for (auto a = daddr; a < daddr + size; a += 4) + to->writeDistributor(ctx, a, 0xFFFFFFFF); +} + +void +GicV2Registers::copyDistRange(GicV2Registers* from, + GicV2Registers* to, + Addr daddr, size_t size) +{ + for (auto a = daddr; a < daddr + size; a += 4) + copyDistRegister(from, to, 0, a); +} + +void +GicV2Registers::clearDistRange(GicV2Registers* to, Addr daddr, size_t size) +{ + for (auto a = daddr; a < daddr + size; a += 4) + to->writeDistributor(0, a, 0xFFFFFFFF); +} + GicV2::GicV2(const Params &p) : BaseGic(p), gicdPIDR(p.gicd_pidr), @@ -998,7 +1053,7 @@ GicV2::drainResume() } void -GicV2::copyGicState(BaseGicRegisters* from, BaseGicRegisters* to) +GicV2::copyGicState(GicV2Registers* from, GicV2Registers* to) { Addr set, clear; size_t size; diff --git a/src/dev/arm/gic_v2.hh b/src/dev/arm/gic_v2.hh index 5562419194..a0eec938e4 100644 --- a/src/dev/arm/gic_v2.hh +++ b/src/dev/arm/gic_v2.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, 2015-2021 Arm Limited + * Copyright (c) 2010, 2013, 2015-2022 Arm Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -59,7 +59,36 @@ namespace gem5 { -class GicV2 : public BaseGic, public BaseGicRegisters +class GicV2Registers +{ + public: + virtual uint32_t readDistributor(ContextID ctx, Addr daddr) = 0; + virtual uint32_t readCpu(ContextID ctx, Addr daddr) = 0; + + virtual void writeDistributor(ContextID ctx, Addr daddr, + uint32_t data) = 0; + virtual void writeCpu(ContextID ctx, Addr daddr, uint32_t data) = 0; + + protected: + static void copyDistRegister(GicV2Registers* from, + GicV2Registers* to, + ContextID ctx, Addr daddr); + static void copyCpuRegister(GicV2Registers* from, + GicV2Registers* to, + ContextID ctx, Addr daddr); + static void copyBankedDistRange(System *sys, + GicV2Registers* from, + GicV2Registers* to, + Addr daddr, size_t size); + static void clearBankedDistRange(System *sys, GicV2Registers* to, + Addr daddr, size_t size); + static void copyDistRange(GicV2Registers* from, + GicV2Registers* to, + Addr daddr, size_t size); + static void clearDistRange(GicV2Registers* to, Addr daddr, size_t size); +}; + +class GicV2 : public BaseGic, public GicV2Registers { protected: // distributor memory addresses @@ -513,7 +542,7 @@ class GicV2 : public BaseGic, public BaseGicRegisters bool supportsVersion(GicVersion version) override; protected: /** GIC state transfer */ - void copyGicState(BaseGicRegisters* from, BaseGicRegisters* to); + void copyGicState(GicV2Registers* from, GicV2Registers* to); /** Handle a read to the distributor portion of the GIC * @param pkt packet to respond to