Merge ktlim@zizzer.eecs.umich.edu:/bk/m5
authorKevin Lim <ktlim@umich.edu>
Fri, 18 Mar 2005 20:32:53 +0000 (15:32 -0500)
committerKevin Lim <ktlim@umich.edu>
Fri, 18 Mar 2005 20:32:53 +0000 (15:32 -0500)
into zamp.eecs.umich.edu:/z/ktlim2/m5

--HG--
extra : convert_revision : cbf8da2fe5c4155d9ed8318597d543ff105449d3

23 files changed:
arch/alpha/alpha_tru64_process.cc
configs/splash2/run.mpy
cpu/simple_cpu/simple_cpu.cc
dev/ns_gige.cc
python/m5/config.py
python/m5/objects/AlphaConsole.mpy
python/m5/objects/BaseCPU.mpy
python/m5/objects/BaseSystem.mpy
python/m5/objects/Device.mpy
python/m5/objects/Ethernet.mpy
python/m5/objects/Ide.mpy
python/m5/objects/IntrControl.mpy
python/m5/objects/Pci.mpy
python/m5/objects/PhysicalMemory.mpy
python/m5/objects/Platform.mpy
python/m5/objects/SimConsole.mpy
python/m5/objects/SimpleDisk.mpy
python/m5/objects/Tsunami.mpy
python/m5/objects/Uart.mpy
python/m5/smartdict.py
sim/process.cc
sim/process.hh
sim/syscall_emul.hh

index 1722b658e8a65ec1d7b9b0831db284b98a4fc78f..a211e0ae84e61c3753389048b40a21c7b0f5f056 100644 (file)
@@ -877,6 +877,10 @@ class Tru64 {
         *configptr_ptr = config_addr;
         configptr_ptr.copyOut(xc->mem);
 
+        // Register this as a valid address range with the process
+        process->nxm_start = base_addr;
+        process->nxm_end = cur_addr;
+
         return 0;
     }
 
index a19dcdc939c6ae038c3ef27cf5963c06cec7d711..800bff6f85cf672d9e9982acccb7f39e95a26bd9 100644 (file)
@@ -5,12 +5,12 @@ if 'SYSTEM' not in env:
 
 if env['SYSTEM'] == 'Simple':
     from SimpleConfig import *
-    BaseCPU.workload = Super.workload
+    BaseCPU.workload = parent.workload
     SimpleStandAlone.cpu = [ CPU() for i in xrange(int(env['NP'])) ]
     root = SimpleStandAlone
 elif env['SYSTEM'] == 'Detailed':
     from DetailedConfig import *
-    BaseCPU.workload = Super.workload
+    BaseCPU.workload = parent.workload
     DetailedStandAlone.cpu = [ DetailedCPU() for i in xrange(int(env['NP'])) ]
     root = DetailedStandAlone
 else:
index 254c21b155f96fec051423cf63956c92e21132dd..62bbb2fa8ee08002e2d39d23c1bf6320bfce5ce0 100644 (file)
@@ -393,13 +393,11 @@ template <class T>
 Fault
 SimpleCPU::read(Addr addr, T &data, unsigned flags)
 {
-    if (status() == DcacheMissStall) {
+    if (status() == DcacheMissStall || status() == DcacheMissSwitch) {
         Fault fault = xc->read(memReq,data);
 
         if (traceData) {
             traceData->setAddr(addr);
-            if (fault == No_Fault)
-                traceData->setData(data);
         }
         return fault;
     }
@@ -428,21 +426,11 @@ SimpleCPU::read(Addr addr, T &data, unsigned flags)
             // do functional access
             fault = xc->read(memReq, data);
 
-            if (traceData) {
-                traceData->setAddr(addr);
-                if (fault == No_Fault)
-                    traceData->setData(data);
-            }
         }
     } else if(fault == No_Fault) {
         // do functional access
         fault = xc->read(memReq, data);
 
-        if (traceData) {
-            traceData->setAddr(addr);
-            if (fault == No_Fault)
-                traceData->setData(data);
-        }
     }
 
     if (!dcacheInterface && (memReq->flags & UNCACHEABLE))
