diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc index 1fc939bbfe..57e0d9230b 100644 --- a/src/arch/arm/table_walker.cc +++ b/src/arch/arm/table_walker.cc @@ -283,6 +283,15 @@ TableWalker::drainResume() } } +bool +TableWalker::uncacheableWalk() const +{ + bool disable_cacheability = isStage2 ? + currState->hcr.cd : + currState->sctlr.c == 0; + return disable_cacheability || currState->isUncacheable; +} + Fault TableWalker::walk(const RequestPtr &_req, ThreadContext *_tc, uint16_t _asid, vmid_t _vmid, MMU::Mode _mode, @@ -664,7 +673,7 @@ TableWalker::processWalk() currState->isSecure ? "s" : "ns"); Request::Flags flag = Request::PT_WALK; - if (currState->sctlr.c == 0 || currState->isUncacheable) { + if (uncacheableWalk()) { flag.set(Request::UNCACHEABLE); } @@ -819,7 +828,7 @@ TableWalker::processWalkLPAE() desc_addr, currState->isSecure ? "s" : "ns"); } - if (currState->sctlr.c == 0 || currState->isUncacheable) { + if (uncacheableWalk()) { flag.set(Request::UNCACHEABLE); } @@ -1057,7 +1066,7 @@ TableWalker::processWalkAArch64() } Request::Flags flag = Request::PT_WALK; - if (currState->sctlr.c == 0 || currState->isUncacheable) { + if (uncacheableWalk()) { flag.set(Request::UNCACHEABLE); } diff --git a/src/arch/arm/table_walker.hh b/src/arch/arm/table_walker.hh index 32f05ac316..bc25b62dab 100644 --- a/src/arch/arm/table_walker.hh +++ b/src/arch/arm/table_walker.hh @@ -1188,6 +1188,9 @@ class TableWalker : public ClockedObject /// system-wide setting or by the TCR_ELx IPS/PS setting bool checkAddrSizeFaultAArch64(Addr addr, int pa_range); + /// Returns true if the table walk should be uncacheable + bool uncacheableWalk() const; + Fault processWalkAArch64(); void processWalkWrapper(); EventFunctionWrapper doProcessEvent;