• Michael Roth's avatar
    KVM: SEV: Do not intercept accesses to MSR_IA32_XSS for SEV-ES guests · a26b7cd2
    Michael Roth authored
    When intercepts are enabled for MSR_IA32_XSS, the host will swap in/out
    the guest-defined values while context-switching to/from guest mode.
    However, in the case of SEV-ES, vcpu->arch.guest_state_protected is set,
    so the guest-defined value is effectively ignored when switching to
    guest mode with the understanding that the VMSA will handle swapping
    in/out this register state.
    
    However, SVM is still configured to intercept these accesses for SEV-ES
    guests, so the values in the initial MSR_IA32_XSS are effectively
    read-only, and a guest will experience undefined behavior if it actually
    tries to write to this MSR. Fortunately, only CET/shadowstack makes use
    of this register on SEV-ES-capable systems currently, which isn't yet
    widely used, but this may become more of an issue in the future.
    
    Additionally, enabling intercepts of MSR_IA32_XSS results in #VC
    exceptions in the guest in certain paths that can lead to unexpected #VC
    nesting levels. One example is SEV-SNP guests when handling #VC
    exceptions for CPUID instructions involving leaf 0xD, subleaf 0x1, since
    they will access MSR_IA32_XSS as part of servicing the CPUID #VC, then
    generate another #VC when accessing MSR_IA32_XSS, which can lead to
    guest crashes if an NMI occurs at that point in time. Running perf on a
    guest while it is issuing such a sequence is one example where these can
    be problematic.
    
    Address this by disabling intercepts of MSR_IA32_XSS for SEV-ES guests
    if the host/guest configuration allows it. If the host/guest
    configuration doesn't allow for MSR_IA32_XSS, leave it intercepted so
    that it can be caught by the existing checks in
    kvm_{set,get}_msr_common() if the guest still attempts to access it.
    
    Fixes: 376c6d28 ("KVM: SVM: Provide support for SEV-ES vCPU creation/loading")
    Cc: Alexey Kardashevskiy <aik@amd.com>
    Suggested-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarMichael Roth <michael.roth@amd.com>
    Message-Id: <20231016132819.1002933-4-michael.roth@amd.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    a26b7cd2
sev.c 80.8 KB