mem-cache: Fix non-bijective function in Skewed caches
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Wed, 19 Sep 2018 08:19:06 +0000 (10:19 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 19 Sep 2018 09:13:25 +0000 (09:13 +0000)
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 <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/tags/skewed_assoc.cc
src/mem/cache/tags/skewed_assoc.hh

index 044f8a3d7f4029c3157ace7dcedc9ee5c20c46eb..b3945d0c4c6293d59bd3a083d56f49626469cc04 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <vector>
 
+#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
index 7f5a75266984daffe29cc8018f23bd7e00ce3179..9fc39e297963616e51464bae6f0cb1131ce8c44a 100644 (file)
@@ -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.
      */