summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2019-11-07 09:45:01 +0000
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2019-11-18 09:45:55 +0000
commit2dd1842a67fe75c8705c1b9136f9d91defdc24cb (patch)
tree1cf50e62554fde2d17edd0b1106061a1e5a11df5 /src/arch
parentdd77848e2cddfaacf8105fd8d3110d708d41b125 (diff)
downloadgem5-2dd1842a67fe75c8705c1b9136f9d91defdc24cb.tar.xz
arch-arm: Fix short descriptors cacheability during table walks
This implies checking for the SCTLR.C bit TTBR1.IRGN0 bits. Change-Id: I341faf85692ce2d2b4afd30a2f4aabac0e133192 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22724 Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/table_walker.cc19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc
index ff4e67554..52e6be748 100644
--- a/src/arch/arm/table_walker.cc
+++ b/src/arch/arm/table_walker.cc
@@ -456,6 +456,15 @@ TableWalker::processWalk()
{
Addr ttbr = 0;
+ // For short descriptors, translation configs are held in
+ // TTBR1.
+ RegVal ttbr1 = currState->tc->readMiscReg(snsBankedIndex(
+ MISCREG_TTBR1, currState->tc, !currState->isSecure));
+
+ const auto irgn0_mask = 0x1;
+ const auto irgn1_mask = 0x40;
+ currState->isUncacheable = (ttbr1 & (irgn0_mask | irgn1_mask)) == 0;
+
// If translation isn't enabled, we shouldn't be here
assert(currState->sctlr.m || isStage2);
const bool is_atomic = currState->req->isAtomic();
@@ -505,8 +514,7 @@ TableWalker::processWalk()
ArmFault::TranslationLL + L1, isStage2,
ArmFault::VmsaTran);
}
- ttbr = currState->tc->readMiscReg(snsBankedIndex(
- MISCREG_TTBR1, currState->tc, !currState->isSecure));
+ ttbr = ttbr1;
currState->ttbcr.n = 0;
}
@@ -533,7 +541,7 @@ TableWalker::processWalk()
}
Request::Flags flag = Request::PT_WALK;
- if (currState->sctlr.c == 0) {
+ if (currState->sctlr.c == 0 || currState->isUncacheable) {
flag.set(Request::UNCACHEABLE);
}
@@ -1545,6 +1553,11 @@ TableWalker::doL1Descriptor()
}
Request::Flags flag = Request::PT_WALK;
+
+ if (currState->sctlr.c == 0 || currState->isUncacheable) {
+ flag.set(Request::UNCACHEABLE);
+ }
+
if (currState->isSecure)
flag.set(Request::SECURE);