diff options
Diffstat (limited to 'src/mem/abstract_mem.cc')
-rw-r--r-- | src/mem/abstract_mem.cc | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc index 98f03b9af..c819ce2fc 100644 --- a/src/mem/abstract_mem.cc +++ b/src/mem/abstract_mem.cc @@ -42,8 +42,8 @@ * Andreas Hansson */ -#include "arch/registers.hh" -#include "config/the_isa.hh" +#include <vector> + #include "cpu/base.hh" #include "cpu/thread_context.hh" #include "debug/LLSC.hh" @@ -59,7 +59,14 @@ AbstractMemory::AbstractMemory(const Params *p) : confTableReported(p->conf_table_reported), inAddrMap(p->in_addr_map), _system(NULL) { - if (size() % TheISA::PageBytes != 0) +} + +void +AbstractMemory::init() +{ + assert(system()); + + if (size() % _system->getPageBytes() != 0) panic("Memory Size not divisible by page size\n"); } @@ -327,19 +334,17 @@ AbstractMemory::access(PacketPtr pkt) uint8_t *hostAddr = pmemAddr + pkt->getAddr() - range.start(); if (pkt->cmd == MemCmd::SwapReq) { - TheISA::IntReg overwrite_val; - bool overwrite_mem; + std::vector<uint8_t> overwrite_val(pkt->getSize()); uint64_t condition_val64; uint32_t condition_val32; if (!pmemAddr) panic("Swap only works if there is real memory (i.e. null=False)"); - assert(sizeof(TheISA::IntReg) >= pkt->getSize()); - overwrite_mem = true; + bool overwrite_mem = true; // keep a copy of our possible write value, and copy what is at the // memory address into the packet - std::memcpy(&overwrite_val, pkt->getPtr<uint8_t>(), pkt->getSize()); + std::memcpy(&overwrite_val[0], pkt->getPtr<uint8_t>(), pkt->getSize()); std::memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize()); if (pkt->req->isCondSwap()) { @@ -356,7 +361,7 @@ AbstractMemory::access(PacketPtr pkt) } if (overwrite_mem) - std::memcpy(hostAddr, &overwrite_val, pkt->getSize()); + std::memcpy(hostAddr, &overwrite_val[0], pkt->getSize()); assert(!pkt->req->isInstFetch()); TRACE_PACKET("Read/Write"); |