summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/isa.cc')
-rw-r--r--src/arch/arm/isa.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc
index 016e1eca0..fabbe0756 100644
--- a/src/arch/arm/isa.cc
+++ b/src/arch/arm/isa.cc
@@ -1393,8 +1393,27 @@ ISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
case MISCREG_TLBI_IPAS2E1IS_Xt:
case MISCREG_TLBI_IPAS2E1_Xt:
assert64(tc);
- // @todo: implement these as part of Virtualization
- warn("Not doing anything for write of miscreg ITLB_IPAS2\n");
+ target_el = 1; // EL 0 and 1 are handled together
+ scr = readMiscReg(MISCREG_SCR, tc);
+ secure_lookup = haveSecurity && !scr.ns;
+ sys = tc->getSystemPtr();
+ for (x = 0; x < sys->numContexts(); x++) {
+ oc = sys->getThreadContext(x);
+ assert(oc->getITBPtr() && oc->getDTBPtr());
+ Addr ipa = ((Addr) bits(newVal, 35, 0)) << 12;
+ oc->getITBPtr()->flushIpaVmid(ipa,
+ secure_lookup, false, target_el);
+ oc->getDTBPtr()->flushIpaVmid(ipa,
+ secure_lookup, false, target_el);
+
+ CheckerCPU *checker = oc->getCheckerCpuPtr();
+ if (checker) {
+ checker->getITBPtr()->flushIpaVmid(ipa,
+ secure_lookup, false, target_el);
+ checker->getDTBPtr()->flushIpaVmid(ipa,
+ secure_lookup, false, target_el);
+ }
+ }
return;
case MISCREG_ACTLR:
warn("Not doing anything for write of miscreg ACTLR\n");