Skip to content

Commit

Permalink
KVM: selftests: Force load all supported XSAVE state in state test
Browse files Browse the repository at this point in the history
Extend x86's state to forcefully load *all* host-supported xfeatures by
modifying xstate_bv in the saved state.  Stuffing xstate_bv ensures that
the selftest is verifying KVM's full ABI regardless of whether or not the
guest code is successful in getting various xfeatures out of their INIT
state, e.g. see the disaster that is/was MPX.

Link: https://lore.kernel.org/r/20230928001956.924301-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
  • Loading branch information
sean-jc committed Oct 4, 2023
1 parent d7b8762 commit afb2c7e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
9 changes: 9 additions & 0 deletions tools/testing/selftests/kvm/include/x86_64/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,15 @@ static inline bool kvm_pmu_has(struct kvm_x86_pmu_feature feature)
!kvm_cpu_has(feature.anti_feature);
}

static __always_inline uint64_t kvm_cpu_supported_xcr0(void)
{
if (!kvm_cpu_has_p(X86_PROPERTY_SUPPORTED_XCR0_LO))
return 0;

return kvm_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_LO) |
((uint64_t)kvm_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_HI) << 32);
}

static inline size_t kvm_cpuid2_size(int nr_entries)
{
return sizeof(struct kvm_cpuid2) +
Expand Down
14 changes: 14 additions & 0 deletions tools/testing/selftests/kvm/x86_64/state_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ static void __attribute__((__flatten__)) guest_code(void *arg)

int main(int argc, char *argv[])
{
uint64_t *xstate_bv, saved_xstate_bv;
vm_vaddr_t nested_gva = 0;
struct kvm_cpuid2 empty_cpuid = {};
struct kvm_regs regs1, regs2;
Expand Down Expand Up @@ -294,12 +295,25 @@ int main(int argc, char *argv[])
* allow KVM_SET_XSAVE regardless of guest CPUID. Manually
* load only XSAVE state, MSRs in particular have a much more
* convoluted ABI.
*
* Load two versions of XSAVE state: one with the actual guest
* XSAVE state, and one with all supported features forced "on"
* in xstate_bv, e.g. to ensure that KVM allows loading all
* supported features, even if something goes awry in saving
* the original snapshot.
*/
xstate_bv = (void *)&((uint8_t *)state->xsave->region)[512];
saved_xstate_bv = *xstate_bv;

vcpuN = __vm_vcpu_add(vm, vcpu->id + 1);
vcpu_xsave_set(vcpuN, state->xsave);
*xstate_bv = kvm_cpu_supported_xcr0();
vcpu_xsave_set(vcpuN, state->xsave);

vcpu_init_cpuid(vcpuN, &empty_cpuid);
vcpu_xsave_set(vcpuN, state->xsave);
*xstate_bv = saved_xstate_bv;
vcpu_xsave_set(vcpuN, state->xsave);

kvm_x86_state_cleanup(state);

Expand Down

0 comments on commit afb2c7e

Please sign in to comment.