selftests: kvm: fix state save/load on processors without XSAVE [Linux 4.19.72]

This Linux kernel change "selftests: kvm: fix state save/load on processors without XSAVE" is included in the Linux 4.19.72 release. This change is authored by Paolo Bonzini <pbonzini [at] redhat.com> on Tue Aug 20 17:35:52 2019 +0200. The commit for this change in Linux stable tree is 6cb9f8d (patch) which is from upstream commit 54577e5. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 54577e5.

selftests: kvm: fix state save/load on processors without XSAVE

[ Upstream commit 54577e5018a8c0cb79c9a0fa118a55c68715d398 ]

state_test and smm_test are failing on older processors that do not
have xcr0.  This is because on those processor KVM does provide
support for KVM_GET/SET_XSAVE (to avoid having to rely on the older
KVM_GET/SET_FPU) but not for KVM_GET/SET_XCRS.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 16 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 tools/testing/selftests/kvm/lib/x86.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/x86.c b/tools/testing/selftests/kvm/lib/x86.c
index a3122f1..4d35eba 100644
--- a/tools/testing/selftests/kvm/lib/x86.c
+++ b/tools/testing/selftests/kvm/lib/x86.c
@@ -809,9 +809,11 @@ struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid)
         TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XSAVE, r: %i",
                 r);

-   r = ioctl(vcpu->fd, KVM_GET_XCRS, &state->xcrs);
-        TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XCRS, r: %i",
-                r);
+   if (kvm_check_cap(KVM_CAP_XCRS)) {
+       r = ioctl(vcpu->fd, KVM_GET_XCRS, &state->xcrs);
+       TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XCRS, r: %i",
+               r);
+   }

    r = ioctl(vcpu->fd, KVM_GET_SREGS, &state->sregs);
         TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_SREGS, r: %i",
@@ -858,9 +860,11 @@ void vcpu_load_state(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_x86_state *s
         TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XSAVE, r: %i",
                 r);

-   r = ioctl(vcpu->fd, KVM_SET_XCRS, &state->xcrs);
-        TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XCRS, r: %i",
-                r);
+   if (kvm_check_cap(KVM_CAP_XCRS)) {
+       r = ioctl(vcpu->fd, KVM_SET_XCRS, &state->xcrs);
+       TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XCRS, r: %i",
+               r);
+   }

    r = ioctl(vcpu->fd, KVM_SET_SREGS, &state->sregs);
         TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_SREGS, r: %i",

Leave a Reply

Your email address will not be published. Required fields are marked *