kvm: move Kvm check from ARM Kvm GIC to System

The check was nearly completely generic anyway,
with the exception of the Kvm CPU type.

This will make it easier for other parts of the
codebase to do similar checks.

Change-Id: Ibfdd3d65e9e6cc3041b53b73adfabee1999283da
Reviewed-on: https://gem5-review.googlesource.com/3540
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
Curtis Dunham
2017-05-17 21:34:04 +00:00
committed by Andreas Sandberg
parent 97187fa814
commit b829b4a8e4
4 changed files with 24 additions and 19 deletions

View File

@@ -189,7 +189,7 @@ void
MuxingKvmGic::startup()
{
Pl390::startup();
usingKvm = (kernelGic != nullptr) && validKvmEnvironment();
usingKvm = (kernelGic != nullptr) && system.validKvmEnvironment();
if (usingKvm)
fromPl390ToKvm();
}
@@ -206,7 +206,7 @@ void
MuxingKvmGic::drainResume()
{
Pl390::drainResume();
bool use_kvm = (kernelGic != nullptr) && validKvmEnvironment();
bool use_kvm = (kernelGic != nullptr) && system.validKvmEnvironment();
if (use_kvm != usingKvm) {
// Should only occur due to CPU switches
if (use_kvm) // from simulation to KVM emulation
@@ -287,20 +287,6 @@ MuxingKvmGic::clearPPInt(uint32_t num, uint32_t cpu)
kernelGic->clearPPI(cpu, num);
}
bool
MuxingKvmGic::validKvmEnvironment() const
{
if (system.threadContexts.empty())
return false;
for (auto tc : system.threadContexts) {
if (dynamic_cast<BaseArmKvmCPU*>(tc->getCpuPtr()) == nullptr) {
return false;
}
}
return true;
}
void
MuxingKvmGic::copyDistRegister(BaseGicRegisters* from, BaseGicRegisters* to,
ContextID ctx, Addr daddr)

View File

@@ -195,9 +195,6 @@ class MuxingKvmGic : public Pl390
void clearPPInt(uint32_t num, uint32_t cpu) override;
protected:
/** Verify gem5 configuration will support KVM emulation */
bool validKvmEnvironment() const;
/** System this interrupt controller belongs to */
System &system;

View File

@@ -55,6 +55,7 @@
#include "base/trace.hh"
#include "config/use_kvm.hh"
#if USE_KVM
#include "cpu/kvm/base.hh"
#include "cpu/kvm/vm.hh"
#endif
#include "cpu/thread_context.hh"
@@ -335,6 +336,24 @@ System::replaceThreadContext(ThreadContext *tc, ContextID context_id)
remoteGDB[context_id]->replaceThreadContext(tc);
}
bool
System::validKvmEnvironment() const
{
#if USE_KVM
if (threadContexts.empty())
return false;
for (auto tc : threadContexts) {
if (dynamic_cast<BaseKvmCPU*>(tc->getCpuPtr()) == nullptr) {
return false;
}
}
return true;
#else
return false;
#endif
}
Addr
System::allocPhysPages(int npages)
{

View File

@@ -262,6 +262,9 @@ class System : public MemObject
return kvmVM;
}
/** Verify gem5 configuration will support KVM emulation */
bool validKvmEnvironment() const;
/** Get a pointer to access the physical memory of the system */
PhysicalMemory& getPhysMem() { return physmem; }