@@ -498,11 +486,6 @@ template <class T>
 Fault
 SimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
 {
-    if (traceData) {
-        traceData->setAddr(addr);
-        traceData->setData(data);
-    }
-
     memReq->reset(addr, sizeof(T), flags);
 
     // translate to physical address
@@ -602,6 +585,8 @@ SimpleCPU::processCacheCompletion()
       case DcacheMissStall:
         if (memReq->cmd.isRead()) {
             curStaticInst->execute(this,traceData);
+            if (traceData)
+                traceData->finalize();
         }
         dcacheStallCycles += curTick - lastDcacheStall;
         _status = Running;
@@ -610,6 +595,8 @@ SimpleCPU::processCacheCompletion()
       case DcacheMissSwitch:
         if (memReq->cmd.isRead()) {
             curStaticInst->execute(this,traceData);
+            if (traceData)
+                traceData->finalize();
         }
         _status = SwitchedOut;
         sampler->signalSwitched();
@@ -782,8 +769,12 @@ SimpleCPU::tick()
             comLoadEventQueue[0]->serviceEvents(numLoad);
         }
 
-        if (traceData)
+        // If we have a dcache miss, then we can't finialize the instruction
+        // trace yet because we want to populate it with the data later
+        if (traceData &&
+                !(status() == DcacheMissStall && memReq->cmd.isRead())) {
             traceData->finalize();
+        }
 
         traceFunctions(xc->regs.pc);
 
index db1474d1cc9a412e3ce26d524ff8a1e4bafdd880..53a881ef704dbf41f8dbfc57897070657fa052d8 100644 (file)
@@ -1597,8 +1597,10 @@ NSGigE::rxKick()
                     DPRINTF(Ethernet, "ID is %d\n", ip->id());
                     TcpPtr tcp(ip);
                     if (tcp) {
-                        DPRINTF(Ethernet, "Src Port=%d, Dest Port=%d\n",
-                                tcp->sport(), tcp->dport());
+                        DPRINTF(Ethernet,
+                                "Src Port=%d, Dest Port=%d, Seq=%d, Ack=%d\n",
+                                tcp->sport(), tcp->dport(), tcp->seq(),
+                                tcp->ack());
                     }
                 }
             }
@@ -1803,14 +1805,15 @@ NSGigE::transmit()
                 DPRINTF(Ethernet, "ID is %d\n", ip->id());
                 TcpPtr tcp(ip);
                 if (tcp) {
-                    DPRINTF(Ethernet, "Src Port=%d, Dest Port=%d\n",
-                            tcp->sport(), tcp->dport());
+                    DPRINTF(Ethernet,
+                            "Src Port=%d, Dest Port=%d, Seq=%d, Ack=%d\n",
+                            tcp->sport(), tcp->dport(), tcp->seq(), tcp->ack());
                 }
             }
         }
 #endif
 
-        DDUMP(Ethernet, txFifo.front()->data, txFifo.front()->length);
+        DDUMP(EthernetData, txFifo.front()->data, txFifo.front()->length);
         txBytes += txFifo.front()->length;
         txPackets++;
 
