changeset dd6df2e47c14 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=dd6df2e47c14
description:
        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.sandb...@arm.com>

diffstat:

 configs/example/fs.py      |   4 ++--
 configs/example/se.py      |   2 +-
 src/arch/arm/kvm/KvmGic.py |   1 -
 src/arch/arm/kvm/gic.cc    |   3 ++-
 src/cpu/kvm/BaseKvmCPU.py  |   1 -
 src/cpu/kvm/KvmVM.py       |   5 ++---
 src/cpu/kvm/base.cc        |   2 +-
 src/cpu/kvm/vm.cc          |  10 +++++++++-
 src/cpu/kvm/vm.hh          |   5 +++++
 src/sim/System.py          |   4 ++++
 src/sim/system.cc          |  15 +++++++++++++++
 src/sim/system.hh          |  11 +++++++++++
 12 files changed, 52 insertions(+), 11 deletions(-)

diffs (230 lines):

diff -r 0b311345ac72 -r dd6df2e47c14 configs/example/fs.py
--- a/configs/example/fs.py     Tue Feb 14 15:09:18 2017 -0600
+++ b/configs/example/fs.py     Tue Feb 14 15:09:18 2017 -0600
@@ -143,7 +143,7 @@
                     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 @@
         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 -r 0b311345ac72 -r dd6df2e47c14 configs/example/se.py
--- a/configs/example/se.py     Tue Feb 14 15:09:18 2017 -0600
+++ b/configs/example/se.py     Tue Feb 14 15:09:18 2017 -0600
@@ -209,7 +209,7 @@
 
 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 -r 0b311345ac72 -r dd6df2e47c14 src/arch/arm/kvm/KvmGic.py
--- a/src/arch/arm/kvm/KvmGic.py        Tue Feb 14 15:09:18 2017 -0600
+++ b/src/arch/arm/kvm/KvmGic.py        Tue Feb 14 15:09:18 2017 -0600
@@ -52,4 +52,3 @@
 
     system = Param.System(Parent.any,
                           'System this interrupt controller belongs to')
-    kvmVM = Param.KvmVM(Parent.any, 'KVM VM (i.e., shared memory domain)')
diff -r 0b311345ac72 -r dd6df2e47c14 src/arch/arm/kvm/gic.cc
--- a/src/arch/arm/kvm/gic.cc   Tue Feb 14 15:09:18 2017 -0600
+++ b/src/arch/arm/kvm/gic.cc   Tue Feb 14 15:09:18 2017 -0600
@@ -106,7 +106,8 @@
 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 -r 0b311345ac72 -r dd6df2e47c14 src/cpu/kvm/BaseKvmCPU.py
--- a/src/cpu/kvm/BaseKvmCPU.py Tue Feb 14 15:09:18 2017 -0600
+++ b/src/cpu/kvm/BaseKvmCPU.py Tue Feb 14 15:09:18 2017 -0600
@@ -64,7 +64,6 @@
     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 -r 0b311345ac72 -r dd6df2e47c14 src/cpu/kvm/KvmVM.py
--- a/src/cpu/kvm/KvmVM.py      Tue Feb 14 15:09:18 2017 -0600
+++ b/src/cpu/kvm/KvmVM.py      Tue Feb 14 15:09:18 2017 -0600
@@ -44,6 +44,5 @@
     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 -r 0b311345ac72 -r dd6df2e47c14 src/cpu/kvm/base.cc
--- a/src/cpu/kvm/base.cc       Tue Feb 14 15:09:18 2017 -0600
+++ b/src/cpu/kvm/base.cc       Tue Feb 14 15:09:18 2017 -0600
@@ -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 -r 0b311345ac72 -r dd6df2e47c14 src/cpu/kvm/vm.cc
--- a/src/cpu/kvm/vm.cc Tue Feb 14 15:09:18 2017 -0600
+++ b/src/cpu/kvm/vm.cc Tue Feb 14 15:09:18 2017 -0600
@@ -292,7 +292,7 @@
 
 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 @@
 void
 KvmVM::delayedStartup()
 {
+    assert(system); // set by the system during its construction
     const std::vector<BackingStoreEntry> &memories(
         system->getPhysMem().getBackingStore());
 
@@ -526,6 +527,13 @@
 #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 -r 0b311345ac72 -r dd6df2e47c14 src/cpu/kvm/vm.hh
--- a/src/cpu/kvm/vm.hh Tue Feb 14 15:09:18 2017 -0600
+++ b/src/cpu/kvm/vm.hh Tue Feb 14 15:09:18 2017 -0600
@@ -400,6 +400,11 @@
     /** Global KVM interface */
     Kvm *kvm;
 
+    /**
+     * Initialize system pointer. Invoked by system object.
+     */
+    void setSystem(System *s);
+
 #if defined(__aarch64__)
   public: // ARM-specific
     /**
diff -r 0b311345ac72 -r dd6df2e47c14 src/sim/System.py
--- a/src/sim/System.py Tue Feb 14 15:09:18 2017 -0600
+++ b/src/sim/System.py Tue Feb 14 15:09:18 2017 -0600
@@ -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 @@
     # 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 -r 0b311345ac72 -r dd6df2e47c14 src/sim/system.cc
--- a/src/sim/system.cc Tue Feb 14 15:09:18 2017 -0600
+++ b/src/sim/system.cc Tue Feb 14 15:09:18 2017 -0600
@@ -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 @@
       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 @@
     // 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 -r 0b311345ac72 -r dd6df2e47c14 src/sim/system.hh
--- a/src/sim/system.hh Tue Feb 14 15:09:18 2017 -0600
+++ b/src/sim/system.hh Tue Feb 14 15:09:18 2017 -0600
@@ -72,6 +72,7 @@
 
 class BaseRemoteGDB;
 class GDBListener;
+class KvmVM;
 class ObjectFile;
 class ThreadContext;
 
@@ -249,6 +250,14 @@
     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 @@
 
   protected:
 
+    KvmVM *const kvmVM;
+
     PhysicalMemory physmem;
 
     Enums::MemoryMode memoryMode;
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to