Make sure endian conversion is done on the memory data when it's just set to an existing buffer.

--HG--
extra : convert_revision : 5a890091b6a31b5414acbf68f19e28d7122a98d7
This commit is contained in:
Gabe Black
2006-12-16 07:34:34 -05:00
parent 6413b74e4f
commit 244506ae12

View File

@@ -601,8 +601,17 @@ LSQUnit<Impl>::writebackStores()
TheISA::IntReg convertedData =
TheISA::htog(storeQueue[storeWBIdx].data);
memcpy(inst->memData, (uint8_t *)&convertedData,
req->getSize());
//FIXME This is a hack to get SPARC working. It, along with endianness
//in the memory system in general, need to be straightened out more
//formally. The problem is that the data's endianness is swapped when
//it's in the 64 bit data field in the store queue. The data that you
//want won't start at the beginning of the field anymore unless it was
//a 64 bit access.
memcpy(inst->memData,
(uint8_t *)&convertedData +
(TheISA::ByteOrderDiffers ?
(sizeof(TheISA::IntReg) - req->getSize()) : 0),
req->getSize());
PacketPtr data_pkt = new Packet(req, Packet::WriteReq, Packet::Broadcast);
data_pkt->dataStatic(inst->memData);
@@ -616,7 +625,7 @@ LSQUnit<Impl>::writebackStores()
DPRINTF(LSQUnit, "D-Cache: Writing back store idx:%i PC:%#x "
"to Addr:%#x, data:%#x [sn:%lli]\n",
storeWBIdx, inst->readPC(),
req->getPaddr(), *(inst->memData),
req->getPaddr(), (int)*(inst->memData),
inst->seqNum);
// @todo: Remove this SC hack once the memory system handles it.