config: allow more than 3GB of memory for x86 simulations
authorNilay Vaish <nilay@cs.wisc.edu>
Tue, 28 Jan 2014 00:50:51 +0000 (18:50 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Tue, 28 Jan 2014 00:50:51 +0000 (18:50 -0600)
This patch edits the configuration files so that x86 simulations can have
more than 3GB of memory.  It also corrects a bug in the MemConfig.py script.

configs/common/FSConfig.py
configs/common/MemConfig.py
configs/example/fs.py

index 58ad1a7c91765870729333223d2d07eb31e65bcf..84dbb9b3aa84ad88f2d12e4cf53a3ec2348e3b00 100644 (file)
@@ -407,7 +407,16 @@ def makeX86System(mem_mode, numCPUs = 1, mdesc = None, self = None,
     self.mem_mode = mem_mode
 
     # Physical memory
-    self.mem_ranges = [AddrRange(mdesc.mem())]
+    # On the PC platform, the memory region 0xC0000000-0xFFFFFFFF is reserved
+    # for various devices.  Hence, if the physical memory size is greater than
+    # 3GB, we need to split it into two parts.
+    excess_mem_size = \
+        convert.toMemorySize(mdesc.mem()) - convert.toMemorySize('3GB')
+    if excess_mem_size <= 0:
+        self.mem_ranges = [AddrRange(mdesc.mem())]
+    else:
+        self.mem_ranges = [AddrRange('3GB'),
+            AddrRange(Addr('4GB'), size = excess_mem_size)]
 
     # Platform
     self.pc = Pc()
@@ -501,21 +510,32 @@ def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None,
     # just to avoid corner cases.
     phys_mem_size = sum(map(lambda r: r.size(), self.mem_ranges))
     assert(phys_mem_size >= 0x200000)
+    assert(len(self.mem_ranges) <= 2)
 
-    self.e820_table.entries = \
+    entries = \
        [
         # Mark the first megabyte of memory as reserved
         X86E820Entry(addr = 0, size = '639kB', range_type = 1),
         X86E820Entry(addr = 0x9fc00, size = '385kB', range_type = 2),
-        # Mark the rest as available
+        # Mark the rest of physical memory as available
         X86E820Entry(addr = 0x100000,
-                size = '%dB' % (phys_mem_size - 0x100000),
+                size = '%dB' % (self.mem_ranges[0].size() - 0x100000),
                 range_type = 1),
         # Reserve the last 16kB of the 32-bit address space for the
         # m5op interface
         X86E820Entry(addr=0xFFFF0000, size='64kB', range_type=2),
         ]
 
+    # In case the physical memory is greater than 3GB, we split it into two
+    # parts and add a separate e820 entry for the second part.  This entry
+    # starts at 0x100000000,  which is the first address after the space
+    # reserved for devices.
+    if len(self.mem_ranges) == 2:
+        entries.append(X86E820Entry(addr = 0x100000000,
+            size = '%dB' % (self.mem_ranges[1].size()), range_type = 1))
+
+    self.e820_table.entries = entries
+
     # Command line
     self.boot_osflags = 'earlyprintk=ttyS0 console=ttyS0 lpj=7999923 ' + \
                         'root=/dev/hda1'
index a74ff1d62844f49527a4889cbed30dc7e23e4b74..456ff4e1d41e94310d3ee04c816306b3de967d04 100644 (file)
@@ -189,5 +189,5 @@ def config_mem(options, system):
     system.mem_ctrls = mem_ctrls
 
     # Connect the controllers to the membus
-    for i in xrange(nbr_mem_ctrls):
+    for i in xrange(len(system.mem_ctrls)):
         system.mem_ctrls[i].port = system.membus.master
index cb9b264d21ffae3d85247ccc0875e20d44abb43d..824c4a2dcbc5e2fbd4c6ceced448eec933ad6df7 100644 (file)
@@ -96,7 +96,8 @@ if options.benchmark:
         sys.exit(1)
 else:
     if options.dual:
-        bm = [SysConfig(disk=options.disk_image, mem=options.mem_size), SysConfig(disk=options.disk_image, mem=options.mem_size)]
+        bm = [SysConfig(disk=options.disk_image, mem=options.mem_size),
+              SysConfig(disk=options.disk_image, mem=options.mem_size)]
     else:
         bm = [SysConfig(disk=options.disk_image, mem=options.mem_size)]