diff options
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/physical.cc | 4 | ||||
-rw-r--r-- | src/mem/request.hh | 6 |
2 files changed, 10 insertions, 0 deletions
diff --git a/src/mem/physical.cc b/src/mem/physical.cc index 2f358daf2..4ea58e5e3 100644 --- a/src/mem/physical.cc +++ b/src/mem/physical.cc @@ -304,9 +304,13 @@ PhysicalMemory::doAtomicAccess(PacketPtr pkt) void PhysicalMemory::doFunctionalAccess(PacketPtr pkt) { + warn("addr %#x >= %#x AND %#x <= %#x", + pkt->getAddr(), start(), pkt->getAddr() + pkt->getSize(), start() + size()); + assert(pkt->getAddr() >= start() && pkt->getAddr() + pkt->getSize() <= start() + size()); + uint8_t *hostAddr = pmemAddr + pkt->getAddr() - start(); if (pkt->cmd == MemCmd::ReadReq) { diff --git a/src/mem/request.hh b/src/mem/request.hh index e08593f0d..cc9c6b8bf 100644 --- a/src/mem/request.hh +++ b/src/mem/request.hh @@ -75,6 +75,8 @@ const uint32_t INST_READ = 0x80000; /** This request is for a memory swap. */ const uint32_t MEM_SWAP = 0x100000; const uint32_t MEM_SWAP_COND = 0x200000; +/** The request should ignore unaligned access faults */ +const uint32_t NO_HALF_WORD_ALIGN_FAULT = 0x400000; class Request : public FastAlloc @@ -272,6 +274,10 @@ class Request : public FastAlloc bool isCondSwap() { return (getFlags() & MEM_SWAP_COND) != 0; } + bool inline isMisaligned() {return (!(getFlags() & NO_ALIGN_FAULT) && + ((vaddr & 1) || + (!(getFlags() & NO_HALF_WORD_ALIGN_FAULT) + && (vaddr & 0x2))));} friend class Packet; }; |