@@ -2296,8 +2299,18 @@ NSGigE::recvPacket(PacketPtr packet)
     }
 
     if (rxFifo.avail() < packet->length) {
-        DPRINTF(Ethernet,
-                "packet will not fit in receive buffer...packet dropped\n");
+#if TRACING_ON
+        IpPtr ip(packet);
+        TcpPtr tcp(ip);
+        if (ip) {
+            DPRINTF(Ethernet,
+                    "packet won't fit in receive buffer...pkt ID %d dropped\n",
+                    ip->id());
+            if (tcp) {
+                DPRINTF(Ethernet, "Seq=%d\n", tcp->seq());
+            }
+        }
+#endif
         droppedPackets++;
         devIntrPost(ISR_RXORN);
         return false;
index 182acf393e82b651fbb690c6da6263392b8a012a..64ec994906ee3a5b12062017e18695aac078a55c 100644 (file)
@@ -27,6 +27,7 @@
 from __future__ import generators
 import os, re, sys, types, inspect
 
+from m5 import panic
 from convert import *
 
 noDot = False
@@ -139,25 +140,91 @@ class Singleton(type):
 #####################################################################
 
 class Proxy(object):
-    def __init__(self, path = ()):
+    def __init__(self, path):
         self._object = None
-        self._path = path
+        if path == 'any':
+            self._path = None
+        else:
+            # path is a list of (attr,index) tuples
+            self._path = [(path,None)]
+        self._index = None
+        self._multiplier = None
 
     def __getattr__(self, attr):
-        return Proxy(self._path + (attr, ))
+        if attr == '__bases__':
+            return super(Proxy, self).__getattr__(self, attr)
+        self._path.append((attr,None))
+        return self
 
     def __setattr__(self, attr, value):
         if not attr.startswith('_'):
             raise AttributeError, 'cannot set attribute %s' % attr
         super(Proxy, self).__setattr__(attr, value)
 
-    def _convert(self):
-        obj = self._object
-        for attr in self._path:
-            obj = obj.__getattribute__(attr)
+    # support indexing on proxies (e.g., parent.cpu[0])
+    def __getitem__(self, key):
+        if not isinstance(key, int):
+            raise TypeError, "Proxy object requires integer index"
+        if self._path == None:
+            raise IndexError, "Index applied to 'any' proxy"
+        # replace index portion of last path element with new index
+        self._path[-1] = (self._path[-1][0], key)
+        return self
+
+    # support multiplying proxies by constants
+    def __mul__(self, other):
+        if not isinstance(other, int):
+            raise TypeError, "Proxy multiplier must be integer"
+        if self._multiplier == None:
+            self._multiplier = other
+        else:
+            # support chained multipliers
+            self._multiplier *= other
+        return self
+
+    def _mulcheck(self, result):
+        if self._multiplier == None:
+            return result
+        if not isinstance(result, int):
+            raise TypeError, "Proxy with multiplier resolves to " \
+                  "non-integer value"
+        return result * self._multiplier
+
+    def unproxy(self, base, ptype):
+        obj = base
+        done = False
+        while not done:
+            if obj is None:
+                raise AttributeError, \
+                      'Parent of %s type %s not found at path %s' \
+                      % (base.name, ptype, self._path)
+            result, done = obj.find(ptype, self._path)
+            obj = obj.parent
+
+        if isinstance(result, Proxy):
+            result = result.unproxy(obj, ptype)
+
+        return self._mulcheck(result)
+
+    def getindex(obj, index):
+        if index == None:
+            return obj
+        try:
+            obj = obj[index]
+        except TypeError:
+            if index != 0:
+                raise
+            # if index is 0 and item is not subscriptable, just
+            # use item itself (so cpu[0] works on uniprocessors)
         return obj
+    getindex = staticmethod(getindex)
+
+class ProxyFactory(object):
+    def __getattr__(self, attr):
+        return Proxy(attr)
 
-Super = Proxy()
+# global object for handling parent.foo proxies
+parent = ProxyFactory()
 
 def isSubClass(value, cls):
     try:
@@ -643,50 +710,40 @@ class Node(object):
                 if issubclass(child.realtype, realtype):
                     if obj is not None:
                         raise AttributeError, \
-                              'Super matched more than one: %s %s' % \
+                              'parent.any matched more than one: %s %s' % \
                               (obj.path, child.path)
                     obj = child
             return obj, obj is not None
 
         try:
             obj = self
-            for node in path[:-1]:
-                obj = obj.child_names[node]
+            for (node,index) in path[:-1]:
+                if obj.child_names.has_key(node):
+                    obj = obj.child_names[node]
+                else:
+                    obj = obj.top_child_names[node]
+                obj = Proxy.getindex(obj, index)
 
-            last = path[-1]
+            (last,index) = path[-1]
             if obj.child_names.has_key(last):
                 value = obj.child_names[last]
-                if issubclass(value.realtype, realtype):
-                    return value, True
+                return Proxy.getindex(value, index), True
+            elif obj.top_child_names.has_key(last):
+                value = obj.top_child_names[last]
+                return Proxy.getindex(value, index), True
             elif obj.param_names.has_key(last):
                 value = obj.param_names[last]
                 realtype._convert(value.value)
-                return value.value, True
+                return Proxy.getindex(value.value, index), True
         except KeyError:
             pass
 
         return None, False
 
-    def unproxy(self, ptype, value):
-        if not isinstance(value, Proxy):
-            return value
-
-        if value is None:
-            raise AttributeError, 'Error while fixing up %s' % self.path
-
-        obj = self
-        done = False
-        while not done:
-            if obj is None:
-                raise AttributeError, \
-                      'Parent of %s type %s not found at path %s' \
-                      % (self.name, ptype, value._path)
-            found, done = obj.find(ptype, value._path)
-            if isinstance(found, Proxy):
-                done = False
-            obj = obj.parent
-
-        return found
+    def unproxy(self, param, ptype):
+        if not isinstance(param, Proxy):
+            return param
+        return param.unproxy(self, ptype)
 
     def fixup(self):
         self.all[self.path] = self
@@ -697,9 +754,9 @@ class Node(object):
 
             try:
                 if isinstance(pval, (list, tuple)):
-                    param.value = [ self.unproxy(ptype, pv) for pv in pval ]
+                    param.value = [ self.unproxy(pv, ptype) for pv in pval ]
                 else:
-                    param.value = self.unproxy(ptype, pval)
+                    param.value = self.unproxy(pval, ptype)
             except:
                 print 'Error while fixing up %s:%s' % (self.path, param.name)
                 raise
@@ -840,6 +897,9 @@ class Value(object):
     def __str__(self):
         return str(self._getattr())
 
+    def __len__(self):
+        return len(self._getattr())
+
 # Regular parameter.
 class _Param(object):
     def __init__(self, ptype, *args, **kwargs):
@@ -1337,7 +1397,7 @@ class SimObject(ConfigNode, ParamType):
 # 'from config import *' is invoked.  Try to keep this reasonably
 # short to avoid polluting other namespaces.
 __all__ = ['ConfigNode', 'SimObject', 'ParamContext', 'Param', 'VectorParam',
-           'Super', 'Enum',
+           'parent', 'Enum',
            'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
            'Int32', 'UInt32', 'Int64', 'UInt64',
            'Counter', 'Addr', 'Tick', 'Percent',
index 79918a01e273c36cbcbf2e46d2937cc55c3d459a..63aea5b7d6e70935840f273b971179706f4efec7 100644 (file)
@@ -2,8 +2,8 @@ from Device import PioDevice
 
 simobj AlphaConsole(PioDevice):
     type = 'AlphaConsole'
-    cpu = Param.BaseCPU(Super, "Processor")
+    cpu = Param.BaseCPU(parent.any, "Processor")
     disk = Param.SimpleDisk("Simple Disk")
     num_cpus = Param.Int(1, "Number of CPUs")
-    sim_console = Param.SimConsole(Super, "The Simulator Console")
-    system = Param.BaseSystem(Super, "system object")
+    sim_console = Param.SimConsole(parent.any, "The Simulator Console")
+    system = Param.BaseSystem(parent.any, "system object")
index 5d8305d888a4480df476b80f0b5c05be0df34007..d84e30e5344e3499ca46993b3d1180928a8d8b5d 100644 (file)
@@ -8,7 +8,7 @@ simobj BaseCPU(SimObject):
         dtb = Param.AlphaDTB("Data TLB")
         itb = Param.AlphaITB("Instruction TLB")
         mem = Param.FunctionalMemory("memory")
-        system = Param.BaseSystem(Super, "system object")
+        system = Param.BaseSystem(parent.any, "system object")
     else:
         workload = VectorParam.Process("processes to run")
 
index 1cbdf4e99ac3f9bfd2d2b96dfdb2af28826c6b4a..450b6a58e1cc4e8ddfb0617fb849f113bfc50d5e 100644 (file)
@@ -1,8 +1,8 @@
 simobj BaseSystem(SimObject):
     type = 'BaseSystem'
     abstract = True
-    memctrl = Param.MemoryController(Super, "memory controller")
-    physmem = Param.PhysicalMemory(Super, "phsyical memory")
+    memctrl = Param.MemoryController(parent.any, "memory controller")
+    physmem = Param.PhysicalMemory(parent.any, "phsyical memory")
     kernel = Param.String("file that contains the kernel code")
     console = Param.String("file that contains the console code")
     pal = Param.String("file that contains palcode")
index 47f8db1cbe790115acbdc4d8b07418b27cbb60fd..a0d02a647300dfa1ea59a6365e27f540da61be26 100644 (file)
@@ -14,7 +14,7 @@ simobj FooPioDevice(FunctionalMemory):
     type = 'PioDevice'
     abstract = True
     addr = Param.Addr("Device Address")
-    mmu = Param.MemoryController(Super, "Memory Controller")
+    mmu = Param.MemoryController(parent.any, "Memory Controller")
     io_bus = Param.Bus(NULL, "The IO Bus to attach to")
     pio_latency = Param.Tick(1, "Programmed IO latency in bus cycles")
 
@@ -25,7 +25,7 @@ simobj FooDmaDevice(FooPioDevice):
 simobj PioDevice(FooPioDevice):
     type = 'PioDevice'
     abstract = True
-    platform = Param.Platform(Super, "Platform")
+    platform = Param.Platform(parent.any, "Platform")
 
 simobj DmaDevice(PioDevice):
     type = 'DmaDevice'
index 088df4b9328d44222ae2ca03ad35fba5a0421708..cd251f36da09903c0b59758446df4224804e1dcc 100644 (file)
@@ -49,8 +49,8 @@ simobj EtherDev(DmaDevice):
 
     intr_delay = Param.Tick(0, "Interrupt Delay in microseconds")
     payload_bus = Param.Bus(NULL, "The IO Bus to attach to for payload")
-    physmem = Param.PhysicalMemory(Super, "Physical Memory")
-    tlaser = Param.Turbolaser(Super, "Turbolaser")
+    physmem = Param.PhysicalMemory(parent.any, "Physical Memory")
+    tlaser = Param.Turbolaser(parent.any, "Turbolaser")
 
 simobj NSGigE(PciDevice):
     type = 'NSGigE'
@@ -73,7 +73,7 @@ simobj NSGigE(PciDevice):
 
     intr_delay = Param.Tick(0, "Interrupt Delay in microseconds")
     payload_bus = Param.Bus(NULL, "The IO Bus to attach to for payload")
-    physmem = Param.PhysicalMemory(Super, "Physical Memory")
+    physmem = Param.PhysicalMemory(parent.any, "Physical Memory")
 
 simobj EtherDevInt(EtherInt):
     type = 'EtherDevInt'
index ce760ad96bbaf7656151c7831774653bfa41aecf..786109efa4758cef2e9737d10283fbb88e63b48b 100644 (file)
@@ -7,7 +7,7 @@ simobj IdeDisk(SimObject):
     delay = Param.Tick(1, "Fixed disk delay in microseconds")
     driveID = Param.IdeID('master', "Drive ID")
     image = Param.DiskImage("Disk image")
-    physmem = Param.PhysicalMemory(Super, "Physical memory")
+    physmem = Param.PhysicalMemory(parent.any, "Physical memory")
 
 simobj IdeController(PciDevice):
     type = 'IdeController'
index 1ef5a17ee3d999f14771ba4029fb92a7f42fa65d..144be0fd46b36d93ac37aede5e2715bd74efcb7d 100644 (file)
@@ -1,3 +1,3 @@
 simobj IntrControl(SimObject):
     type = 'IntrControl'
-    cpu = Param.BaseCPU(Super, "the cpu")
+    cpu = Param.BaseCPU(parent.any, "the cpu")
index f7c6674f74446f71b358c246a19c778287ec4857..b9b3e5a956da45f6f132c0ec796d657e7cc9817d 100644 (file)
@@ -47,5 +47,5 @@ simobj PciDevice(DmaDevice):
     pci_bus = Param.Int("PCI bus")
     pci_dev = Param.Int("PCI device number")
     pci_func = Param.Int("PCI function code")
-    configdata = Param.PciConfigData(Super, "PCI Config data")
-    configspace = Param.PciConfigAll(Super, "PCI Configspace")
+    configdata = Param.PciConfigData(parent.any, "PCI Config data")
+    configspace = Param.PciConfigAll(parent.any, "PCI Configspace")
index d1e4ad4b401942cccac1f7d93d2fc88c44ec2a12..e6df2a1614e0708ec2ee47b423eed97e80b7f9d4 100644 (file)
@@ -4,4 +4,4 @@ simobj PhysicalMemory(FunctionalMemory):
     type = 'PhysicalMemory'
     range = Param.AddrRange("Device Address")
     file = Param.String('', "memory mapped file")
-    mmu = Param.MemoryController(Super, "Memory Controller")
+    mmu = Param.MemoryController(parent.any, "Memory Controller")
index d0510eaf873c0ce68d770e298271a30516ae6754..a71ab3b770d392a9f1ffe4f03e72e3d0e350fd26 100644 (file)
@@ -2,4 +2,4 @@ simobj Platform(SimObject):
     type = 'Platform'
     abstract = True
     interrupt_frequency = Param.Tick(1200, "frequency of interrupts")
-    intrctrl = Param.IntrControl(Super, "interrupt controller")
+    intrctrl = Param.IntrControl(parent.any, "interrupt controller")
index fb74f177502298a05e93f208940768681807322d..3588a949d8966189c4918bc4ed0c4ae2d3f14886 100644 (file)
@@ -5,7 +5,7 @@ simobj ConsoleListener(SimObject):
 simobj SimConsole(SimObject):
     type = 'SimConsole'
     append_name = Param.Bool(True, "append name() to filename")
-    intr_control = Param.IntrControl(Super, "interrupt controller")
+    intr_control = Param.IntrControl(parent.any, "interrupt controller")
     listener = Param.ConsoleListener("console listener")
     number = Param.Int(0, "console number")
     output = Param.String('console', "file to dump output to")
index c4dd5435bf3e5ee92f1b983667d04547078315f0..b616fb3d128e09d04907201a25acfd3e57886152 100644 (file)
@@ -1,4 +1,4 @@
 simobj SimpleDisk(SimObject):
     type = 'SimpleDisk'
     disk = Param.DiskImage("Disk Image")
-    physmem = Param.PhysicalMemory(Super, "Physical Memory")
+    physmem = Param.PhysicalMemory(parent.any, "Physical Memory")
index cfe23977e040c593ddade959ad9e3c55d970543e..a8471cee23319a7e4bddbff28a0993a5c4ad0e26 100644 (file)
@@ -4,12 +4,12 @@ from Platform import Platform
 simobj Tsunami(Platform):
     type = 'Tsunami'
     pciconfig = Param.PciConfigAll("PCI configuration")
-    system = Param.BaseSystem(Super, "system")
+    system = Param.BaseSystem(parent.any, "system")
     interrupt_frequency = Param.Int(1024, "frequency of interrupts")
 
 simobj TsunamiCChip(FooPioDevice):
     type = 'TsunamiCChip'
-    tsunami = Param.Tsunami(Super, "Tsunami")
+    tsunami = Param.Tsunami(parent.any, "Tsunami")
 
 simobj TsunamiFake(FooPioDevice):
     type = 'TsunamiFake'
@@ -18,8 +18,8 @@ simobj TsunamiIO(FooPioDevice):
     type = 'TsunamiIO'
     time = Param.UInt64(1136073600,
         "System time to use (0 for actual time, default is 1/1/06)")
-    tsunami = Param.Tsunami(Super, "Tsunami")
+    tsunami = Param.Tsunami(parent.any, "Tsunami")
 
 simobj TsunamiPChip(FooPioDevice):
     type = 'TsunamiPChip'
-    tsunami = Param.Tsunami(Super, "Tsunami")
+    tsunami = Param.Tsunami(parent.any, "Tsunami")
index 76ee8805f8569ae30f8f4fbdbb7cc74044de5713..5a6c25f8ec74d63d81665363e8dac96aaf1f8586 100644 (file)
@@ -2,5 +2,5 @@ from Device import PioDevice
 
 simobj Uart(PioDevice):
     type = 'Uart'
-    console = Param.SimConsole(Super, "The console")
+    console = Param.SimConsole(parent.any, "The console")
     size = Param.Addr(0x8, "Device size")
index 4ea8210d361cf2bc760d13f871c2ee8b2cc26a8c..1ba5d8410b773b30afd2cb7ea8254d3347b35ca4 100644 (file)
@@ -74,6 +74,12 @@ class SmartDict(dict):
             return other / self.convert(other)
 
 
+    # __getitem__ uses dict.get() to return 'False' if the key is not
+    # found (rather than raising KeyError).  Note that this does *not*
+    # set the key's value to 'False' in the dict, so that even after
+    # we call env['foo'] we still get a meaningful answer from "'foo'
+    # in env" (which calls dict.__contains__, which we do not
+    # override).
     def __getitem__(self, key):
         return self.Proxy(dict.get(self, key, 'False'))
 
index 7111e873373f6d029c22e8be2ee5b1bb77a97787..c18b31da765b587b357f256d932d1ccc0c7df0ab 100644 (file)
@@ -89,6 +89,7 @@ Process::Process(const string &nm,
     }
 
     mmap_start = mmap_end = 0;
+    nxm_start = nxm_end = 0;
     // other parameters will be initialized when the program is loaded
 }
 
index 1ab43cd62b4fb3291090dd41fc1275eed3859468..51d7639aca9a1b9a0a968e74810955561f986357 100644 (file)
@@ -97,6 +97,10 @@ class Process : public SimObject
     Addr mmap_start;
     Addr mmap_end;
 
+    // Base of region for nxm data
+    Addr nxm_start;
+    Addr nxm_end;
+
     std::string prog_fname;    // file name
     Addr prog_entry;           // entry point (initial PC)
 
@@ -159,9 +163,10 @@ class Process : public SimObject
     bool validDataAddr(Addr addr)
     {
         return ((data_base <= addr && addr < brk_point) ||
-                ((stack_base - 16*1024*1024) <= addr && addr < stack_base) ||
+                (next_thread_stack_base <= addr && addr < stack_base) ||
                 (text_base <= addr && addr < (text_base + text_size)) ||
-                (mmap_start <= addr && addr < mmap_end));
+                (mmap_start <= addr && addr < mmap_end) ||
+                (nxm_start <= addr && addr < nxm_end));
     }
 
     virtual void syscall(ExecContext *xc) = 0;
index 51a075a28f84960fd95f3a483f93bae9ccd1d3c3..69c17c3309b2ba11b1678804dd53a26b3b4cb91e 100644 (file)
@@ -412,6 +412,10 @@ mmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
         // user didn't give an address... pick one from our "mmap region"
         start = p->mmap_end;
         p->mmap_end += RoundUp<Addr>(length, VMPageSize);
+        if (p->nxm_start != 0) {
+            //If we have an nxm space, make sure we haven't colided
+            assert(p->mmap_end < p->nxm_start);
+        }
     }
 
     if (!(flags & OS::TGT_MAP_ANONYMOUS)) {