From debcbca7ded48b7aee928cb46f03ca1525fdc4b6 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sat, 15 Apr 2017 00:54:49 -0700 Subject: [PATCH] Make PMP tolerant to PA size << VA size --- src/main/scala/rocket/PMP.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/rocket/PMP.scala b/src/main/scala/rocket/PMP.scala index fb19755f..cec4f25e 100644 --- a/src/main/scala/rocket/PMP.scala +++ b/src/main/scala/rocket/PMP.scala @@ -80,7 +80,7 @@ class PMP(implicit p: Parameters) extends PMPReg { prev.lowerBoundMatch(x, lgSize, lgMaxSize) && upperBoundMatch(x, lgMaxSize) private def pow2Homogeneous(x: UInt, pgLevel: UInt) = { - val maskHomogeneous = pgLevelMap { idxBits => mask(idxBits - 1) } (pgLevel) + val maskHomogeneous = pgLevelMap { idxBits => if (idxBits > paddrBits) false.B else mask(idxBits - 1) } (pgLevel) maskHomogeneous || (pgLevelMap { idxBits => ((x ^ comparand) >> idxBits) =/= 0 } (pgLevel)) } @@ -92,7 +92,7 @@ class PMP(implicit p: Parameters) extends PMPReg { val beginsAfterLower = !(x < prev.comparand) val beginsAfterUpper = !(x < comparand) - val pgMask = pgLevelMap { idxBits => ((BigInt(1) << paddrBits) - (BigInt(1) << idxBits)).U } (pgLevel) + val pgMask = pgLevelMap { idxBits => (((BigInt(1) << paddrBits) - (BigInt(1) << idxBits)) max 0).U } (pgLevel) val endsBeforeLower = (x & pgMask) < (prev.comparand & pgMask) val endsBeforeUpper = (x & pgMask) < (comparand & pgMask)