Replaced RMW with Locked. RMW will be used for the coherence-aided atomics other than LLSC
This commit is contained in:
@@ -19,10 +19,10 @@ string RubyRequestType_to_string(const RubyRequestType& obj)
|
||||
return "LD";
|
||||
case RubyRequestType_ST:
|
||||
return "ST";
|
||||
case RubyRequestType_RMW_Read:
|
||||
return "RMW_Read";
|
||||
case RubyRequestType_RMW_Write:
|
||||
return "RMW_Write";
|
||||
case RubyRequestType_Locked_Read:
|
||||
return "Locked_Read";
|
||||
case RubyRequestType_Locked_Write:
|
||||
return "Locked_Write";
|
||||
case RubyRequestType_NULL:
|
||||
default:
|
||||
assert(0);
|
||||
@@ -38,10 +38,10 @@ RubyRequestType string_to_RubyRequestType(std::string str)
|
||||
return RubyRequestType_LD;
|
||||
else if (str == "ST")
|
||||
return RubyRequestType_ST;
|
||||
else if (str == "RMW_Read")
|
||||
return RubyRequestType_RMW_Read;
|
||||
else if (str == "RMW_Write")
|
||||
return RubyRequestType_RMW_Write;
|
||||
else if (str == "Locked_Read")
|
||||
return RubyRequestType_Locked_Read;
|
||||
else if (str == "Locked_Write")
|
||||
return RubyRequestType_Locked_Write;
|
||||
else
|
||||
assert(0);
|
||||
return RubyRequestType_NULL;
|
||||
|
||||
@@ -11,8 +11,8 @@ enum RubyRequestType {
|
||||
RubyRequestType_IFETCH,
|
||||
RubyRequestType_LD,
|
||||
RubyRequestType_ST,
|
||||
RubyRequestType_RMW_Read,
|
||||
RubyRequestType_RMW_Write
|
||||
RubyRequestType_Locked_Read,
|
||||
RubyRequestType_Locked_Write
|
||||
};
|
||||
|
||||
enum RubyAccessMode {
|
||||
|
||||
@@ -47,7 +47,10 @@ TraceRecord::TraceRecord(const string & sequencer_name, const Address& data_addr
|
||||
|
||||
// Don't differentiate between store misses and atomic requests in
|
||||
// the trace
|
||||
if (m_type == RubyRequestType_RMW) {
|
||||
if (m_type == RubyRequestType_Locked_Read) {
|
||||
m_type = RubyRequestType_ST;
|
||||
}
|
||||
if (m_type == RubyRequestType_Locked_Write) {
|
||||
m_type = RubyRequestType_ST;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,8 @@ int64_t DMASequencer::makeRequest(const RubyRequest & request)
|
||||
break;
|
||||
case RubyRequestType_NULL:
|
||||
case RubyRequestType_IFETCH:
|
||||
case RubyRequestType_RMW:
|
||||
case RubyRequestType_Locked_Read:
|
||||
case RubyRequestType_Locked_Write:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -201,8 +201,8 @@ bool Sequencer::insertRequest(SequencerRequest* request) {
|
||||
Address line_addr(request->ruby_request.paddr);
|
||||
line_addr.makeLineAddress();
|
||||
if ((request->ruby_request.type == RubyRequestType_ST) ||
|
||||
(request->ruby_request.type == RubyRequestType_RMW_Read) ||
|
||||
(request->ruby_request.type == RubyRequestType_RMW_Write)) {
|
||||
(request->ruby_request.type == RubyRequestType_Locked_Read) ||
|
||||
(request->ruby_request.type == RubyRequestType_Locked_Write)) {
|
||||
if (m_writeRequestTable.exist(line_addr)) {
|
||||
m_writeRequestTable.lookup(line_addr) = request;
|
||||
// return true;
|
||||
@@ -238,8 +238,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_Read) ||
|
||||
(ruby_request.type == RubyRequestType_RMW_Write)) {
|
||||
(ruby_request.type == RubyRequestType_Locked_Read) ||
|
||||
(ruby_request.type == RubyRequestType_Locked_Write)) {
|
||||
m_writeRequestTable.deallocate(line_addr);
|
||||
} else {
|
||||
m_readRequestTable.deallocate(line_addr);
|
||||
@@ -258,10 +258,10 @@ void Sequencer::writeCallback(const Address& address, DataBlock& data) {
|
||||
removeRequest(request);
|
||||
|
||||
assert((request->ruby_request.type == RubyRequestType_ST) ||
|
||||
(request->ruby_request.type == RubyRequestType_RMW_Read) ||
|
||||
(request->ruby_request.type == RubyRequestType_RMW_Write));
|
||||
(request->ruby_request.type == RubyRequestType_Locked_Read) ||
|
||||
(request->ruby_request.type == RubyRequestType_Locked_Write));
|
||||
// POLINA: the assumption is that atomics are only on data cache and not instruction cache
|
||||
if (request->ruby_request.type == RubyRequestType_RMW_Read) {
|
||||
if (request->ruby_request.type == RubyRequestType_Locked_Read) {
|
||||
m_dataCache_ptr->setLocked(address, m_version);
|
||||
}
|
||||
|
||||
@@ -364,7 +364,7 @@ int64_t Sequencer::makeRequest(const RubyRequest & request)
|
||||
SequencerRequest *srequest = new SequencerRequest(request, id, g_eventQueue_ptr->getTime());
|
||||
bool found = insertRequest(srequest);
|
||||
if (!found)
|
||||
if (request.type == RubyRequestType_RMW_Write) {
|
||||
if (request.type == RubyRequestType_Locked_Write) {
|
||||
if (!m_dataCache_ptr->isLocked(line_address(Address(request.paddr)), m_version)) {
|
||||
return -2;
|
||||
}
|
||||
@@ -396,10 +396,10 @@ void Sequencer::issueRequest(const RubyRequest& request) {
|
||||
case RubyRequestType_ST:
|
||||
ctype = CacheRequestType_ST;
|
||||
break;
|
||||
case RubyRequestType_RMW_Read:
|
||||
case RubyRequestType_Locked_Read:
|
||||
ctype = CacheRequestType_ATOMIC;
|
||||
break;
|
||||
case RubyRequestType_RMW_Write:
|
||||
case RubyRequestType_Locked_Write:
|
||||
ctype = CacheRequestType_ATOMIC;
|
||||
break;
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user