• Sean Christopherson's avatar
    KVM: x86: Allow, don't ignore, same-value writes to immutable MSRs · 1d294dfa
    Sean Christopherson authored
    When handling userspace writes to immutable feature MSRs for a vCPU that
    has already run, fall through into the normal code to set the MSR instead
    of immediately returning '0'.  I.e. allow such writes, instead of ignoring
    such writes.  This fixes a bug where KVM incorrectly allows writes to the
    VMX MSRs that enumerate which CR{0,4} can be set, but only if the vCPU has
    already run.
    
    The intent of returning '0' and thus ignoring the write, was to avoid any
    side effects, e.g. refreshing the PMU and thus doing weird things with
    perf events while the vCPU is running.  That approach sounds nice in
    theory, but in practice it makes it all but impossible to maintain a sane
    ABI, e.g. all VMX MSRs return -EBUSY if the CPU is post-VMXON, and the VMX
    MSRs for fixed-1 CR bits are never writable, etc.
    
    As for refreshing the PMU, kvm_set_msr_common() explicitly skips the PMU
    refresh if MSR_IA32_PERF_CAPABILITIES is being written with the current
    value, specifically to avoid unwanted side effects.  And if necessary,
    adding similar logic for other MSRs is not difficult.
    
    Fixes: 0094f62c ("KVM: x86: Disallow writes to immutable feature MSRs after KVM_RUN")
    Reported-by: default avatarJim Mattson <jmattson@google.com>
    Cc: Raghavendra Rao Ananta <rananta@google.com>
    Link: https://lore.kernel.org/r/20240408231500.1388122-1-seanjc@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    1d294dfa
x86.c 372 KB