From b53dd6d12efafb574989226911a7b0bc921df24d Mon Sep 17 00:00:00 2001 From: "Daniel R. Carvalho" Date: Wed, 19 Sep 2018 10:19:06 +0200 Subject: mem-cache: Fix non-bijective function in Skewed caches The hash() function must be bijective for the skewed caches to work, however when the hashing is done on top of a one-bit address, the MSB and LSB refer to the same bit, and therefore their xor will always be zero. This patch adds a fatal error to not allow the user to set an invalid value for the number of sets that would generate that bug. As a side note, the missing header for the bitfields functions has been added. Change-Id: I35a03ac5fdc4debb091f7f2db5db33568d0b0021 Reviewed-on: https://gem5-review.googlesource.com/12724 Reviewed-by: Nikos Nikoleris Maintainer: Nikos Nikoleris --- src/mem/cache/tags/skewed_assoc.cc | 5 +++++ src/mem/cache/tags/skewed_assoc.hh | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/mem/cache/tags/skewed_assoc.cc b/src/mem/cache/tags/skewed_assoc.cc index 044f8a3d7..b3945d0c4 100644 --- a/src/mem/cache/tags/skewed_assoc.cc +++ b/src/mem/cache/tags/skewed_assoc.cc @@ -37,6 +37,7 @@ #include +#include "base/bitfield.hh" #include "base/logging.hh" SkewedAssoc::SkewedAssoc(const Params *p) @@ -51,6 +52,10 @@ SkewedAssoc::SkewedAssoc(const Params *p) // skewing functions accordingly to make good use of the hashing function panic_if(setShift + 2 * (msbShift + 1) > 64, "Unsuported number of bits " \ "for the skewing functions."); + + // We must have more than two sets, otherwise the MSB and LSB are the same + // bit, and the xor of them will always be 0 + fatal_if(numSets <= 2, "The number of sets must be greater than 2"); } Addr diff --git a/src/mem/cache/tags/skewed_assoc.hh b/src/mem/cache/tags/skewed_assoc.hh index 7f5a75266..9fc39e297 100644 --- a/src/mem/cache/tags/skewed_assoc.hh +++ b/src/mem/cache/tags/skewed_assoc.hh @@ -73,6 +73,9 @@ class SkewedAssoc : public BaseSetAssoc * applies an XOR to the MSB and LSB, shifts all bits one bit to the right, * and set the result of the XOR as the new MSB. * + * This function is not bijective if the address has only 1 bit, as the MSB + * and LSB will be the same, and therefore the xor will always be 0. + * * @param addr The address to be hashed. * @param The hashed address. */ -- cgit v1.2.3