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 --- |