46a47
> #include "sim/builder.hh"
53,54c54,55
< PhysicalMemory::PhysicalMemory(const Params *p)
< : MemObject(p), pmemAddr(NULL), lat(p->latency)
---
> PhysicalMemory::PhysicalMemory(Params *p)
> : MemObject(p->name), pmemAddr(NULL), lat(p->latency), _params(p)
56c57
< if (params()->range.size() % TheISA::PageBytes != 0)
---
> if (params()->addrRange.size() % TheISA::PageBytes != 0)
60,61c61,63
< pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(), PROT_READ | PROT_WRITE,
< map_flags, -1, 0);
---
> pmemAddr =
> (uint8_t *)mmap(NULL, params()->addrRange.size(),
> PROT_READ | PROT_WRITE, map_flags, -1, 0);
69,70c71,72
< if (p->zero)
< memset(pmemAddr, 0, p->range.size());
---
> if(params()->zero)
> memset(pmemAddr, 0, params()->addrRange.size());
91c93
< munmap((char*)pmemAddr, params()->range.size());
---
> munmap((char*)pmemAddr, params()->addrRange.size());
123c125
< PhysicalMemory::trackLoadLocked(Request *req)
---
> PhysicalMemory::trackLoadLocked(PacketPtr pkt)
124a127
> Request *req = pkt->req;
153c156
< PhysicalMemory::checkLockedAddrList(Request *req)
---
> PhysicalMemory::checkLockedAddrList(PacketPtr pkt)
154a158
> Request *req = pkt->req;
156c160
< bool isLocked = req->isLocked();
---
> bool isLocked = pkt->isLocked();
200,201c204,234
< void
< PhysicalMemory::doFunctionalAccess(PacketPtr pkt)
---
>
> #if TRACING_ON
>
> #define CASE(A, T) \
> case sizeof(T): \
> DPRINTF(MemoryAccess, A " of size %i on address 0x%x data 0x%x\n", \
> pkt->getSize(), pkt->getAddr(), pkt->get<T>()); \
> break
>
>
> #define TRACE_PACKET(A) \
> do { \
> switch (pkt->getSize()) { \
> CASE(A, uint64_t); \
> CASE(A, uint32_t); \
> CASE(A, uint16_t); \
> CASE(A, uint8_t); \
> default: \
> DPRINTF(MemoryAccess, A " of size %i on address 0x%x\n", \
> pkt->getSize(), pkt->getAddr()); \
> } \
> } while (0)
>
> #else
>
> #define TRACE_PACKET(A)
>
> #endif
>
> Tick
> PhysicalMemory::doAtomicAccess(PacketPtr pkt)
206,234c239,242
< if (pkt->isRead()) {
< if (pkt->req->isLocked()) {
< trackLoadLocked(pkt->req);
< }
< memcpy(pkt->getPtr<uint8_t>(), pmemAddr + pkt->getAddr() - start(),
< pkt->getSize());
< #if TRACING_ON
< switch (pkt->getSize()) {
< case sizeof(uint64_t):
< DPRINTF(MemoryAccess, "Read of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint64_t>());
< break;
< case sizeof(uint32_t):
< DPRINTF(MemoryAccess, "Read of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint32_t>());
< break;
< case sizeof(uint16_t):
< DPRINTF(MemoryAccess, "Read of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint16_t>());
< break;
< case sizeof(uint8_t):
< DPRINTF(MemoryAccess, "Read of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint8_t>());
< break;
< default:
< DPRINTF(MemoryAccess, "Read of size %i on address 0x%x\n",
< pkt->getSize(), pkt->getAddr());
< }
< #endif
---
> if (pkt->memInhibitAsserted()) {
> DPRINTF(MemoryAccess, "mem inhibited on 0x%x: not responding\n",
> pkt->getAddr());
> return 0;
236,267c244,247
< else if (pkt->isWrite()) {
< if (writeOK(pkt->req)) {
< memcpy(pmemAddr + pkt->getAddr() - start(), pkt->getPtr<uint8_t>(),
< pkt->getSize());
< #if TRACING_ON
< switch (pkt->getSize()) {
< case sizeof(uint64_t):
< DPRINTF(MemoryAccess, "Write of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint64_t>());
< break;
< case sizeof(uint32_t):
< DPRINTF(MemoryAccess, "Write of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint32_t>());
< break;
< case sizeof(uint16_t):
< DPRINTF(MemoryAccess, "Write of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint16_t>());
< break;
< case sizeof(uint8_t):
< DPRINTF(MemoryAccess, "Write of size %i on address 0x%x data 0x%x\n",
< pkt->getSize(), pkt->getAddr(),pkt->get<uint8_t>());
< break;
< default:
< DPRINTF(MemoryAccess, "Write of size %i on address 0x%x\n",
< pkt->getSize(), pkt->getAddr());
< }
< #endif
< }
< } else if (pkt->isInvalidate()) {
< //upgrade or invalidate
< pkt->flags |= SATISFIED;
< } else if (pkt->isReadWrite()) {
---
>
> uint8_t *hostAddr = pmemAddr + pkt->getAddr() - start();
>
> if (pkt->cmd == MemCmd::SwapReq) {
279,280c259
< std::memcpy(pkt->getPtr<uint8_t>(), pmemAddr + pkt->getAddr() - start(),
< pkt->getSize());
---
> std::memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
285,286c264,265
< overwrite_mem = !std::memcmp(&condition_val64, pmemAddr +
< pkt->getAddr() - start(), sizeof(uint64_t));
---
> overwrite_mem = !std::memcmp(&condition_val64, hostAddr,
> sizeof(uint64_t));
289,290c268,269
< overwrite_mem = !std::memcmp(&condition_val32, pmemAddr +
< pkt->getAddr() - start(), sizeof(uint32_t));
---
> overwrite_mem = !std::memcmp(&condition_val32, hostAddr,
> sizeof(uint32_t));
296,297c275
< std::memcpy(pmemAddr + pkt->getAddr() - start(),
< &overwrite_val, pkt->getSize());
---
> std::memcpy(hostAddr, &overwrite_val, pkt->getSize());
299,329c277,281
< #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());
---
> TRACE_PACKET("Read/Write");
> } else if (pkt->isRead()) {
> assert(!pkt->isWrite());
> if (pkt->isLocked()) {
> trackLoadLocked(pkt);
331c283,294
< #endif
---
> memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
> TRACE_PACKET("Read");
> } else if (pkt->isWrite()) {
> if (writeOK(pkt)) {
> memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
> TRACE_PACKET("Write");
> }
> } else if (pkt->isInvalidate()) {
> //upgrade or invalidate
> if (pkt->needsResponse()) {
> pkt->makeAtomicResponse();
> }
336c299,302
< pkt->result = Packet::Success;
---
> if (pkt->needsResponse()) {
> pkt->makeAtomicResponse();
> }
> return calculateLatency(pkt);
338a305,328
>
> void
> PhysicalMemory::doFunctionalAccess(PacketPtr pkt)
> {
> assert(pkt->getAddr() >= start() &&
> pkt->getAddr() + pkt->getSize() <= start() + size());
>
> uint8_t *hostAddr = pmemAddr + pkt->getAddr() - start();
>
> if (pkt->cmd == MemCmd::ReadReq) {
> memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
> TRACE_PACKET("Read");
> } else if (pkt->cmd == MemCmd::WriteReq) {
> memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
> TRACE_PACKET("Write");
> } else {
> panic("PhysicalMemory: unimplemented functional command %s",
> pkt->cmdString());
> }
>
> pkt->makeAtomicResponse();
> }
>
>
397c387
< resp.push_back(RangeSize(start(), params()->range.size()));
---
> resp.push_back(RangeSize(start(), params()->addrRange.size()));
409,410c399
< memory->doFunctionalAccess(pkt);
< return memory->calculateLatency(pkt);
---
> return memory->doAtomicAccess(pkt);
460,461c449
< if (gzwrite(compressedMem, pmemAddr, params()->range.size()) !=
< params()->range.size()) {
---
> if (gzwrite(compressedMem, pmemAddr, params()->addrRange.size()) != params()->addrRange.size()) {
503c491
< munmap((char*)pmemAddr, params()->range.size());
---
> munmap((char*)pmemAddr, params()->addrRange.size());
505,506c493,494
< pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(),
< PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
---
> pmemAddr = (uint8_t *)mmap(NULL, params()->addrRange.size(), PROT_READ | PROT_WRITE,
> MAP_ANON | MAP_PRIVATE, -1, 0);
519c507
< while (curSize < params()->range.size()) {
---
> while (curSize < params()->addrRange.size()) {
521,522c509
< if (bytesRead != chunkSize &&
< bytesRead != params()->range.size() - curSize)
---
> if (bytesRead != chunkSize && bytesRead != params()->addrRange.size() - curSize)
525,526c512
< filename, bytesRead, chunkSize,
< params()->range.size() - curSize);
---
> filename, bytesRead, chunkSize, params()->addrRange.size()-curSize);
548,549c534,553
< PhysicalMemory *
< PhysicalMemoryParams::create()
---
>
> BEGIN_DECLARE_SIM_OBJECT_PARAMS(PhysicalMemory)
>
> Param<string> file;
> Param<Range<Addr> > range;
> Param<Tick> latency;
> Param<bool> zero;
>
> END_DECLARE_SIM_OBJECT_PARAMS(PhysicalMemory)
>
> BEGIN_INIT_SIM_OBJECT_PARAMS(PhysicalMemory)
>
> INIT_PARAM_DFLT(file, "memory mapped file", ""),
> INIT_PARAM(range, "Device Address Range"),
> INIT_PARAM(latency, "Memory access latency"),
> INIT_PARAM(zero, "Zero initialize memory")
>
> END_INIT_SIM_OBJECT_PARAMS(PhysicalMemory)
>
> CREATE_SIM_OBJECT(PhysicalMemory)
551c555,560
< return new PhysicalMemory(this);
---
> PhysicalMemory::Params *p = new PhysicalMemory::Params;
> p->name = getInstanceName();
> p->addrRange = range;
> p->latency = latency;
> p->zero = zero;
> return new PhysicalMemory(p);
552a562,563
>
> REGISTER_SIM_OBJECT("PhysicalMemory", PhysicalMemory)