summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/ruby/Ruby.py8
-rw-r--r--src/mem/ruby/system/RubyPort.cc35
-rw-r--r--src/mem/ruby/system/RubyPort.hh7
-rw-r--r--src/mem/ruby/system/RubySystem.py2
-rw-r--r--src/mem/ruby/system/Sequencer.py3
-rw-r--r--src/mem/ruby/system/System.cc1
-rw-r--r--src/mem/ruby/system/System.hh3
7 files changed, 31 insertions, 28 deletions
diff --git a/configs/ruby/Ruby.py b/configs/ruby/Ruby.py
index 35ff66a0c..b99e251d3 100644
--- a/configs/ruby/Ruby.py
+++ b/configs/ruby/Ruby.py
@@ -56,6 +56,9 @@ def define_options(parser):
default='2GHz',
help="Clock for blocks running at Ruby system's speed")
+ parser.add_option("--access-backing-store", action="store_true", default=False,
+ help="Should ruby maintain a second copy of memory")
+
# Options related to cache structure
parser.add_option("--ports", action="store", type="int", default=4,
help="used of transitions per cycle which is a proxy \
@@ -229,3 +232,8 @@ def create_system(options, full_system, system, piobus = None, dma_ports = []):
ruby._cpu_ports = cpu_sequencers
ruby.num_of_sequencers = len(cpu_sequencers)
ruby.random_seed = options.random_seed
+
+ # Create a backing copy of physical memory in case required
+ if options.access_backing_store:
+ ruby.phys_mem = SimpleMemory(range=AddrRange(options.mem_size),
+ in_addr_map=False)
diff --git a/src/mem/ruby/system/RubyPort.cc b/src/mem/ruby/system/RubyPort.cc
index 1374c3566..3abdecf3d 100644
--- a/src/mem/ruby/system/RubyPort.cc
+++ b/src/mem/ruby/system/RubyPort.cc
@@ -46,6 +46,7 @@
#include "mem/protocol/AccessPermission.hh"
#include "mem/ruby/slicc_interface/AbstractController.hh"
#include "mem/ruby/system/RubyPort.hh"
+#include "mem/simple_mem.hh"
#include "sim/full_system.hh"
#include "sim/system.hh"
@@ -57,16 +58,15 @@ RubyPort::RubyPort(const Params *p)
pioSlavePort(csprintf("%s.pio-slave-port", name()), this),
memMasterPort(csprintf("%s.mem-master-port", name()), this),
memSlavePort(csprintf("%s-mem-slave-port", name()), this,
- p->ruby_system, p->access_phys_mem, -1),
- gotAddrRanges(p->port_master_connection_count), drainManager(NULL),
- access_phys_mem(p->access_phys_mem)
+ p->ruby_system, p->access_backing_store, -1),
+ gotAddrRanges(p->port_master_connection_count), drainManager(NULL)
{
assert(m_version != -1);
// create the slave ports based on the number of connected ports
for (size_t i = 0; i < p->port_slave_connection_count; ++i) {
slave_ports.push_back(new MemSlavePort(csprintf("%s.slave%d", name(),
- i), this, p->ruby_system, access_phys_mem, i));
+ i), this, p->ruby_system, p->access_backing_store, i));
}
// create the master ports based on the number of connected ports
@@ -155,9 +155,10 @@ RubyPort::MemMasterPort::MemMasterPort(const std::string &_name,
}
RubyPort::MemSlavePort::MemSlavePort(const std::string &_name, RubyPort *_port,
- RubySystem *_system, bool _access_phys_mem, PortID id)
+ RubySystem *_system,
+ bool _access_backing_store, PortID id)
: QueuedSlavePort(_name, _port, queue, id), queue(*_port, *this),
- ruby_system(_system), access_phys_mem(_access_phys_mem)
+ ruby_system(_system), access_backing_store(_access_backing_store)
{
DPRINTF(RubyPort, "Created slave memport on ruby sequencer %s\n", _name);
}
@@ -281,11 +282,11 @@ void
RubyPort::MemSlavePort::recvFunctional(PacketPtr pkt)
{
DPRINTF(RubyPort, "Functional access for address: %#x\n", pkt->getAddr());
- RubyPort *ruby_port = static_cast<RubyPort *>(&owner);
// Check for pio requests and directly send them to the dedicated
// pio port.
if (!isPhysMemAddress(pkt->getAddr())) {
+ RubyPort *ruby_port M5_VAR_USED = static_cast<RubyPort *>(&owner);
assert(ruby_port->memMasterPort.isConnected());
DPRINTF(RubyPort, "Pio Request for address: 0x%#x\n", pkt->getAddr());
panic("RubyPort::PioMasterPort::recvFunctional() not implemented!\n");
@@ -314,23 +315,19 @@ RubyPort::MemSlavePort::recvFunctional(PacketPtr pkt)
pkt->isWrite() ? "write" : "read", pkt->getAddr());
}
- if (access_phys_mem) {
+ if (access_backing_store) {
// The attached physmem contains the official version of data.
// The following command performs the real functional access.
// This line should be removed once Ruby supplies the official version
// of data.
- ruby_port->system->getPhysMem().functionalAccess(pkt);
+ ruby_system->getPhysMem()->functionalAccess(pkt);
}
// turn packet around to go back to requester if response expected
if (needsResponse) {
pkt->setFunctionalResponseStatus(accessSucceeded);
-
- // @todo There should not be a reverse call since the response is
- // communicated through the packet pointer
- // DPRINTF(RubyPort, "Sending packet back over port\n");
- // sendFunctional(pkt);
}
+
DPRINTF(RubyPort, "Functional access %s!\n",
accessSucceeded ? "successful":"failed");
}
@@ -459,11 +456,9 @@ RubyPort::MemSlavePort::hitCallback(PacketPtr pkt)
{
bool needsResponse = pkt->needsResponse();
- //
// Unless specified at configuraiton, all responses except failed SC
// and Flush operations access M5 physical memory.
- //
- bool accessPhysMem = access_phys_mem;
+ bool accessPhysMem = access_backing_store;
if (pkt->isLLSC()) {
if (pkt->isWrite()) {
@@ -488,9 +483,7 @@ RubyPort::MemSlavePort::hitCallback(PacketPtr pkt)
}
}
- //
// Flush requests don't access physical memory
- //
if (pkt->isFlush()) {
accessPhysMem = false;
}
@@ -498,8 +491,7 @@ RubyPort::MemSlavePort::hitCallback(PacketPtr pkt)
DPRINTF(RubyPort, "Hit callback needs response %d\n", needsResponse);
if (accessPhysMem) {
- RubyPort *ruby_port = static_cast<RubyPort *>(&owner);
- ruby_port->system->getPhysMem().access(pkt);
+ ruby_system->getPhysMem()->functionalAccess(pkt);
} else if (needsResponse) {
pkt->makeResponse();
}
@@ -512,6 +504,7 @@ RubyPort::MemSlavePort::hitCallback(PacketPtr pkt)
} else {
delete pkt;
}
+
DPRINTF(RubyPort, "Hit callback done!\n");
}
diff --git a/src/mem/ruby/system/RubyPort.hh b/src/mem/ruby/system/RubyPort.hh
index 648580246..28a416663 100644
--- a/src/mem/ruby/system/RubyPort.hh
+++ b/src/mem/ruby/system/RubyPort.hh
@@ -73,14 +73,13 @@ class RubyPort : public MemObject
class MemSlavePort : public QueuedSlavePort
{
private:
-
SlavePacketQueue queue;
RubySystem* ruby_system;
- bool access_phys_mem;
+ bool access_backing_store;
public:
MemSlavePort(const std::string &_name, RubyPort *_port,
- RubySystem*_system, bool _access_phys_mem, PortID id);
+ RubySystem*_system, bool _access_backing_store, PortID id);
void hitCallback(PacketPtr pkt);
void evictionCallback(const Address& address);
@@ -212,8 +211,6 @@ class RubyPort : public MemObject
// that should be called when the Sequencer becomes available after a stall.
//
std::vector<MemSlavePort *> retryList;
-
- bool access_phys_mem;
};
#endif // __MEM_RUBY_SYSTEM_RUBYPORT_HH__
diff --git a/src/mem/ruby/system/RubySystem.py b/src/mem/ruby/system/RubySystem.py
index 77bd9448d..0deb79405 100644
--- a/src/mem/ruby/system/RubySystem.py
+++ b/src/mem/ruby/system/RubySystem.py
@@ -29,6 +29,7 @@
from m5.params import *
from ClockedObject import ClockedObject
+from SimpleMemory import *
class RubySystem(ClockedObject):
type = 'RubySystem'
@@ -45,3 +46,4 @@ class RubySystem(ClockedObject):
hot_lines = Param.Bool(False, "")
all_instructions = Param.Bool(False, "")
num_of_sequencers = Param.Int("")
+ phys_mem = Param.SimpleMemory(NULL, "")
diff --git a/src/mem/ruby/system/Sequencer.py b/src/mem/ruby/system/Sequencer.py
index b54924ba7..d91c2200f 100644
--- a/src/mem/ruby/system/Sequencer.py
+++ b/src/mem/ruby/system/Sequencer.py
@@ -45,7 +45,7 @@ class RubyPort(MemObject):
mem_slave_port = SlavePort("Ruby memory port")
using_ruby_tester = Param.Bool(False, "")
- access_phys_mem = Param.Bool(False,
+ access_backing_store = Param.Bool(False,
"should the rubyport atomically update phys_mem")
ruby_system = Param.RubySystem("")
system = Param.System(Parent.any, "system object")
@@ -55,7 +55,6 @@ class RubyPort(MemObject):
class RubyPortProxy(RubyPort):
type = 'RubyPortProxy'
cxx_header = "mem/ruby/system/RubyPortProxy.hh"
- access_phys_mem = False
class RubySequencer(RubyPort):
type = 'RubySequencer'
diff --git a/src/mem/ruby/system/System.cc b/src/mem/ruby/system/System.cc
index 066cfae87..6aad5bd05 100644
--- a/src/mem/ruby/system/System.cc
+++ b/src/mem/ruby/system/System.cc
@@ -77,6 +77,7 @@ RubySystem::RubySystem(const Params *p)
Stats::registerDumpCallback(new RubyStatsCallback(this));
// Create the profiler
m_profiler = new Profiler(p);
+ m_phys_mem = p->phys_mem;
}
void
diff --git a/src/mem/ruby/system/System.hh b/src/mem/ruby/system/System.hh
index 81c6029c6..06f1c514f 100644
--- a/src/mem/ruby/system/System.hh
+++ b/src/mem/ruby/system/System.hh
@@ -75,6 +75,8 @@ class RubySystem : public ClockedObject
static uint32_t getBlockSizeBits() { return m_block_size_bits; }
static uint32_t getMemorySizeBits() { return m_memory_size_bits; }
+ SimpleMemory *getPhysMem() { return m_phys_mem; }
+
// Public Methods
Profiler*
getProfiler()
@@ -122,6 +124,7 @@ class RubySystem : public ClockedObject
static uint32_t m_block_size_bytes;
static uint32_t m_block_size_bits;
static uint32_t m_memory_size_bits;
+ SimpleMemory *m_phys_mem;
Network* m_network;
std::vector<AbstractController *> m_abs_cntrl_vec;