summaryrefslogtreecommitdiff
path: root/src/dev/arm/smmu_v3_caches.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/arm/smmu_v3_caches.cc')
-rw-r--r--src/dev/arm/smmu_v3_caches.cc33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/dev/arm/smmu_v3_caches.cc b/src/dev/arm/smmu_v3_caches.cc
index 63f0b052b..d92c54480 100644
--- a/src/dev/arm/smmu_v3_caches.cc
+++ b/src/dev/arm/smmu_v3_caches.cc
@@ -1083,15 +1083,40 @@ WalkCache::store(const Entry &incoming)
}
void
-WalkCache::invalidateVA(Addr va, uint16_t asid, uint16_t vmid)
+WalkCache::invalidateVA(Addr va, uint16_t asid, uint16_t vmid,
+ const bool leaf_only)
{
- panic("%s unimplemented\n", __func__);
+ for (size_t s = 0; s < sets.size(); s++) {
+ Set &set = sets[s];
+
+ for (size_t i = 0; i < set.size(); i++) {
+ Entry &e = set[i];
+
+ if ((!leaf_only || e.leaf) && (e.va & e.vaMask) == (va & e.vaMask)
+ && e.asid == asid && e.vmid == vmid)
+ {
+ e.valid = false;
+ }
+ }
+ }
}
void
-WalkCache::invalidateVAA(Addr va, uint16_t vmid)
+WalkCache::invalidateVAA(Addr va, uint16_t vmid, const bool leaf_only)
{
- panic("%s unimplemented\n", __func__);
+ for (size_t s = 0; s < sets.size(); s++) {
+ Set &set = sets[s];
+
+ for (size_t i = 0; i < set.size(); i++) {
+ Entry &e = set[i];
+
+ if ((!leaf_only || e.leaf) && (e.va & e.vaMask) == (va & e.vaMask)
+ && e.vmid == vmid)
+ {
+ e.valid = false;
+ }
+ }
+ }
}
void