lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 066/207] KVM: x86: Inject #UD on emulated XSETBV if XSAVES isnt enabled
    Date
    From: Sean Christopherson <seanjc@google.com>

    commit 50b2d49bafa16e6311ab2da82f5aafc5f9ada99b upstream.

    Inject #UD when emulating XSETBV if CR4.OSXSAVE is not set. This also
    covers the "XSAVE not supported" check, as setting CR4.OSXSAVE=1 #GPs if
    XSAVE is not supported (and userspace gets to keep the pieces if it
    forces incoherent vCPU state).

    Add a comment to kvm_emulate_xsetbv() to call out that the CPU checks
    CR4.OSXSAVE before checking for intercepts. AMD'S APM implies that #UD
    has priority (says that intercepts are checked before #GP exceptions),
    while Intel's SDM says nothing about interception priority. However,
    testing on hardware shows that both AMD and Intel CPUs prioritize the #UD
    over interception.

    Fixes: 02d4160fbd76 ("x86: KVM: add xsetbv to the emulator")
    Cc: stable@vger.kernel.org
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20220824033057.3576315-4-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kvm/emulate.c | 3 +++
    arch/x86/kvm/x86.c | 1 +
    2 files changed, 4 insertions(+)

    --- a/arch/x86/kvm/emulate.c
    +++ b/arch/x86/kvm/emulate.c
    @@ -4134,6 +4134,9 @@ static int em_xsetbv(struct x86_emulate_
    {
    u32 eax, ecx, edx;

    + if (!(ctxt->ops->get_cr(ctxt, 4) & X86_CR4_OSXSAVE))
    + return emulate_ud(ctxt);
    +
    eax = reg_read(ctxt, VCPU_REGS_RAX);
    edx = reg_read(ctxt, VCPU_REGS_RDX);
    ecx = reg_read(ctxt, VCPU_REGS_RCX);
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -1079,6 +1079,7 @@ static int __kvm_set_xcr(struct kvm_vcpu

    int kvm_emulate_xsetbv(struct kvm_vcpu *vcpu)
    {
    + /* Note, #UD due to CR4.OSXSAVE=0 has priority over the intercept. */
    if (static_call(kvm_x86_get_cpl)(vcpu) != 0 ||
    __kvm_set_xcr(vcpu, kvm_rcx_read(vcpu), kvm_read_edx_eax(vcpu))) {
    kvm_inject_gp(vcpu, 0);

    \
     
     \ /
      Last update: 2022-09-26 13:47    [W:4.032 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site