summaryrefslogtreecommitdiff
path: root/src/mem/ruby
diff options
context:
space:
mode:
authorPolina Dudnik <pdudnik@gmail.com>2009-08-14 14:24:15 -0500
committerPolina Dudnik <pdudnik@gmail.com>2009-08-14 14:24:15 -0500
commitde25decf37a7b0e2986da3345e8d4eb8b4a85fed (patch)
tree51f98b7f9f574ca8af1596a283503782d1347d72 /src/mem/ruby
parent4b924fd16cf64f242aa4832c13f38fd96c7c1fa0 (diff)
downloadgem5-de25decf37a7b0e2986da3345e8d4eb8b4a85fed.tar.xz
Multi-line RMW handling
Diffstat (limited to 'src/mem/ruby')
-rw-r--r--src/mem/ruby/slicc_interface/AbstractController.hh3
-rw-r--r--src/mem/ruby/system/Sequencer.cc6
2 files changed, 9 insertions, 0 deletions
diff --git a/src/mem/ruby/slicc_interface/AbstractController.hh b/src/mem/ruby/slicc_interface/AbstractController.hh
index 3a93cc745..329730ffd 100644
--- a/src/mem/ruby/slicc_interface/AbstractController.hh
+++ b/src/mem/ruby/slicc_interface/AbstractController.hh
@@ -4,6 +4,7 @@
#include "mem/ruby/common/Consumer.hh"
#include "mem/protocol/MachineType.hh"
+#include "mem/ruby/common/Address.hh"
class MessageBuffer;
class Network;
@@ -20,6 +21,8 @@ public:
virtual const string toString() const = 0; // returns text version of controller type
virtual const string getName() const = 0; // return instance name
virtual const MachineType getMachineType() const = 0;
+ virtual void set_atomic(Address addr) = 0;
+ virtual void clear_atomic() = 0;
virtual void print(ostream & out) const = 0;
virtual void printStats(ostream & out) const = 0;
diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc
index cd079cdc3..eb3430b7f 100644
--- a/src/mem/ruby/system/Sequencer.cc
+++ b/src/mem/ruby/system/Sequencer.cc
@@ -274,6 +274,12 @@ void Sequencer::writeCallback(const Address& address, DataBlock& data) {
if (request->ruby_request.type == RubyRequestType_Locked_Read) {
m_dataCache_ptr->setLocked(address, m_version);
}
+ else if (request->ruby_request.type == RubyRequestType_RMW_Read) {
+ m_controller->set_atomic(address);
+ }
+ else if (request->ruby_request.type == RubyRequestType_RMW_Write) {
+ m_controller->clear_atomic();
+ }
hitCallback(request, data);
}