snoop_filter.cc (11284:b3926db25371) | snoop_filter.cc (11287:0d5bbeaeb8ca) |
---|---|
1/* 2 * Copyright (c) 2013-2015 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 --- 243 unchanged lines hidden (view full) --- 252 // The source should have the line 253 panic_if(!(sf_item.holder & rsp_mask), "SF value %x.%x does not have "\ 254 "the line\n", sf_item.requested, sf_item.holder); 255 256 // The destination should have had a request in 257 panic_if(!(sf_item.requested & req_mask), "SF value %x.%x missing "\ 258 "the original request\n", sf_item.requested, sf_item.holder); 259 | 1/* 2 * Copyright (c) 2013-2015 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 --- 243 unchanged lines hidden (view full) --- 252 // The source should have the line 253 panic_if(!(sf_item.holder & rsp_mask), "SF value %x.%x does not have "\ 254 "the line\n", sf_item.requested, sf_item.holder); 255 256 // The destination should have had a request in 257 panic_if(!(sf_item.requested & req_mask), "SF value %x.%x missing "\ 258 "the original request\n", sf_item.requested, sf_item.holder); 259 |
260 // Update the residency of the cache line. 261 if (cpkt->needsWritable() || !cpkt->hasSharers()) { 262 DPRINTF(SnoopFilter, "%s: dropping %x because needs: %i writable: %i "\ 263 "SF val: %x.%x\n", __func__, rsp_mask, 264 cpkt->needsWritable(), !cpkt->hasSharers(), | 260 // If the snoop response has no sharers the line is passed in 261 // Modified state, and we know that there are no other copies, or 262 // they will all be invalidated imminently 263 if (!cpkt->hasSharers()) { 264 DPRINTF(SnoopFilter, 265 "%s: dropping %x because non-shared snoop " 266 "response SF val: %x.%x\n", __func__, rsp_mask, |
265 sf_item.requested, sf_item.holder); | 267 sf_item.requested, sf_item.holder); |
266 267 sf_item.holder &= ~rsp_mask; 268 // The snoop filter does not see any ACKs from non-responding sharers 269 // that have been invalidated :( So below assert would be nice, but.. 270 //assert(sf_item.holder == 0); | |
271 sf_item.holder = 0; 272 } 273 assert(!cpkt->isWriteback()); 274 sf_item.holder |= req_mask; 275 sf_item.requested &= ~req_mask; 276 assert(sf_item.requested | sf_item.holder); 277 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 278 __func__, sf_item.requested, sf_item.holder); --- 18 unchanged lines hidden (view full) --- 297 if (!is_hit) 298 return; 299 300 SnoopItem& sf_item = sf_it->second; 301 302 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", 303 __func__, sf_item.requested, sf_item.holder); 304 | 268 sf_item.holder = 0; 269 } 270 assert(!cpkt->isWriteback()); 271 sf_item.holder |= req_mask; 272 sf_item.requested &= ~req_mask; 273 assert(sf_item.requested | sf_item.holder); 274 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 275 __func__, sf_item.requested, sf_item.holder); --- 18 unchanged lines hidden (view full) --- 294 if (!is_hit) 295 return; 296 297 SnoopItem& sf_item = sf_it->second; 298 299 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", 300 __func__, sf_item.requested, sf_item.holder); 301 |
305 // Remote (to this snoop filter) snoops update the filter 306 // already when they arrive from below, because we may not see 307 // any response. 308 if (cpkt->needsWritable()) { 309 // If the request to this snoop response hit an in-flight 310 // transaction, 311 // the holder was not reset -> no assertion & do that here, now! 312 //assert(sf_item.holder == 0); | 302 // If the snoop response has no sharers the line is passed in 303 // Modified state, and we know that there are no other copies, or 304 // they will all be invalidated imminently 305 if (!cpkt->hasSharers()) { |
313 sf_item.holder = 0; 314 } 315 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 316 __func__, sf_item.requested, sf_item.holder); 317 eraseIfNullEntry(sf_it); 318 319} 320 --- 17 unchanged lines hidden (view full) --- 338 339 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", 340 __func__, sf_item.requested, sf_item.holder); 341 342 // Make sure we have seen the actual request, too 343 panic_if(!(sf_item.requested & slave_mask), "SF value %x.%x missing "\ 344 "request bit\n", sf_item.requested, sf_item.holder); 345 | 306 sf_item.holder = 0; 307 } 308 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 309 __func__, sf_item.requested, sf_item.holder); 310 eraseIfNullEntry(sf_it); 311 312} 313 --- 17 unchanged lines hidden (view full) --- 331 332 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", 333 __func__, sf_item.requested, sf_item.holder); 334 335 // Make sure we have seen the actual request, too 336 panic_if(!(sf_item.requested & slave_mask), "SF value %x.%x missing "\ 337 "request bit\n", sf_item.requested, sf_item.holder); 338 |
346 // Update the residency of the cache line. Here we assume that the 347 // line has been zapped in all caches that are not the responder. 348 if (cpkt->needsWritable() || !cpkt->hasSharers()) | 339 // Update the residency of the cache line. If the response has no 340 // sharers we know that the line has been invalidated in all 341 // branches that are not where we are responding to. 342 if (!cpkt->hasSharers()) |
349 sf_item.holder = 0; 350 sf_item.holder |= slave_mask; 351 sf_item.requested &= ~slave_mask; 352 assert(sf_item.holder | sf_item.requested); 353 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 354 __func__, sf_item.requested, sf_item.holder); 355} 356 --- 37 unchanged lines hidden --- | 343 sf_item.holder = 0; 344 sf_item.holder |= slave_mask; 345 sf_item.requested &= ~slave_mask; 346 assert(sf_item.holder | sf_item.requested); 347 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 348 __func__, sf_item.requested, sf_item.holder); 349} 350 --- 37 unchanged lines hidden --- |