static void p2m_load_VTTBR(struct domain *d)
{
+ struct p2m_domain *p2m = &d->arch.p2m;
+
if ( is_idle_domain(d) )
return;
- BUG_ON(!d->arch.vttbr);
- WRITE_SYSREG64(d->arch.vttbr, VTTBR_EL2);
+
+ ASSERT(p2m->vttbr);
+
+ WRITE_SYSREG64(p2m->vttbr, VTTBR_EL2);
isb(); /* Ensure update is visible */
}
p2m->root = page;
- d->arch.vttbr = page_to_maddr(p2m->root)
- | ((uint64_t)p2m->vmid&0xff)<<48;
+ p2m->vttbr = page_to_maddr(p2m->root) | ((uint64_t)p2m->vmid & 0xff) << 48;
/*
* Make sure that all TLBs corresponding to the new VMID are flushed
ctxt.ifsr32_el2 = v->arch.ifsr;
#endif
- ctxt.vttbr_el2 = v->domain->arch.vttbr;
+ ctxt.vttbr_el2 = v->domain->arch.p2m.vttbr;
_show_registers(&v->arch.cpu_info->guest_cpu_user_regs, &ctxt, 1, v);
}
/* Current VMID in use */
uint8_t vmid;
+ /* Current Translation Table Base Register for the p2m */
+ uint64_t vttbr;
+
/*
* Highest guest frame that's ever been mapped in the p2m
* Only takes into account ram and foreign mapping