mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
KVM: x86/xen: re-initialize shared_info if guest (32/64-bit) mode is set
If the shared_info PFN cache has already been initialized then the content of the shared_info page needs to be re-initialized whenever the guest mode is (re)set. Setting the guest mode is either done explicitly by the VMM via the KVM_XEN_ATTR_TYPE_LONG_MODE attribute, or implicitly when the guest writes the MSR to set up the hypercall page. Signed-off-by: Paul Durrant <pdurrant@amazon.com> Reviewed-by: David Woodhouse <dwmw@amazon.co.uk> Link: https://lore.kernel.org/r/20240215152916.1158-12-paul@xen.org Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
c01c55a34f
commit
18b99e4d6d
1 changed files with 26 additions and 3 deletions
|
@ -625,8 +625,16 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
|
|||
} else {
|
||||
mutex_lock(&kvm->arch.xen.xen_lock);
|
||||
kvm->arch.xen.long_mode = !!data->u.long_mode;
|
||||
|
||||
/*
|
||||
* Re-initialize shared_info to put the wallclock in the
|
||||
* correct place. Whilst it's not necessary to do this
|
||||
* unless the mode is actually changed, it does no harm
|
||||
* to make the call anyway.
|
||||
*/
|
||||
r = kvm->arch.xen.shinfo_cache.active ?
|
||||
kvm_xen_shared_info_init(kvm) : 0;
|
||||
mutex_unlock(&kvm->arch.xen.xen_lock);
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1101,9 +1109,24 @@ int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data)
|
|||
u32 page_num = data & ~PAGE_MASK;
|
||||
u64 page_addr = data & PAGE_MASK;
|
||||
bool lm = is_long_mode(vcpu);
|
||||
int r = 0;
|
||||
|
||||
/* Latch long_mode for shared_info pages etc. */
|
||||
vcpu->kvm->arch.xen.long_mode = lm;
|
||||
mutex_lock(&kvm->arch.xen.xen_lock);
|
||||
if (kvm->arch.xen.long_mode != lm) {
|
||||
kvm->arch.xen.long_mode = lm;
|
||||
|
||||
/*
|
||||
* Re-initialize shared_info to put the wallclock in the
|
||||
* correct place.
|
||||
*/
|
||||
if (kvm->arch.xen.shinfo_cache.active &&
|
||||
kvm_xen_shared_info_init(kvm))
|
||||
r = 1;
|
||||
}
|
||||
mutex_unlock(&kvm->arch.xen.xen_lock);
|
||||
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
/*
|
||||
* If Xen hypercall intercept is enabled, fill the hypercall
|
||||
|
|
Loading…
Add table
Reference in a new issue