diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c index ca6d526f46..9311858d63 100644 --- a/xen/arch/x86/hvm/viridian/time.c +++ b/xen/arch/x86/hvm/viridian/time.c @@ -108,8 +108,10 @@ static void time_ref_count_thaw(const struct domain *d) trc->off = (int64_t)trc->val - trc_val(d, 0); + spin_lock(&vd->lock); if ( vd->reference_tsc.msr.enabled ) update_reference_tsc(d, false); + spin_unlock(&vd->lock); } static uint64_t time_ref_count(const struct domain *d) @@ -331,6 +333,7 @@ int viridian_time_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val) if ( !(viridian_feature_mask(d) & HVMPV_reference_tsc) ) return X86EMUL_EXCEPTION; + spin_lock(&vd->lock); viridian_unmap_guest_page(&vd->reference_tsc); vd->reference_tsc.msr.raw = val; viridian_dump_guest_page(v, "REFERENCE_TSC", &vd->reference_tsc); @@ -339,6 +342,7 @@ int viridian_time_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val) viridian_map_guest_page(d, &vd->reference_tsc); update_reference_tsc(d, true); } + spin_unlock(&vd->lock); break; case HV_X64_MSR_TIME_REF_COUNT: diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c index 7ea6c90168..c0be24bd22 100644 --- a/xen/arch/x86/hvm/viridian/viridian.c +++ b/xen/arch/x86/hvm/viridian/viridian.c @@ -494,6 +494,8 @@ int viridian_domain_init(struct domain *d) if ( !d->arch.hvm.viridian ) return -ENOMEM; + spin_lock_init(&d->arch.hvm.viridian->lock); + rc = viridian_synic_domain_init(d); if ( rc ) goto fail; diff --git a/xen/arch/x86/include/asm/hvm/viridian.h b/xen/arch/x86/include/asm/hvm/viridian.h index 4c8ff6e80b..47c9d13841 100644 --- a/xen/arch/x86/include/asm/hvm/viridian.h +++ b/xen/arch/x86/include/asm/hvm/viridian.h @@ -71,6 +71,7 @@ struct viridian_domain DECLARE_BITMAP(hypercall_flags, _HCALL_nr); struct viridian_time_ref_count time_ref_count; struct viridian_page reference_tsc; + spinlock_t lock; }; void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf,