@@ -62,7 +62,7 @@ static void compare_xsave(u8 *from_host, u8 *from_guest)
62
62
abort ();
63
63
}
64
64
65
- static void test_sync_vmsa (uint32_t policy )
65
+ static void test_sync_vmsa (uint32_t type , uint64_t policy )
66
66
{
67
67
struct kvm_vcpu * vcpu ;
68
68
struct kvm_vm * vm ;
@@ -72,7 +72,7 @@ static void test_sync_vmsa(uint32_t policy)
72
72
double x87val = M_PI ;
73
73
struct kvm_xsave __attribute__((aligned (64 ))) xsave = { 0 };
74
74
75
- vm = vm_sev_create_with_one_vcpu (KVM_X86_SEV_ES_VM , guest_code_xsave , & vcpu );
75
+ vm = vm_sev_create_with_one_vcpu (type , guest_code_xsave , & vcpu );
76
76
gva = vm_vaddr_alloc_shared (vm , PAGE_SIZE , KVM_UTIL_MIN_VADDR ,
77
77
MEM_REGION_TEST_DATA );
78
78
hva = addr_gva2hva (vm , gva );
@@ -89,7 +89,7 @@ static void test_sync_vmsa(uint32_t policy)
89
89
: "ymm4" , "st" , "st(1)" , "st(2)" , "st(3)" , "st(4)" , "st(5)" , "st(6)" , "st(7)" );
90
90
vcpu_xsave_set (vcpu , & xsave );
91
91
92
- vm_sev_launch (vm , SEV_POLICY_ES | policy , NULL );
92
+ vm_sev_launch (vm , policy , NULL );
93
93
94
94
/* This page is shared, so make it decrypted. */
95
95
memset (hva , 0 , 4096 );
@@ -108,14 +108,12 @@ static void test_sync_vmsa(uint32_t policy)
108
108
kvm_vm_free (vm );
109
109
}
110
110
111
- static void test_sev (void * guest_code , uint64_t policy )
111
+ static void test_sev (void * guest_code , uint32_t type , uint64_t policy )
112
112
{
113
113
struct kvm_vcpu * vcpu ;
114
114
struct kvm_vm * vm ;
115
115
struct ucall uc ;
116
116
117
- uint32_t type = policy & SEV_POLICY_ES ? KVM_X86_SEV_ES_VM : KVM_X86_SEV_VM ;
118
-
119
117
vm = vm_sev_create_with_one_vcpu (type , guest_code , & vcpu );
120
118
121
119
/* TODO: Validate the measurement is as expected. */
@@ -161,16 +159,14 @@ static void guest_shutdown_code(void)
161
159
__asm__ __volatile__("ud2" );
162
160
}
163
161
164
- static void test_sev_es_shutdown ( void )
162
+ static void test_sev_shutdown ( uint32_t type , uint64_t policy )
165
163
{
166
164
struct kvm_vcpu * vcpu ;
167
165
struct kvm_vm * vm ;
168
166
169
- uint32_t type = KVM_X86_SEV_ES_VM ;
170
-
171
167
vm = vm_sev_create_with_one_vcpu (type , guest_shutdown_code , & vcpu );
172
168
173
- vm_sev_launch (vm , SEV_POLICY_ES , NULL );
169
+ vm_sev_launch (vm , policy , NULL );
174
170
175
171
vcpu_run (vcpu );
176
172
TEST_ASSERT (vcpu -> run -> exit_reason == KVM_EXIT_SHUTDOWN ,
@@ -180,27 +176,33 @@ static void test_sev_es_shutdown(void)
180
176
kvm_vm_free (vm );
181
177
}
182
178
183
- int main ( int argc , char * argv [] )
179
+ static void test_sev_smoke ( void * guest , uint32_t type , uint64_t policy )
184
180
{
185
181
const u64 xf_mask = XFEATURE_MASK_X87_AVX ;
186
182
187
- TEST_REQUIRE (kvm_cpu_has (X86_FEATURE_SEV ));
188
-
189
- test_sev (guest_sev_code , SEV_POLICY_NO_DBG );
190
- test_sev (guest_sev_code , 0 );
183
+ test_sev (guest , type , policy | SEV_POLICY_NO_DBG );
184
+ test_sev (guest , type , policy );
191
185
192
- if (kvm_cpu_has (X86_FEATURE_SEV_ES )) {
193
- test_sev (guest_sev_es_code , SEV_POLICY_ES | SEV_POLICY_NO_DBG );
194
- test_sev (guest_sev_es_code , SEV_POLICY_ES );
186
+ if (type == KVM_X86_SEV_VM )
187
+ return ;
195
188
196
- test_sev_es_shutdown ( );
189
+ test_sev_shutdown ( type , policy );
197
190
198
- if (kvm_has_cap (KVM_CAP_XCRS ) &&
199
- (xgetbv (0 ) & kvm_cpu_supported_xcr0 () & xf_mask ) == xf_mask ) {
200
- test_sync_vmsa (0 );
201
- test_sync_vmsa (SEV_POLICY_NO_DBG );
202
- }
191
+ if (kvm_has_cap (KVM_CAP_XCRS ) &&
192
+ (xgetbv (0 ) & kvm_cpu_supported_xcr0 () & xf_mask ) == xf_mask ) {
193
+ test_sync_vmsa (type , policy );
194
+ test_sync_vmsa (type , policy | SEV_POLICY_NO_DBG );
203
195
}
196
+ }
197
+
198
+ int main (int argc , char * argv [])
199
+ {
200
+ TEST_REQUIRE (kvm_cpu_has (X86_FEATURE_SEV ));
201
+
202
+ test_sev_smoke (guest_sev_code , KVM_X86_SEV_VM , 0 );
203
+
204
+ if (kvm_cpu_has (X86_FEATURE_SEV_ES ))
205
+ test_sev_smoke (guest_sev_es_code , KVM_X86_SEV_ES_VM , SEV_POLICY_ES );
204
206
205
207
return 0 ;
206
208
}
0 commit comments