summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolina Dudnik <pdudnik@gmail.com>2009-09-21 13:04:52 -0500
committerPolina Dudnik <pdudnik@gmail.com>2009-09-21 13:04:52 -0500
commit4f463b3a266f4d7524f5f7b0c6722a1a2660e120 (patch)
tree8b636aa2e9f4f2eeb66c90d825731f5e70d4f222
parent114d8724dd5e6ff82b93b5888fcf8f99f56c0993 (diff)
downloadgem5-4f463b3a266f4d7524f5f7b0c6722a1a2660e120.tar.xz
Atomics bug fix
-rw-r--r--src/mem/ruby/system/Sequencer.cc11
-rw-r--r--src/mem/slicc/symbols/StateMachine.cc1
2 files changed, 7 insertions, 5 deletions
diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc
index bcfa0e954..bef0d5412 100644
--- a/src/mem/ruby/system/Sequencer.cc
+++ b/src/mem/ruby/system/Sequencer.cc
@@ -45,7 +45,7 @@
//Sequencer::Sequencer(int core_id, MessageBuffer* mandatory_q)
#define LLSC_FAIL -2
-
+long int already = 0;
Sequencer::Sequencer(const string & name)
:RubyPort(name)
{
@@ -354,9 +354,6 @@ void Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data) {
// Returns true if the sequencer already has a load or store outstanding
int Sequencer::isReady(const RubyRequest& request) {
- // POLINA: check if we are currently flushing the write buffer, if so Ruby is returned as not ready
- // to simulate stalling of the front-end
- // Do we stall all the sequencers? If it is atomic instruction - yes!
if (m_outstanding_count >= m_max_outstanding_requests) {
return LIBRUBY_BUFFER_FULL;
}
@@ -417,6 +414,8 @@ void Sequencer::issueRequest(const RubyRequest& request) {
case RubyRequestType_IFETCH:
if (m_atomic_reads > 0 && m_atomic_writes == 0) {
m_controller->reset_atomics();
+ m_atomic_writes = 0;
+ m_atomic_reads = 0;
}
else if (m_atomic_writes > 0) {
assert(m_atomic_reads > m_atomic_writes);
@@ -428,6 +427,8 @@ void Sequencer::issueRequest(const RubyRequest& request) {
case RubyRequestType_LD:
if (m_atomic_reads > 0 && m_atomic_writes == 0) {
m_controller->reset_atomics();
+ m_atomic_writes = 0;
+ m_atomic_reads = 0;
}
else if (m_atomic_writes > 0) {
assert(m_atomic_reads > m_atomic_writes);
@@ -439,6 +440,8 @@ void Sequencer::issueRequest(const RubyRequest& request) {
case RubyRequestType_ST:
if (m_atomic_reads > 0 && m_atomic_writes == 0) {
m_controller->reset_atomics();
+ m_atomic_writes = 0;
+ m_atomic_reads = 0;
}
else if (m_atomic_writes > 0) {
assert(m_atomic_reads > m_atomic_writes);
diff --git a/src/mem/slicc/symbols/StateMachine.cc b/src/mem/slicc/symbols/StateMachine.cc
index f5fad70c6..bddc8781f 100644
--- a/src/mem/slicc/symbols/StateMachine.cc
+++ b/src/mem/slicc/symbols/StateMachine.cc
@@ -992,7 +992,6 @@ void StateMachine::printCWakeup(ostream& out, string component)
out << "void " << component << "_Controller::reset_atomics()" << endl;
out << "{" << endl;
- out << " assert(servicing_atomic > 0); " << endl;
out << " servicing_atomic = 0; " << endl;
out << " locked_read_request1 = Address(-1);" << endl;
out << " locked_read_request2 = Address(-1);" << endl;