diff options
Diffstat (limited to 'src/mem/ruby/structures')
-rw-r--r-- | src/mem/ruby/structures/DirectoryMemory.cc | 2 | ||||
-rw-r--r-- | src/mem/ruby/structures/DirectoryMemory.hh | 3 | ||||
-rw-r--r-- | src/mem/ruby/structures/MemoryControl.hh | 4 | ||||
-rw-r--r-- | src/mem/ruby/structures/RubyMemoryControl.cc | 27 | ||||
-rw-r--r-- | src/mem/ruby/structures/RubyMemoryControl.hh | 12 |
5 files changed, 32 insertions, 16 deletions
diff --git a/src/mem/ruby/structures/DirectoryMemory.cc b/src/mem/ruby/structures/DirectoryMemory.cc index 94775aa78..04849e31f 100644 --- a/src/mem/ruby/structures/DirectoryMemory.cc +++ b/src/mem/ruby/structures/DirectoryMemory.cc @@ -57,7 +57,6 @@ DirectoryMemory::init() m_entries = new AbstractEntry*[m_num_entries]; for (int i = 0; i < m_num_entries; i++) m_entries[i] = NULL; - m_ram = g_system_ptr->getMemoryVector(); m_num_directories++; m_num_directories_bits = ceilLog2(m_num_directories); @@ -132,7 +131,6 @@ DirectoryMemory::allocate(const PhysAddress& address, AbstractEntry* entry) idx = mapAddressToLocalIdx(address); assert(idx < m_num_entries); - entry->getDataBlk().assign(m_ram->getBlockPtr(address)); entry->changePermission(AccessPermission_Read_Only); m_entries[idx] = entry; diff --git a/src/mem/ruby/structures/DirectoryMemory.hh b/src/mem/ruby/structures/DirectoryMemory.hh index 523f16531..b75e6ab72 100644 --- a/src/mem/ruby/structures/DirectoryMemory.hh +++ b/src/mem/ruby/structures/DirectoryMemory.hh @@ -35,7 +35,6 @@ #include "mem/protocol/DirectoryRequestType.hh" #include "mem/ruby/common/Address.hh" #include "mem/ruby/slicc_interface/AbstractEntry.hh" -#include "mem/ruby/structures/MemoryVector.hh" #include "params/RubyDirectoryMemory.hh" #include "sim/sim_object.hh" @@ -80,8 +79,6 @@ class DirectoryMemory : public SimObject static int m_num_directories_bits; static uint64_t m_total_size_bytes; static int m_numa_high_bit; - - MemoryVector* m_ram; }; inline std::ostream& diff --git a/src/mem/ruby/structures/MemoryControl.hh b/src/mem/ruby/structures/MemoryControl.hh index 52064adf1..b1cbe982f 100644 --- a/src/mem/ruby/structures/MemoryControl.hh +++ b/src/mem/ruby/structures/MemoryControl.hh @@ -89,9 +89,9 @@ class MemoryControl : public ClockedObject, public Consumer virtual void recordRequestType(MemoryControlRequestType requestType); - virtual bool functionalReadBuffers(Packet *pkt) + virtual bool functionalRead(Packet *pkt) { fatal("Functional read access not implemented!");} - virtual uint32_t functionalWriteBuffers(Packet *pkt) + virtual uint32_t functionalWrite(Packet *pkt) { fatal("Functional read access not implemented!");} protected: diff --git a/src/mem/ruby/structures/RubyMemoryControl.cc b/src/mem/ruby/structures/RubyMemoryControl.cc index 69fd45fe4..2e71c0c2f 100644 --- a/src/mem/ruby/structures/RubyMemoryControl.cc +++ b/src/mem/ruby/structures/RubyMemoryControl.cc @@ -173,6 +173,7 @@ RubyMemoryControl::RubyMemoryControl(const Params *p) void RubyMemoryControl::init() { + m_ram = g_system_ptr->getMemoryVector(); m_msg_counter = 0; assert(m_tFaw <= 62); // must fit in a uint64 shift register @@ -282,6 +283,19 @@ RubyMemoryControl::enqueue(const MsgPtr& message, Cycles latency) physical_address_t addr = memMess->getAddr().getAddress(); MemoryRequestType type = memMess->getType(); bool is_mem_read = (type == MemoryRequestType_MEMORY_READ); + + if (is_mem_read) { + m_ram->read(memMess->getAddr(), const_cast<uint8_t *>( + memMess->getDataBlk().getData(0, + RubySystem::getBlockSizeBytes())), + RubySystem::getBlockSizeBytes()); + } else { + m_ram->write(memMess->getAddr(), const_cast<uint8_t *>( + memMess->getDataBlk().getData(0, + RubySystem::getBlockSizeBytes())), + RubySystem::getBlockSizeBytes()); + } + MemoryNode *thisReq = new MemoryNode(arrival_time, message, addr, is_mem_read, !is_mem_read); enqueueMemRef(thisReq); @@ -706,7 +720,7 @@ RubyMemoryControl::wakeup() * being lists. */ bool -RubyMemoryControl::functionalReadBuffers(Packet *pkt) +RubyMemoryControl::functionalRead(Packet *pkt) { for (std::list<MemoryNode *>::iterator it = m_input_queue.begin(); it != m_input_queue.end(); ++it) { @@ -734,7 +748,10 @@ RubyMemoryControl::functionalReadBuffers(Packet *pkt) } } - return false; + m_ram->read(Address(pkt->getAddr()), pkt->getPtr<uint8_t>(true), + pkt->getSize()); + + return true; } /** @@ -746,7 +763,7 @@ RubyMemoryControl::functionalReadBuffers(Packet *pkt) * for debugging purposes. */ uint32_t -RubyMemoryControl::functionalWriteBuffers(Packet *pkt) +RubyMemoryControl::functionalWrite(Packet *pkt) { uint32_t num_functional_writes = 0; @@ -776,6 +793,10 @@ RubyMemoryControl::functionalWriteBuffers(Packet *pkt) } } + m_ram->write(Address(pkt->getAddr()), pkt->getPtr<uint8_t>(true), + pkt->getSize()); + num_functional_writes++; + return num_functional_writes; } diff --git a/src/mem/ruby/structures/RubyMemoryControl.hh b/src/mem/ruby/structures/RubyMemoryControl.hh index e7f1c54cc..dde6143c4 100644 --- a/src/mem/ruby/structures/RubyMemoryControl.hh +++ b/src/mem/ruby/structures/RubyMemoryControl.hh @@ -36,15 +36,12 @@ #include "mem/protocol/MemoryMsg.hh" #include "mem/ruby/common/Address.hh" -#include "mem/ruby/common/Consumer.hh" #include "mem/ruby/common/Global.hh" #include "mem/ruby/profiler/MemCntrlProfiler.hh" -#include "mem/ruby/slicc_interface/Message.hh" #include "mem/ruby/structures/MemoryControl.hh" -#include "mem/ruby/structures/MemoryNode.hh" +#include "mem/ruby/structures/MemoryVector.hh" #include "mem/ruby/system/System.hh" #include "params/RubyMemoryControl.hh" -#include "sim/sim_object.hh" // This constant is part of the definition of tFAW; see // the comments in header to RubyMemoryControl.cc @@ -95,8 +92,8 @@ class RubyMemoryControl : public MemoryControl int getRanksPerDimm() { return m_ranks_per_dimm; }; int getDimmsPerChannel() { return m_dimms_per_channel; } - bool functionalReadBuffers(Packet *pkt); - uint32_t functionalWriteBuffers(Packet *pkt); + bool functionalRead(Packet *pkt); + uint32_t functionalWrite(Packet *pkt); private: void enqueueToDirectory(MemoryNode *req, Cycles latency); @@ -165,6 +162,9 @@ class RubyMemoryControl : public MemoryControl int m_idleCount; // watchdog timer for shutting down MemCntrlProfiler* m_profiler_ptr; + + // Actual physical memory. + MemoryVector* m_ram; }; std::ostream& operator<<(std::ostream& out, const RubyMemoryControl& obj); |