sim, kvm: make KvmVM a System parameter

A KVM VM is typically a child of the System object already, but for
solving future issues with configuration graph resolution, the most
logical way to keep track of this object is for it to be an actual
parameter of the System object.

Change-Id: I965ded22203ff8667db9ca02de0042ff1c772220
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
Curtis Dunham 2017-02-14 15:09:18 -06:00
parent d3bfc03688
commit 41beacce08
12 changed files with 52 additions and 11 deletions

View file

@ -143,7 +143,7 @@ def build_test_system(np):
for i in xrange(np)]
if is_kvm_cpu(TestCPUClass) or is_kvm_cpu(FutureClass):
test_sys.vm = KvmVM()
test_sys.kvm_vm = KvmVM()
if options.ruby:
# Check for timing mode because ruby does not support atomic accesses
@ -280,7 +280,7 @@ def build_drive_system(np):
drive_sys.kernel = binary(options.kernel)
if is_kvm_cpu(DriveCPUClass):
drive_sys.vm = KvmVM()
drive_sys.kvm_vm = KvmVM()
drive_sys.iobridge = Bridge(delay='50ns',
ranges = drive_sys.mem_ranges)

View file

@ -209,7 +209,7 @@ for cpu in system.cpu:
if is_kvm_cpu(CPUClass) or is_kvm_cpu(FutureClass):
if buildEnv['TARGET_ISA'] == 'x86':
system.vm = KvmVM()
system.kvm_vm = KvmVM()
for process in multiprocesses:
process.useArchPT = True
process.kvmInSE = True

View file

@ -52,4 +52,3 @@ class KvmGic(BaseGic):
system = Param.System(Parent.any,
'System this interrupt controller belongs to')
kvmVM = Param.KvmVM(Parent.any, 'KVM VM (i.e., shared memory domain)')

View file

@ -106,7 +106,8 @@ KvmKernelGicV2::setIntState(unsigned type, unsigned vcpu, unsigned irq,
KvmGic::KvmGic(const KvmGicParams *p)
: BaseGic(p),
system(*p->system),
kernelGic(*p->kvmVM, p->cpu_addr, p->dist_addr, p->it_lines),
kernelGic(*system.getKvmVM(),
p->cpu_addr, p->dist_addr, p->it_lines),
addrRanges{kernelGic.distRange, kernelGic.cpuRange}
{
}

View file

@ -64,7 +64,6 @@ class BaseKvmCPU(BaseCPU):
def support_take_over(cls):
return True
kvmVM = Param.KvmVM(Parent.any, 'KVM VM (i.e., shared memory domain)')
useCoalescedMMIO = Param.Bool(False, "Use coalesced MMIO (EXPERIMENTAL)")
usePerfOverflow = Param.Bool(False, "Use perf event overflow counters (EXPERIMENTAL)")
alwaysSyncTC = Param.Bool(False,

View file

@ -44,6 +44,5 @@ class KvmVM(SimObject):
type = 'KvmVM'
cxx_header = "cpu/kvm/vm.hh"
system = Param.System(Parent.any, "system object")
coalescedMMIO = VectorParam.AddrRange([], "memory ranges for coalesced MMIO")
coalescedMMIO = \
VectorParam.AddrRange([], "memory ranges for coalesced MMIO")

View file

@ -64,7 +64,7 @@
BaseKvmCPU::BaseKvmCPU(BaseKvmCPUParams *params)
: BaseCPU(params),
vm(*params->kvmVM),
vm(*params->system->getKvmVM()),
_status(Idle),
dataPort(name() + ".dcache_port", this),
instPort(name() + ".icache_port", this),

View file

@ -292,7 +292,7 @@ Kvm::createVM()
KvmVM::KvmVM(KvmVMParams *params)
: SimObject(params),
kvm(new Kvm()), system(params->system),
kvm(new Kvm()), system(nullptr),
vmFD(kvm->createVM()),
started(false),
nextVCPUID(0)
@ -342,6 +342,7 @@ KvmVM::cpuStartup()
void
KvmVM::delayedStartup()
{
assert(system); // set by the system during its construction
const std::vector<BackingStoreEntry> &memories(
system->getPhysMem().getBackingStore());
@ -526,6 +527,13 @@ KvmVM::createDevice(uint32_t type, uint32_t flags)
#endif
}
void
KvmVM::setSystem(System *s) {
panic_if(system != nullptr, "setSystem() can only be called once");
panic_if(s == nullptr, "setSystem() called with null System*");
system = s;
}
int
KvmVM::createVCPU(long vcpuID)
{

View file

@ -400,6 +400,11 @@ class KvmVM : public SimObject
/** Global KVM interface */
Kvm *kvm;
/**
* Initialize system pointer. Invoked by system object.
*/
void setSystem(System *s);
#if defined(__aarch64__)
public: // ARM-specific
/**

View file

@ -29,6 +29,7 @@
# Rick Strong
from m5.SimObject import SimObject
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
@ -106,3 +107,6 @@ class System(MemObject):
# Dynamic voltage and frequency handler for the system, disabled by default
# Provide list of domains that need to be controlled by the handler
dvfs_handler = DVFSHandler()
if buildEnv['USE_KVM']:
kvm_vm = Param.KvmVM(NULL, 'KVM VM (i.e., shared memory domain)')

View file

@ -53,6 +53,10 @@
#include "base/loader/symtab.hh"
#include "base/str.hh"
#include "base/trace.hh"
#include "config/use_kvm.hh"
#if USE_KVM
#include "cpu/kvm/vm.hh"
#endif
#include "cpu/thread_context.hh"
#include "debug/Loader.hh"
#include "debug/WorkItems.hh"
@ -90,6 +94,11 @@ System::System(Params *p)
kernel(nullptr),
loadAddrMask(p->load_addr_mask),
loadAddrOffset(p->load_offset),
#if USE_KVM
kvmVM(p->kvm_vm),
#else
kvmVM(nullptr),
#endif
physmem(name() + ".physmem", p->memories, p->mmap_using_noreserve),
memoryMode(p->mem_mode),
_cacheLineSize(p->cache_line_size),
@ -104,6 +113,12 @@ System::System(Params *p)
// add self to global system list
systemList.push_back(this);
#if USE_KVM
if (kvmVM) {
kvmVM->setSystem(this);
}
#endif
if (FullSystem) {
kernelSymtab = new SymbolTable;
if (!debugSymbolTable)

View file

@ -72,6 +72,7 @@
class BaseRemoteGDB;
class GDBListener;
class KvmVM;
class ObjectFile;
class ThreadContext;
@ -249,6 +250,14 @@ class System : public MemObject
Addr loadAddrOffset;
public:
/**
* Get a pointer to the Kernel Virtual Machine (KVM) SimObject,
* if present.
*/
KvmVM* getKvmVM() {
return kvmVM;
}
/** Get a pointer to access the physical memory of the system */
PhysicalMemory& getPhysMem() { return physmem; }
@ -289,6 +298,8 @@ class System : public MemObject
protected:
KvmVM *const kvmVM;
PhysicalMemory physmem;
Enums::MemoryMode memoryMode;