dev-arm: Fix SMMUv3 walkMasks in page table ops
authorMichiel van Tol <Michiel.VanTol@arm.com>
Wed, 13 Nov 2019 17:01:14 +0000 (17:01 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 6 Jan 2020 15:45:04 +0000 (15:45 +0000)
The masks did not include the high bits above the active addressing
bits.
This could cause overlapping issues when using high addresses.
(Translated with TTBR1)

Change-Id: Ib705558aac456c1b3f069e1bd3ccdd9229a1c1d2
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23764
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/dev/arm/smmu_v3_ptops.cc

index 05c8bc022b037969824f050e78d9b111ec35c6f4..569b59e8ada39ed60107d01ed9ccfed3daf19fcf 100644 (file)
@@ -114,9 +114,9 @@ Addr
 V7LPageTableOps::walkMask(unsigned level) const
 {
     switch (level) {
-        case 1: return mask(39, 30);
-        case 2: return mask(39, 21);
-        case 3: return mask(39, 12);
+        case 1: return ~mask(30);
+        case 2: return ~mask(21);
+        case 3: return ~mask(12);
         default: panic("bad level %d", level);
     }
 }
@@ -207,10 +207,10 @@ Addr
 V8PageTableOps4k::walkMask(unsigned level) const
 {
     switch (level) {
-        case 0: return mask(47, 39);
-        case 1: return mask(47, 30);
-        case 2: return mask(47, 21);
-        case 3: return mask(47, 12);
+        case 0: return ~mask(39);
+        case 1: return ~mask(30);
+        case 2: return ~mask(21);
+        case 3: return ~mask(12);
         default: panic("bad level %d", level);
     }
 }
@@ -401,9 +401,9 @@ Addr
 V8PageTableOps64k::walkMask(unsigned level) const
 {
     switch (level) {
-        case 1: return mask(47, 42);
-        case 2: return mask(47, 29);
-        case 3: return mask(47, 16);
+        case 1: return ~mask(42);
+        case 2: return ~mask(29);
+        case 3: return ~mask(16);
         default: panic("bad level %d", level);
     }
 }