Skip to content

Commit 5c17848

Browse files
committed
KVM: x86/xen: Restrict hypercall MSR to unofficial synthetic range
Reject userspace attempts to set the Xen hypercall page MSR to an index outside of the "standard" virtualization range [0x40000000, 0x4fffffff], as KVM is not equipped to handle collisions with real MSRs, e.g. KVM doesn't update MSR interception, conflicts with VMCS/VMCB fields, special case writes in KVM, etc. While the MSR index isn't strictly ABI, i.e. can theoretically float to any value, in practice no known VMM sets the MSR index to anything other than 0x40000000 or 0x40000200. Cc: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org> Link: https://lore.kernel.org/r/20250215011437.1203084-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 3617c0e commit 5c17848

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

Documentation/virt/kvm/api.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,10 @@ blobs in userspace. When the guest writes the MSR, kvm copies one
10001000
page of a blob (32- or 64-bit, depending on the vcpu mode) to guest
10011001
memory.
10021002

1003+
The MSR index must be in the range [0x40000000, 0x4fffffff], i.e. must reside
1004+
in the range that is unofficially reserved for use by hypervisors. The min/max
1005+
values are enumerated via KVM_XEN_MSR_MIN_INDEX and KVM_XEN_MSR_MAX_INDEX.
1006+
10031007
::
10041008

10051009
struct kvm_xen_hvm_config {

arch/x86/include/uapi/asm/kvm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,9 @@ struct kvm_x86_mce {
559559
#define KVM_XEN_HVM_CONFIG_PVCLOCK_TSC_UNSTABLE (1 << 7)
560560
#define KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA (1 << 8)
561561

562+
#define KVM_XEN_MSR_MIN_INDEX 0x40000000u
563+
#define KVM_XEN_MSR_MAX_INDEX 0x4fffffffu
564+
562565
struct kvm_xen_hvm_config {
563566
__u32 flags;
564567
__u32 msr;

arch/x86/kvm/xen.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,15 @@ int kvm_xen_hvm_config(struct kvm *kvm, struct kvm_xen_hvm_config *xhc)
13241324
xhc->blob_size_32 || xhc->blob_size_64))
13251325
return -EINVAL;
13261326

1327+
/*
1328+
* Restrict the MSR to the range that is unofficially reserved for
1329+
* synthetic, virtualization-defined MSRs, e.g. to prevent confusing
1330+
* KVM by colliding with a real MSR that requires special handling.
1331+
*/
1332+
if (xhc->msr &&
1333+
(xhc->msr < KVM_XEN_MSR_MIN_INDEX || xhc->msr > KVM_XEN_MSR_MAX_INDEX))
1334+
return -EINVAL;
1335+
13271336
mutex_lock(&kvm->arch.xen.xen_lock);
13281337

13291338
if (xhc->msr && !kvm->arch.xen_hvm_config.msr)

0 commit comments

Comments
 (0)