It's possible to have XPTI not active for all PV domains (active for domUs,
inactive for dom0), hence don't gate setting the per-domain slot on the
presence of the per-pCPU shadow root page-table. Instead set the slot based on
whether XPTI is active for the domain. This avoid pointlessly setting the
per-domain slot if the shadow root page-table won't be used by the domain.
Fixes: 0d3e7f0b6bf0 ('xen/x86: support per-domain flag for xpti')
Signed-off-by: Roger Pau Monné <[email protected]>
---
xen/arch/x86/domain.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 78a13e6812c9..fd6bb3663027 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1902,12 +1902,11 @@ void cf_check paravirt_ctxt_switch_from(struct vcpu *v)
void cf_check paravirt_ctxt_switch_to(struct vcpu *v)
{
- root_pgentry_t *root_pgt = this_cpu(root_pgt);
+ const struct domain *d = v->domain;
- if ( root_pgt )
- root_pgt[root_table_offset(PERDOMAIN_VIRT_START)] =
- l4e_from_page(v->domain->arch.perdomain_l3_pg,
- __PAGE_HYPERVISOR_RW);
+ if ( d->arch.pv.xpti )
+ this_cpu(root_pgt)[root_table_offset(PERDOMAIN_VIRT_START)] =
+ l4e_from_page(d->arch.perdomain_l3_pg, __PAGE_HYPERVISOR_RW);
if ( unlikely(v->arch.dr7 & DR7_ACTIVE_MASK) )
activate_debugregs(v);
--
2.46.0