lsq_unit_impl.hh (10031:79d034cd6ba3) | lsq_unit_impl.hh (10149:45a67d84fd4a) |
---|---|
1 2/* 3 * Copyright (c) 2010-2013 ARM Limited 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 450 unchanged lines hidden (view full) --- 459 } 460 461 // If this is the only load in the LSQ we don't care 462 if (load_idx == loadTail) 463 return; 464 465 incrLdIdx(load_idx); 466 | 1 2/* 3 * Copyright (c) 2010-2013 ARM Limited 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 450 unchanged lines hidden (view full) --- 459 } 460 461 // If this is the only load in the LSQ we don't care 462 if (load_idx == loadTail) 463 return; 464 465 incrLdIdx(load_idx); 466 |
467 bool force_squash = false; 468 |
|
467 while (load_idx != loadTail) { 468 DynInstPtr ld_inst = loadQueue[load_idx]; 469 470 if (!ld_inst->effAddrValid() || ld_inst->uncacheable()) { 471 incrLdIdx(load_idx); 472 continue; 473 } 474 475 Addr load_addr = ld_inst->physEffAddr & cacheBlockMask; 476 DPRINTF(LSQUnit, "-- inst [sn:%lli] load_addr: %#x to pktAddr:%#x\n", 477 ld_inst->seqNum, load_addr, invalidate_addr); 478 | 469 while (load_idx != loadTail) { 470 DynInstPtr ld_inst = loadQueue[load_idx]; 471 472 if (!ld_inst->effAddrValid() || ld_inst->uncacheable()) { 473 incrLdIdx(load_idx); 474 continue; 475 } 476 477 Addr load_addr = ld_inst->physEffAddr & cacheBlockMask; 478 DPRINTF(LSQUnit, "-- inst [sn:%lli] load_addr: %#x to pktAddr:%#x\n", 479 ld_inst->seqNum, load_addr, invalidate_addr); 480 |
479 if (load_addr == invalidate_addr) { 480 if (ld_inst->possibleLoadViolation()) { | 481 if (load_addr == invalidate_addr || force_squash) { 482 if (needsTSO) { 483 // If we have a TSO system, as all loads must be ordered with 484 // all other loads, this load as well as *all* subsequent loads 485 // need to be squashed to prevent possible load reordering. 486 force_squash = true; 487 } 488 if (ld_inst->possibleLoadViolation() || force_squash) { |
481 DPRINTF(LSQUnit, "Conflicting load at addr %#x [sn:%lli]\n", 482 pkt->getAddr(), ld_inst->seqNum); 483 484 // Mark the load for re-execution 485 ld_inst->fault = new ReExec; 486 } else { 487 DPRINTF(LSQUnit, "HitExternal Snoop for addr %#x [sn:%lli]\n", 488 pkt->getAddr(), ld_inst->seqNum); --- 835 unchanged lines hidden --- | 489 DPRINTF(LSQUnit, "Conflicting load at addr %#x [sn:%lli]\n", 490 pkt->getAddr(), ld_inst->seqNum); 491 492 // Mark the load for re-execution 493 ld_inst->fault = new ReExec; 494 } else { 495 DPRINTF(LSQUnit, "HitExternal Snoop for addr %#x [sn:%lli]\n", 496 pkt->getAddr(), ld_inst->seqNum); --- 835 unchanged lines hidden --- |