diff --git a/configs/example/fs.py b/configs/example/fs.py index 1ada59084..8102edc75 100644 --- a/configs/example/fs.py +++ b/configs/example/fs.py @@ -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) diff --git a/configs/example/se.py b/configs/example/se.py index c48b99eb4..4adfe7bb8 100644 --- a/configs/example/se.py +++ b/configs/example/se.py @@ -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 diff --git a/src/arch/arm/kvm/KvmGic.py b/src/arch/arm/kvm/KvmGic.py index 74bfe1e0b..9ae52db22 100644 --- a/src/arch/arm/kvm/KvmGic.py +++ b/src/arch/arm/kvm/KvmGic.py @@ -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)') diff --git a/src/arch/arm/kvm/gic.cc b/src/arch/arm/kvm/gic.cc index 684f026f0..c5a30879c 100644 --- a/src/arch/arm/kvm/gic.cc +++ b/src/arch/arm/kvm/gic.cc @@ -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} { } diff --git a/src/cpu/kvm/BaseKvmCPU.py b/src/cpu/kvm/BaseKvmCPU.py index 4c64f24ed..cc0b28fe9 100644 --- a/src/cpu/kvm/BaseKvmCPU.py +++ b/src/cpu/kvm/BaseKvmCPU.py @@ -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, diff --git a/src/cpu/kvm/KvmVM.py b/src/cpu/kvm/KvmVM.py index 478a91682..cbc92ca0d 100644 --- a/src/cpu/kvm/KvmVM.py +++ b/src/cpu/kvm/KvmVM.py @@ -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") diff --git a/src/cpu/kvm/base.cc b/src/cpu/kvm/base.cc index 723feda44..6ae3c7dff 100644 --- a/src/cpu/kvm/base.cc +++ b/src/cpu/kvm/base.cc @@ -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), diff --git a/src/cpu/kvm/vm.cc b/src/cpu/kvm/vm.cc index d3ab8c45a..604d182ab 100644 --- a/src/cpu/kvm/vm.cc +++ b/src/cpu/kvm/vm.cc @@ -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 &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) { diff --git a/src/cpu/kvm/vm.hh b/src/cpu/kvm/vm.hh index 560efb606..dbd46aa3c 100644 --- a/src/cpu/kvm/vm.hh +++ b/src/cpu/kvm/vm.hh @@ -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 /** diff --git a/src/sim/System.py b/src/sim/System.py index 34b1fd127..e3e42d862 100644 --- a/src/sim/System.py +++ b/src/sim/System.py @@ -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)') diff --git a/src/sim/system.cc b/src/sim/system.cc index 09be232a7..9315882b7 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -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) diff --git a/src/sim/system.hh b/src/sim/system.hh index 1bbd37d9d..c3667fe09 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -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;