1/* 2 * Copyright (c) 2012-2013 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 --- 594 unchanged lines hidden (view full) --- 603 604void 605RubyPort::ruby_eviction_callback(Addr address) 606{ 607 DPRINTF(RubyPort, "Sending invalidations.\n"); 608 // Allocate the invalidate request and packet on the stack, as it is 609 // assumed they will not be modified or deleted by receivers. 610 // TODO: should this really be using funcMasterId? |
611 auto request = std::make_shared<Request>( 612 address, RubySystem::getBlockSizeBytes(), 0, 613 Request::funcMasterId); 614 |
615 // Use a single packet to signal all snooping ports of the invalidation. 616 // This assumes that snooping ports do NOT modify the packet/request |
617 Packet pkt(request, MemCmd::InvalidateReq); |
618 for (CpuPortIter p = slave_ports.begin(); p != slave_ports.end(); ++p) { 619 // check if the connected master port is snooping 620 if ((*p)->isSnooping()) { 621 // send as a snoop request 622 (*p)->sendTimingSnoopReq(&pkt); 623 } 624 } 625} 626 627void 628RubyPort::PioMasterPort::recvRangeChange() 629{ 630 RubyPort &r = static_cast<RubyPort &>(owner); 631 r.gotAddrRanges--; 632 if (r.gotAddrRanges == 0 && FullSystem) { 633 r.pioSlavePort.sendRangeChange(); 634 } 635} |