abstract_mem.cc (11284:b3926db25371) abstract_mem.cc (11306:a5340a2a24f9)
1/*
2 * Copyright (c) 2010-2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 327 unchanged lines hidden (view full) ---

336 }
337
338 assert(AddrRange(pkt->getAddr(),
339 pkt->getAddr() + (pkt->getSize() - 1)).isSubset(range));
340
341 uint8_t *hostAddr = pmemAddr + pkt->getAddr() - range.start();
342
343 if (pkt->cmd == MemCmd::SwapReq) {
1/*
2 * Copyright (c) 2010-2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 327 unchanged lines hidden (view full) ---

336 }
337
338 assert(AddrRange(pkt->getAddr(),
339 pkt->getAddr() + (pkt->getSize() - 1)).isSubset(range));
340
341 uint8_t *hostAddr = pmemAddr + pkt->getAddr() - range.start();
342
343 if (pkt->cmd == MemCmd::SwapReq) {
344 std::vector<uint8_t> overwrite_val(pkt->getSize());
345 uint64_t condition_val64;
346 uint32_t condition_val32;
344 if (pkt->isAtomicOp()) {
345 if (pmemAddr) {
346 memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
347 (*(pkt->getAtomicOp()))(hostAddr);
348 }
349 } else {
350 std::vector<uint8_t> overwrite_val(pkt->getSize());
351 uint64_t condition_val64;
352 uint32_t condition_val32;
347
353
348 if (!pmemAddr)
349 panic("Swap only works if there is real memory (i.e. null=False)");
354 if (!pmemAddr)
355 panic("Swap only works if there is real memory (i.e. null=False)");
350
356
351 bool overwrite_mem = true;
352 // keep a copy of our possible write value, and copy what is at the
353 // memory address into the packet
354 std::memcpy(&overwrite_val[0], pkt->getConstPtr(),
355 pkt->getSize());
356 std::memcpy(pkt->getPtr(), hostAddr, pkt->getSize());
357 bool overwrite_mem = true;
358 // keep a copy of our possible write value, and copy what is at the
359 // memory address into the packet
360 std::memcpy(&overwrite_val[0], pkt->getConstPtr<uint8_t>(),
361 pkt->getSize());
362 std::memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
357
363
358 if (pkt->req->isCondSwap()) {
359 if (pkt->getSize() == sizeof(uint64_t)) {
360 condition_val64 = pkt->req->getExtraData();
361 overwrite_mem = !std::memcmp(&condition_val64, hostAddr,
362 sizeof(uint64_t));
363 } else if (pkt->getSize() == sizeof(uint32_t)) {
364 condition_val32 = (uint32_t)pkt->req->getExtraData();
365 overwrite_mem = !std::memcmp(&condition_val32, hostAddr,
366 sizeof(uint32_t));
367 } else
368 panic("Invalid size for conditional read/write\n");
369 }
364 if (pkt->req->isCondSwap()) {
365 if (pkt->getSize() == sizeof(uint64_t)) {
366 condition_val64 = pkt->req->getExtraData();
367 overwrite_mem = !std::memcmp(&condition_val64, hostAddr,
368 sizeof(uint64_t));
369 } else if (pkt->getSize() == sizeof(uint32_t)) {
370 condition_val32 = (uint32_t)pkt->req->getExtraData();
371 overwrite_mem = !std::memcmp(&condition_val32, hostAddr,
372 sizeof(uint32_t));
373 } else
374 panic("Invalid size for conditional read/write\n");
375 }
370
376
371 if (overwrite_mem)
372 std::memcpy(hostAddr, &overwrite_val[0], pkt->getSize());
377 if (overwrite_mem)
378 std::memcpy(hostAddr, &overwrite_val[0], pkt->getSize());
373
379
374 assert(!pkt->req->isInstFetch());
375 TRACE_PACKET("Read/Write");
376 numOther[pkt->req->masterId()]++;
380 assert(!pkt->req->isInstFetch());
381 TRACE_PACKET("Read/Write");
382 numOther[pkt->req->masterId()]++;
383 }
377 } else if (pkt->isRead()) {
378 assert(!pkt->isWrite());
379 if (pkt->isLLSC()) {
380 trackLoadLocked(pkt);
381 }
382 if (pmemAddr)
383 memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
384 TRACE_PACKET(pkt->req->isInstFetch() ? "IFetch" : "Read");

--- 64 unchanged lines hidden ---
384 } else if (pkt->isRead()) {
385 assert(!pkt->isWrite());
386 if (pkt->isLLSC()) {
387 trackLoadLocked(pkt);
388 }
389 if (pmemAddr)
390 memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
391 TRACE_PACKET(pkt->req->isInstFetch() ? "IFetch" : "Read");

--- 64 unchanged lines hidden ---