summaryrefslogtreecommitdiff
path: root/src/mem/ruby/system/Sequencer.cc
diff options
context:
space:
mode:
authorPolina Dudnik <pdudnik@gmail.com>2009-07-13 11:13:29 -0500
committerPolina Dudnik <pdudnik@gmail.com>2009-07-13 11:13:29 -0500
commit226981b2a65ee4c544bc595d7718de8225fda0b0 (patch)
treeab93913f1a164fe035c3ecdc98dc374508a9bd11 /src/mem/ruby/system/Sequencer.cc
parent60577eb4caff66a756f260bff6bf3bf8cb7edcba (diff)
downloadgem5-226981b2a65ee4c544bc595d7718de8225fda0b0.tar.xz
Reintegrated Derek's functional implementation of atomics with a minor change: don't clear lock on failure
Diffstat (limited to 'src/mem/ruby/system/Sequencer.cc')
-rw-r--r--src/mem/ruby/system/Sequencer.cc28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc
index 97416d2d3..d7d4ba8e0 100644
--- a/src/mem/ruby/system/Sequencer.cc
+++ b/src/mem/ruby/system/Sequencer.cc
@@ -237,7 +237,8 @@ void Sequencer::removeRequest(SequencerRequest* srequest) {
Address line_addr(ruby_request.paddr);
line_addr.makeLineAddress();
if ((ruby_request.type == RubyRequestType_ST) ||
- (ruby_request.type == RubyRequestType_RMW)) {
+ (ruby_request.type == RubyRequestType_RMW_Read) ||
+ (ruby_request.type == RubyRequestType_RMW_Write)) {
m_writeRequestTable.deallocate(line_addr);
} else {
m_readRequestTable.deallocate(line_addr);
@@ -256,7 +257,25 @@ void Sequencer::writeCallback(const Address& address, DataBlock& data) {
removeRequest(request);
assert((request->ruby_request.type == RubyRequestType_ST) ||
- (request->ruby_request.type == RubyRequestType_RMW));
+ (request->ruby_request.type == RubyRequestType_RMW_Read) ||
+ (request->ruby_request.type == RubyRequestType_RMW_Write));
+ // POLINA: the assumption is that atomics are only on data cache and not instruction cache
+ if (request->ruby_request.type == RubyRequestType_RMW_Read) {
+ m_dataCache_ptr->setLocked(address, m_version);
+ }
+ else if (request->ruby_request.type == RubyRequestType_RMW_Write) {
+ if (m_dataCache_ptr->isLocked(address, m_version)) {
+ // if we are holding the lock for this
+ request->ruby_request.atomic_success = true;
+ m_dataCache_ptr->clearLocked(address);
+ }
+ else {
+ // if we are not holding the lock for this
+ request->ruby_request.atomic_success = false;
+ }
+
+ // can have livelock
+ }
hitCallback(request, data);
}
@@ -379,7 +398,10 @@ void Sequencer::issueRequest(const RubyRequest& request) {
case RubyRequestType_ST:
ctype = CacheRequestType_ST;
break;
- case RubyRequestType_RMW:
+ case RubyRequestType_RMW_Read:
+ ctype = CacheRequestType_ATOMIC;
+ break;
+ case RubyRequestType_RMW_Write:
ctype = CacheRequestType_ATOMIC;
break;
default: