1
2
3
4
5
6
7
8#define _GNU_SOURCE
9#include <sys/ioctl.h>
10
11#include "test_util.h"
12#include "kvm_util.h"
13#include "vmx.h"
14
15#define VCPU_ID 1
16#define MSR_BITS 64
17
18#define X86_FEATURE_XSAVES (1<<3)
19
20bool is_supported_msr(u32 msr_index)
21{
22 struct kvm_msr_list *list;
23 bool found = false;
24 int i;
25
26 list = kvm_get_msr_index_list();
27 for (i = 0; i < list->nmsrs; ++i) {
28 if (list->indices[i] == msr_index) {
29 found = true;
30 break;
31 }
32 }
33
34 free(list);
35 return found;
36}
37
38int main(int argc, char *argv[])
39{
40 struct kvm_cpuid_entry2 *entry;
41 bool xss_supported = false;
42 struct kvm_vm *vm;
43 uint64_t xss_val;
44 int i, r;
45
46
47 vm = vm_create_default(VCPU_ID, 0, 0);
48
49 if (kvm_get_cpuid_max_basic() >= 0xd) {
50 entry = kvm_get_supported_cpuid_index(0xd, 1);
51 xss_supported = entry && !!(entry->eax & X86_FEATURE_XSAVES);
52 }
53 if (!xss_supported) {
54 print_skip("IA32_XSS is not supported by the vCPU");
55 exit(KSFT_SKIP);
56 }
57
58 xss_val = vcpu_get_msr(vm, VCPU_ID, MSR_IA32_XSS);
59 TEST_ASSERT(xss_val == 0,
60 "MSR_IA32_XSS should be initialized to zero\n");
61
62 vcpu_set_msr(vm, VCPU_ID, MSR_IA32_XSS, xss_val);
63
64
65
66
67
68
69 for (i = 0; i < MSR_BITS; ++i) {
70 r = _vcpu_set_msr(vm, VCPU_ID, MSR_IA32_XSS, 1ull << i);
71 TEST_ASSERT(r == 0 || is_supported_msr(MSR_IA32_XSS),
72 "IA32_XSS was able to be set, but was not found in KVM_GET_MSR_INDEX_LIST.\n");
73 }
74
75 kvm_vm_free(vm);
76}
77