95c95
< return_addr += params()->addrRange.start;
---
> return_addr += start();
190c190
< req->setScResult(success ? 1 : 0);
---
> req->setExtraData(success ? 1 : 0);
199,201c199,200
< assert(pkt->getAddr() >= params()->addrRange.start &&
< pkt->getAddr() + pkt->getSize() <= params()->addrRange.start +
< params()->addrRange.size());
---
> assert(pkt->getAddr() >= start() &&
> pkt->getAddr() + pkt->getSize() <= start() + size());
207,208c206
< memcpy(pkt->getPtr<uint8_t>(),
< pmemAddr + pkt->getAddr() - params()->addrRange.start,
---
> memcpy(pkt->getPtr<uint8_t>(), pmemAddr + pkt->getAddr() - start(),
236,237c234,235
< memcpy(pmemAddr + pkt->getAddr() - params()->addrRange.start,
< pkt->getPtr<uint8_t>(), pkt->getSize());
---
> memcpy(pmemAddr + pkt->getAddr() - start(), pkt->getPtr<uint8_t>(),
> pkt->getSize());
262,263c260
< }
< else if (pkt->isInvalidate()) {
---
> } else if (pkt->isInvalidate()) {
266,267c263,330
< }
< else {
---
> } else if (pkt->isReadWrite()) {
> IntReg overwrite_val;
> bool overwrite_mem;
> uint64_t condition_val64;
> uint32_t condition_val32;
> uint64_t test_val64;
> uint32_t test_val32;
>
> assert(sizeof(IntReg) >= pkt->getSize());
>
> overwrite_mem = true;
> // keep a copy of our possible write value, and copy what is at the
> // memory address into the packet
> memcpy(&overwrite_val, pkt->getPtr<uint8_t>(), pkt->getSize());
> memcpy(pkt->getPtr<uint8_t>(), pmemAddr + pkt->getAddr() - start(),
> pkt->getSize());
>
> if (pkt->req->isCondSwap()) {
> if (pkt->getSize() == sizeof(uint64_t)) {
> condition_val64 = htog(pkt->req->getExtraData());
> memcpy(&test_val64, pmemAddr + pkt->getAddr() - start(), sizeof(uint64_t));
> overwrite_mem = test_val64 == condition_val64;
> } else if (pkt->getSize() == sizeof(uint32_t)) {
> condition_val32 = htog((uint32_t)pkt->req->getExtraData());
> memcpy(&test_val32, pmemAddr + pkt->getAddr() - start(), sizeof(uint32_t));
> overwrite_mem = test_val32 == condition_val32;
> } else
> panic("Invalid size for conditional read/write\n");
> }
>
> if (overwrite_mem)
> memcpy(pmemAddr + pkt->getAddr() - start(),
> &overwrite_val, pkt->getSize());
>
> #if TRACING_ON
> switch (pkt->getSize()) {
> case sizeof(uint64_t):
> DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n",
> pkt->getSize(), pkt->getAddr(),pkt->get<uint64_t>());
> DPRINTF(MemoryAccess, "New Data 0x%x %s conditional (0x%x) and %s \n",
> overwrite_mem, pkt->req->isCondSwap() ? "was" : "wasn't",
> condition_val64, overwrite_mem ? "happened" : "didn't happen");
> break;
> case sizeof(uint32_t):
> DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n",
> pkt->getSize(), pkt->getAddr(),pkt->get<uint32_t>());
> DPRINTF(MemoryAccess, "New Data 0x%x %s conditional (0x%x) and %s \n",
> overwrite_mem, pkt->req->isCondSwap() ? "was" : "wasn't",
> condition_val32, overwrite_mem ? "happened" : "didn't happen");
> break;
> case sizeof(uint16_t):
> DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n",
> pkt->getSize(), pkt->getAddr(),pkt->get<uint16_t>());
> DPRINTF(MemoryAccess, "New Data 0x%x wasn't conditional and happned\n",
> overwrite_mem);
> break;
> case sizeof(uint8_t):
> DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n",
> pkt->getSize(), pkt->getAddr(),pkt->get<uint8_t>());
> DPRINTF(MemoryAccess, "New Data 0x%x wasn't conditional and happned\n",
> overwrite_mem);
> break;
> default:
> DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x\n",
> pkt->getSize(), pkt->getAddr());
> }
> #endif
> } else {
318c381
< resp.push_back(RangeSize(params()->addrRange.start,
---
> resp.push_back(RangeSize(start(),