Deleted Added
sdiff udiff text old ( 11284:b3926db25371 ) new ( 11306:a5340a2a24f9 )
full compact
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 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;
353
354 if (!pmemAddr)
355 panic("Swap only works if there is real memory (i.e. null=False)");
356
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());
363
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 }
376
377 if (overwrite_mem)
378 std::memcpy(hostAddr, &overwrite_val[0], pkt->getSize());
379
380 assert(!pkt->req->isInstFetch());
381 TRACE_PACKET("Read/Write");
382 numOther[pkt->req->masterId()]++;
383 }
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 ---