From 4d8fb74beffc71e2f77bbc725b5f4e7e601333a9 Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Thu, 22 Sep 2016 13:56:02 +0100 Subject: [PATCH] mem: Allow CMOs as snooping requests in the snoop filter The snoop filter performs sanity checks of the type of packets that are expected to snoop caches above. Cache maintenace operations are expected to perform a clean and or invalidate on all caches down to the specified point of reference and therefore could also generate snoops. Change-Id: I7f8fef246a85faa87ccd289c28b49686ed7caa08 Reviewed-by: Stephan Diestelhorst Reviewed-by: Anouk Van Laer Reviewed-on: https://gem5-review.googlesource.com/5052 Maintainer: Nikos Nikoleris Reviewed-by: Jason Lowe-Power --- src/mem/snoop_filter.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc index b372cfe21..252fbb524 100755 --- a/src/mem/snoop_filter.cc +++ b/src/mem/snoop_filter.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 ARM Limited + * Copyright (c) 2013-2017 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -215,10 +215,13 @@ SnoopFilter::lookupSnoop(const Packet* cpkt) // ReadEx and Writes require both invalidation and exlusivity, while reads // require neither. Writebacks on the other hand require exclusivity but // not the invalidation. Previously Writebacks did not generate upward - // snoops so this was never an aissue. Now that Writebacks generate snoops - // we need to special case for Writebacks. + // snoops so this was never an issue. Now that Writebacks generate snoops + // we need a special case for Writebacks. Additionally cache maintenance + // operations can generate snoops as they clean and/or invalidate all + // caches down to the specified point of reference. assert(cpkt->isWriteback() || cpkt->req->isUncacheable() || - (cpkt->isInvalidate() == cpkt->needsWritable())); + (cpkt->isInvalidate() == cpkt->needsWritable()) || + cpkt->req->isCacheMaintenance()); if (cpkt->isInvalidate() && !sf_item.requested) { // Early clear of the holder, if no other request is currently going on // @todo: This should possibly be updated even though we do not filter -- 2.30.2