From 8b52a6f657823f1cfad703df8376d8f90c042ac0 Mon Sep 17 00:00:00 2001 From: John Ingalls <43973001+ingallsj@users.noreply.github.com> Date: Mon, 13 Mar 2023 17:47:02 -0700 Subject: [PATCH] L1TLB: VS-mode SFENCE misses tera/giga-page entries fragmented superpages (#3297) --- src/main/scala/rocket/TLB.scala | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/scala/rocket/TLB.scala b/src/main/scala/rocket/TLB.scala index 91033990c6..977f73819f 100644 --- a/src/main/scala/rocket/TLB.scala +++ b/src/main/scala/rocket/TLB.scala @@ -219,13 +219,12 @@ class TLBEntry(val nSectors: Int, val superpage: Boolean, val superpageOnly: Boo for (((v, e), i) <- (valid zip entry_data).zipWithIndex) when (tag_v === virtual && i.U === sectorIdx(vpn)) { v := false.B } } - - // For fragmented superpage mappings, we assume the worst (largest) - // case, and zap entries whose most-significant VPNs match - when (((tag_vpn ^ vpn) >> (pgLevelBits * (pgLevels - 1))) === 0.U) { - for ((v, e) <- valid zip entry_data) - when (tag_v === virtual && e.fragmented_superpage) { v := false.B } - } + } + // For fragmented superpage mappings, we assume the worst (largest) + // case, and zap entries whose most-significant VPNs match + when (((tag_vpn ^ vpn) >> (pgLevelBits * (pgLevels - 1))) === 0.U) { + for ((v, e) <- valid zip entry_data) + when (tag_v === virtual && e.fragmented_superpage) { v := false.B } } } def invalidateNonGlobal(virtual: Bool): Unit = {