xref: /linux/tools/testing/selftests/kvm/include/x86/evmcs.h (revision 978c4df4b2458ec5a26bc6fe8c8ac57bfaf6c9db)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2018, Red Hat, Inc.
4  */
5 
6 #ifndef SELFTEST_KVM_EVMCS_H
7 #define SELFTEST_KVM_EVMCS_H
8 
9 #include <stdint.h>
10 #include "hyperv.h"
11 #include "vmx.h"
12 
13 #define u16 u16
14 #define u32 u32
15 #define u64 u64
16 
17 #define EVMCS_VERSION 1
18 
19 extern bool enable_evmcs;
20 
21 struct hv_enlightened_vmcs {
22 	u32 revision_id;
23 	u32 abort;
24 
25 	u16 host_es_selector;
26 	u16 host_cs_selector;
27 	u16 host_ss_selector;
28 	u16 host_ds_selector;
29 	u16 host_fs_selector;
30 	u16 host_gs_selector;
31 	u16 host_tr_selector;
32 
33 	u16 padding16_1;
34 
35 	u64 host_ia32_pat;
36 	u64 host_ia32_efer;
37 
38 	u64 host_cr0;
39 	u64 host_cr3;
40 	u64 host_cr4;
41 
42 	u64 host_ia32_sysenter_esp;
43 	u64 host_ia32_sysenter_eip;
44 	u64 host_rip;
45 	u32 host_ia32_sysenter_cs;
46 
47 	u32 pin_based_vm_exec_control;
48 	u32 vm_exit_controls;
49 	u32 secondary_vm_exec_control;
50 
51 	u64 io_bitmap_a;
52 	u64 io_bitmap_b;
53 	u64 msr_bitmap;
54 
55 	u16 guest_es_selector;
56 	u16 guest_cs_selector;
57 	u16 guest_ss_selector;
58 	u16 guest_ds_selector;
59 	u16 guest_fs_selector;
60 	u16 guest_gs_selector;
61 	u16 guest_ldtr_selector;
62 	u16 guest_tr_selector;
63 
64 	u32 guest_es_limit;
65 	u32 guest_cs_limit;
66 	u32 guest_ss_limit;
67 	u32 guest_ds_limit;
68 	u32 guest_fs_limit;
69 	u32 guest_gs_limit;
70 	u32 guest_ldtr_limit;
71 	u32 guest_tr_limit;
72 	u32 guest_gdtr_limit;
73 	u32 guest_idtr_limit;
74 
75 	u32 guest_es_ar_bytes;
76 	u32 guest_cs_ar_bytes;
77 	u32 guest_ss_ar_bytes;
78 	u32 guest_ds_ar_bytes;
79 	u32 guest_fs_ar_bytes;
80 	u32 guest_gs_ar_bytes;
81 	u32 guest_ldtr_ar_bytes;
82 	u32 guest_tr_ar_bytes;
83 
84 	u64 guest_es_base;
85 	u64 guest_cs_base;
86 	u64 guest_ss_base;
87 	u64 guest_ds_base;
88 	u64 guest_fs_base;
89 	u64 guest_gs_base;
90 	u64 guest_ldtr_base;
91 	u64 guest_tr_base;
92 	u64 guest_gdtr_base;
93 	u64 guest_idtr_base;
94 
95 	u64 padding64_1[3];
96 
97 	u64 vm_exit_msr_store_addr;
98 	u64 vm_exit_msr_load_addr;
99 	u64 vm_entry_msr_load_addr;
100 
101 	u64 cr3_target_value0;
102 	u64 cr3_target_value1;
103 	u64 cr3_target_value2;
104 	u64 cr3_target_value3;
105 
106 	u32 page_fault_error_code_mask;
107 	u32 page_fault_error_code_match;
108 
109 	u32 cr3_target_count;
110 	u32 vm_exit_msr_store_count;
111 	u32 vm_exit_msr_load_count;
112 	u32 vm_entry_msr_load_count;
113 
114 	u64 tsc_offset;
115 	u64 virtual_apic_page_addr;
116 	u64 vmcs_link_pointer;
117 
118 	u64 guest_ia32_debugctl;
119 	u64 guest_ia32_pat;
120 	u64 guest_ia32_efer;
121 
122 	u64 guest_pdptr0;
123 	u64 guest_pdptr1;
124 	u64 guest_pdptr2;
125 	u64 guest_pdptr3;
126 
127 	u64 guest_pending_dbg_exceptions;
128 	u64 guest_sysenter_esp;
129 	u64 guest_sysenter_eip;
130 
131 	u32 guest_activity_state;
132 	u32 guest_sysenter_cs;
133 
134 	u64 cr0_guest_host_mask;
135 	u64 cr4_guest_host_mask;
136 	u64 cr0_read_shadow;
137 	u64 cr4_read_shadow;
138 	u64 guest_cr0;
139 	u64 guest_cr3;
140 	u64 guest_cr4;
141 	u64 guest_dr7;
142 
143 	u64 host_fs_base;
144 	u64 host_gs_base;
145 	u64 host_tr_base;
146 	u64 host_gdtr_base;
147 	u64 host_idtr_base;
148 	u64 host_rsp;
149 
150 	u64 ept_pointer;
151 
152 	u16 virtual_processor_id;
153 	u16 padding16_2[3];
154 
155 	u64 padding64_2[5];
156 	u64 guest_physical_address;
157 
158 	u32 vm_instruction_error;
159 	u32 vm_exit_reason;
160 	u32 vm_exit_intr_info;
161 	u32 vm_exit_intr_error_code;
162 	u32 idt_vectoring_info_field;
163 	u32 idt_vectoring_error_code;
164 	u32 vm_exit_instruction_len;
165 	u32 vmx_instruction_info;
166 
167 	u64 exit_qualification;
168 	u64 exit_io_instruction_ecx;
169 	u64 exit_io_instruction_esi;
170 	u64 exit_io_instruction_edi;
171 	u64 exit_io_instruction_eip;
172 
173 	u64 guest_linear_address;
174 	u64 guest_rsp;
175 	u64 guest_rflags;
176 
177 	u32 guest_interruptibility_info;
178 	u32 cpu_based_vm_exec_control;
179 	u32 exception_bitmap;
180 	u32 vm_entry_controls;
181 	u32 vm_entry_intr_info_field;
182 	u32 vm_entry_exception_error_code;
183 	u32 vm_entry_instruction_len;
184 	u32 tpr_threshold;
185 
186 	u64 guest_rip;
187 
188 	u32 hv_clean_fields;
189 	u32 padding32_1;
190 	u32 hv_synthetic_controls;
191 	struct {
192 		u32 nested_flush_hypercall:1;
193 		u32 msr_bitmap:1;
194 		u32 reserved:30;
195 	}  __packed hv_enlightenments_control;
196 	u32 hv_vp_id;
197 	u32 padding32_2;
198 	u64 hv_vm_id;
199 	u64 partition_assist_page;
200 	u64 padding64_4[4];
201 	u64 guest_bndcfgs;
202 	u64 guest_ia32_perf_global_ctrl;
203 	u64 guest_ia32_s_cet;
204 	u64 guest_ssp;
205 	u64 guest_ia32_int_ssp_table_addr;
206 	u64 guest_ia32_lbr_ctl;
207 	u64 padding64_5[2];
208 	u64 xss_exit_bitmap;
209 	u64 encls_exiting_bitmap;
210 	u64 host_ia32_perf_global_ctrl;
211 	u64 tsc_multiplier;
212 	u64 host_ia32_s_cet;
213 	u64 host_ssp;
214 	u64 host_ia32_int_ssp_table_addr;
215 	u64 padding64_6;
216 } __packed;
217 
218 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE                     0
219 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP                BIT(0)
220 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP               BIT(1)
221 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2             BIT(2)
222 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1             BIT(3)
223 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC             BIT(4)
224 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT            BIT(5)
225 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY            BIT(6)
226 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN            BIT(7)
227 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR                     BIT(8)
228 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT             BIT(9)
229 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC              BIT(10)
230 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1               BIT(11)
231 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2               BIT(12)
232 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER             BIT(13)
233 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1                BIT(14)
234 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ENLIGHTENMENTSCONTROL    BIT(15)
235 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL                      0xFFFF
236 
237 #define HV_VMX_SYNTHETIC_EXIT_REASON_TRAP_AFTER_FLUSH 0x10000031
238 
239 extern struct hv_enlightened_vmcs *current_evmcs;
240 
241 int vcpu_enable_evmcs(struct kvm_vcpu *vcpu);
242 
243 static inline void evmcs_enable(void)
244 {
245 	enable_evmcs = true;
246 }
247 
248 static inline void evmcs_vmptrld(u64 vmcs_pa, void *vmcs)
249 {
250 	current_vp_assist->current_nested_vmcs = vmcs_pa;
251 	current_vp_assist->enlighten_vmentry = 1;
252 
253 	current_evmcs = vmcs;
254 }
255 
256 static inline void load_evmcs(struct hyperv_test_pages *hv)
257 {
258 	evmcs_vmptrld(hv->enlightened_vmcs_gpa, hv->enlightened_vmcs);
259 	current_evmcs->revision_id = EVMCS_VERSION;
260 }
261 
262 static inline int evmcs_vmread(u64 encoding, u64 *value)
263 {
264 	switch (encoding) {
265 	case GUEST_RIP:
266 		*value = current_evmcs->guest_rip;
267 		break;
268 	case GUEST_RSP:
269 		*value = current_evmcs->guest_rsp;
270 		break;
271 	case GUEST_RFLAGS:
272 		*value = current_evmcs->guest_rflags;
273 		break;
274 	case HOST_IA32_PAT:
275 		*value = current_evmcs->host_ia32_pat;
276 		break;
277 	case HOST_IA32_EFER:
278 		*value = current_evmcs->host_ia32_efer;
279 		break;
280 	case HOST_CR0:
281 		*value = current_evmcs->host_cr0;
282 		break;
283 	case HOST_CR3:
284 		*value = current_evmcs->host_cr3;
285 		break;
286 	case HOST_CR4:
287 		*value = current_evmcs->host_cr4;
288 		break;
289 	case HOST_IA32_SYSENTER_ESP:
290 		*value = current_evmcs->host_ia32_sysenter_esp;
291 		break;
292 	case HOST_IA32_SYSENTER_EIP:
293 		*value = current_evmcs->host_ia32_sysenter_eip;
294 		break;
295 	case HOST_RIP:
296 		*value = current_evmcs->host_rip;
297 		break;
298 	case IO_BITMAP_A:
299 		*value = current_evmcs->io_bitmap_a;
300 		break;
301 	case IO_BITMAP_B:
302 		*value = current_evmcs->io_bitmap_b;
303 		break;
304 	case MSR_BITMAP:
305 		*value = current_evmcs->msr_bitmap;
306 		break;
307 	case GUEST_ES_BASE:
308 		*value = current_evmcs->guest_es_base;
309 		break;
310 	case GUEST_CS_BASE:
311 		*value = current_evmcs->guest_cs_base;
312 		break;
313 	case GUEST_SS_BASE:
314 		*value = current_evmcs->guest_ss_base;
315 		break;
316 	case GUEST_DS_BASE:
317 		*value = current_evmcs->guest_ds_base;
318 		break;
319 	case GUEST_FS_BASE:
320 		*value = current_evmcs->guest_fs_base;
321 		break;
322 	case GUEST_GS_BASE:
323 		*value = current_evmcs->guest_gs_base;
324 		break;
325 	case GUEST_LDTR_BASE:
326 		*value = current_evmcs->guest_ldtr_base;
327 		break;
328 	case GUEST_TR_BASE:
329 		*value = current_evmcs->guest_tr_base;
330 		break;
331 	case GUEST_GDTR_BASE:
332 		*value = current_evmcs->guest_gdtr_base;
333 		break;
334 	case GUEST_IDTR_BASE:
335 		*value = current_evmcs->guest_idtr_base;
336 		break;
337 	case TSC_OFFSET:
338 		*value = current_evmcs->tsc_offset;
339 		break;
340 	case VIRTUAL_APIC_PAGE_ADDR:
341 		*value = current_evmcs->virtual_apic_page_addr;
342 		break;
343 	case VMCS_LINK_POINTER:
344 		*value = current_evmcs->vmcs_link_pointer;
345 		break;
346 	case GUEST_IA32_DEBUGCTL:
347 		*value = current_evmcs->guest_ia32_debugctl;
348 		break;
349 	case GUEST_IA32_PAT:
350 		*value = current_evmcs->guest_ia32_pat;
351 		break;
352 	case GUEST_IA32_EFER:
353 		*value = current_evmcs->guest_ia32_efer;
354 		break;
355 	case GUEST_PDPTR0:
356 		*value = current_evmcs->guest_pdptr0;
357 		break;
358 	case GUEST_PDPTR1:
359 		*value = current_evmcs->guest_pdptr1;
360 		break;
361 	case GUEST_PDPTR2:
362 		*value = current_evmcs->guest_pdptr2;
363 		break;
364 	case GUEST_PDPTR3:
365 		*value = current_evmcs->guest_pdptr3;
366 		break;
367 	case GUEST_PENDING_DBG_EXCEPTIONS:
368 		*value = current_evmcs->guest_pending_dbg_exceptions;
369 		break;
370 	case GUEST_SYSENTER_ESP:
371 		*value = current_evmcs->guest_sysenter_esp;
372 		break;
373 	case GUEST_SYSENTER_EIP:
374 		*value = current_evmcs->guest_sysenter_eip;
375 		break;
376 	case CR0_GUEST_HOST_MASK:
377 		*value = current_evmcs->cr0_guest_host_mask;
378 		break;
379 	case CR4_GUEST_HOST_MASK:
380 		*value = current_evmcs->cr4_guest_host_mask;
381 		break;
382 	case CR0_READ_SHADOW:
383 		*value = current_evmcs->cr0_read_shadow;
384 		break;
385 	case CR4_READ_SHADOW:
386 		*value = current_evmcs->cr4_read_shadow;
387 		break;
388 	case GUEST_CR0:
389 		*value = current_evmcs->guest_cr0;
390 		break;
391 	case GUEST_CR3:
392 		*value = current_evmcs->guest_cr3;
393 		break;
394 	case GUEST_CR4:
395 		*value = current_evmcs->guest_cr4;
396 		break;
397 	case GUEST_DR7:
398 		*value = current_evmcs->guest_dr7;
399 		break;
400 	case HOST_FS_BASE:
401 		*value = current_evmcs->host_fs_base;
402 		break;
403 	case HOST_GS_BASE:
404 		*value = current_evmcs->host_gs_base;
405 		break;
406 	case HOST_TR_BASE:
407 		*value = current_evmcs->host_tr_base;
408 		break;
409 	case HOST_GDTR_BASE:
410 		*value = current_evmcs->host_gdtr_base;
411 		break;
412 	case HOST_IDTR_BASE:
413 		*value = current_evmcs->host_idtr_base;
414 		break;
415 	case HOST_RSP:
416 		*value = current_evmcs->host_rsp;
417 		break;
418 	case EPT_POINTER:
419 		*value = current_evmcs->ept_pointer;
420 		break;
421 	case GUEST_BNDCFGS:
422 		*value = current_evmcs->guest_bndcfgs;
423 		break;
424 	case XSS_EXIT_BITMAP:
425 		*value = current_evmcs->xss_exit_bitmap;
426 		break;
427 	case GUEST_PHYSICAL_ADDRESS:
428 		*value = current_evmcs->guest_physical_address;
429 		break;
430 	case EXIT_QUALIFICATION:
431 		*value = current_evmcs->exit_qualification;
432 		break;
433 	case GUEST_LINEAR_ADDRESS:
434 		*value = current_evmcs->guest_linear_address;
435 		break;
436 	case VM_EXIT_MSR_STORE_ADDR:
437 		*value = current_evmcs->vm_exit_msr_store_addr;
438 		break;
439 	case VM_EXIT_MSR_LOAD_ADDR:
440 		*value = current_evmcs->vm_exit_msr_load_addr;
441 		break;
442 	case VM_ENTRY_MSR_LOAD_ADDR:
443 		*value = current_evmcs->vm_entry_msr_load_addr;
444 		break;
445 	case CR3_TARGET_VALUE0:
446 		*value = current_evmcs->cr3_target_value0;
447 		break;
448 	case CR3_TARGET_VALUE1:
449 		*value = current_evmcs->cr3_target_value1;
450 		break;
451 	case CR3_TARGET_VALUE2:
452 		*value = current_evmcs->cr3_target_value2;
453 		break;
454 	case CR3_TARGET_VALUE3:
455 		*value = current_evmcs->cr3_target_value3;
456 		break;
457 	case TPR_THRESHOLD:
458 		*value = current_evmcs->tpr_threshold;
459 		break;
460 	case GUEST_INTERRUPTIBILITY_INFO:
461 		*value = current_evmcs->guest_interruptibility_info;
462 		break;
463 	case CPU_BASED_VM_EXEC_CONTROL:
464 		*value = current_evmcs->cpu_based_vm_exec_control;
465 		break;
466 	case EXCEPTION_BITMAP:
467 		*value = current_evmcs->exception_bitmap;
468 		break;
469 	case VM_ENTRY_CONTROLS:
470 		*value = current_evmcs->vm_entry_controls;
471 		break;
472 	case VM_ENTRY_INTR_INFO_FIELD:
473 		*value = current_evmcs->vm_entry_intr_info_field;
474 		break;
475 	case VM_ENTRY_EXCEPTION_ERROR_CODE:
476 		*value = current_evmcs->vm_entry_exception_error_code;
477 		break;
478 	case VM_ENTRY_INSTRUCTION_LEN:
479 		*value = current_evmcs->vm_entry_instruction_len;
480 		break;
481 	case HOST_IA32_SYSENTER_CS:
482 		*value = current_evmcs->host_ia32_sysenter_cs;
483 		break;
484 	case PIN_BASED_VM_EXEC_CONTROL:
485 		*value = current_evmcs->pin_based_vm_exec_control;
486 		break;
487 	case VM_EXIT_CONTROLS:
488 		*value = current_evmcs->vm_exit_controls;
489 		break;
490 	case SECONDARY_VM_EXEC_CONTROL:
491 		*value = current_evmcs->secondary_vm_exec_control;
492 		break;
493 	case GUEST_ES_LIMIT:
494 		*value = current_evmcs->guest_es_limit;
495 		break;
496 	case GUEST_CS_LIMIT:
497 		*value = current_evmcs->guest_cs_limit;
498 		break;
499 	case GUEST_SS_LIMIT:
500 		*value = current_evmcs->guest_ss_limit;
501 		break;
502 	case GUEST_DS_LIMIT:
503 		*value = current_evmcs->guest_ds_limit;
504 		break;
505 	case GUEST_FS_LIMIT:
506 		*value = current_evmcs->guest_fs_limit;
507 		break;
508 	case GUEST_GS_LIMIT:
509 		*value = current_evmcs->guest_gs_limit;
510 		break;
511 	case GUEST_LDTR_LIMIT:
512 		*value = current_evmcs->guest_ldtr_limit;
513 		break;
514 	case GUEST_TR_LIMIT:
515 		*value = current_evmcs->guest_tr_limit;
516 		break;
517 	case GUEST_GDTR_LIMIT:
518 		*value = current_evmcs->guest_gdtr_limit;
519 		break;
520 	case GUEST_IDTR_LIMIT:
521 		*value = current_evmcs->guest_idtr_limit;
522 		break;
523 	case GUEST_ES_AR_BYTES:
524 		*value = current_evmcs->guest_es_ar_bytes;
525 		break;
526 	case GUEST_CS_AR_BYTES:
527 		*value = current_evmcs->guest_cs_ar_bytes;
528 		break;
529 	case GUEST_SS_AR_BYTES:
530 		*value = current_evmcs->guest_ss_ar_bytes;
531 		break;
532 	case GUEST_DS_AR_BYTES:
533 		*value = current_evmcs->guest_ds_ar_bytes;
534 		break;
535 	case GUEST_FS_AR_BYTES:
536 		*value = current_evmcs->guest_fs_ar_bytes;
537 		break;
538 	case GUEST_GS_AR_BYTES:
539 		*value = current_evmcs->guest_gs_ar_bytes;
540 		break;
541 	case GUEST_LDTR_AR_BYTES:
542 		*value = current_evmcs->guest_ldtr_ar_bytes;
543 		break;
544 	case GUEST_TR_AR_BYTES:
545 		*value = current_evmcs->guest_tr_ar_bytes;
546 		break;
547 	case GUEST_ACTIVITY_STATE:
548 		*value = current_evmcs->guest_activity_state;
549 		break;
550 	case GUEST_SYSENTER_CS:
551 		*value = current_evmcs->guest_sysenter_cs;
552 		break;
553 	case VM_INSTRUCTION_ERROR:
554 		*value = current_evmcs->vm_instruction_error;
555 		break;
556 	case VM_EXIT_REASON:
557 		*value = current_evmcs->vm_exit_reason;
558 		break;
559 	case VM_EXIT_INTR_INFO:
560 		*value = current_evmcs->vm_exit_intr_info;
561 		break;
562 	case VM_EXIT_INTR_ERROR_CODE:
563 		*value = current_evmcs->vm_exit_intr_error_code;
564 		break;
565 	case IDT_VECTORING_INFO_FIELD:
566 		*value = current_evmcs->idt_vectoring_info_field;
567 		break;
568 	case IDT_VECTORING_ERROR_CODE:
569 		*value = current_evmcs->idt_vectoring_error_code;
570 		break;
571 	case VM_EXIT_INSTRUCTION_LEN:
572 		*value = current_evmcs->vm_exit_instruction_len;
573 		break;
574 	case VMX_INSTRUCTION_INFO:
575 		*value = current_evmcs->vmx_instruction_info;
576 		break;
577 	case PAGE_FAULT_ERROR_CODE_MASK:
578 		*value = current_evmcs->page_fault_error_code_mask;
579 		break;
580 	case PAGE_FAULT_ERROR_CODE_MATCH:
581 		*value = current_evmcs->page_fault_error_code_match;
582 		break;
583 	case CR3_TARGET_COUNT:
584 		*value = current_evmcs->cr3_target_count;
585 		break;
586 	case VM_EXIT_MSR_STORE_COUNT:
587 		*value = current_evmcs->vm_exit_msr_store_count;
588 		break;
589 	case VM_EXIT_MSR_LOAD_COUNT:
590 		*value = current_evmcs->vm_exit_msr_load_count;
591 		break;
592 	case VM_ENTRY_MSR_LOAD_COUNT:
593 		*value = current_evmcs->vm_entry_msr_load_count;
594 		break;
595 	case HOST_ES_SELECTOR:
596 		*value = current_evmcs->host_es_selector;
597 		break;
598 	case HOST_CS_SELECTOR:
599 		*value = current_evmcs->host_cs_selector;
600 		break;
601 	case HOST_SS_SELECTOR:
602 		*value = current_evmcs->host_ss_selector;
603 		break;
604 	case HOST_DS_SELECTOR:
605 		*value = current_evmcs->host_ds_selector;
606 		break;
607 	case HOST_FS_SELECTOR:
608 		*value = current_evmcs->host_fs_selector;
609 		break;
610 	case HOST_GS_SELECTOR:
611 		*value = current_evmcs->host_gs_selector;
612 		break;
613 	case HOST_TR_SELECTOR:
614 		*value = current_evmcs->host_tr_selector;
615 		break;
616 	case GUEST_ES_SELECTOR:
617 		*value = current_evmcs->guest_es_selector;
618 		break;
619 	case GUEST_CS_SELECTOR:
620 		*value = current_evmcs->guest_cs_selector;
621 		break;
622 	case GUEST_SS_SELECTOR:
623 		*value = current_evmcs->guest_ss_selector;
624 		break;
625 	case GUEST_DS_SELECTOR:
626 		*value = current_evmcs->guest_ds_selector;
627 		break;
628 	case GUEST_FS_SELECTOR:
629 		*value = current_evmcs->guest_fs_selector;
630 		break;
631 	case GUEST_GS_SELECTOR:
632 		*value = current_evmcs->guest_gs_selector;
633 		break;
634 	case GUEST_LDTR_SELECTOR:
635 		*value = current_evmcs->guest_ldtr_selector;
636 		break;
637 	case GUEST_TR_SELECTOR:
638 		*value = current_evmcs->guest_tr_selector;
639 		break;
640 	case VIRTUAL_PROCESSOR_ID:
641 		*value = current_evmcs->virtual_processor_id;
642 		break;
643 	case HOST_IA32_PERF_GLOBAL_CTRL:
644 		*value = current_evmcs->host_ia32_perf_global_ctrl;
645 		break;
646 	case GUEST_IA32_PERF_GLOBAL_CTRL:
647 		*value = current_evmcs->guest_ia32_perf_global_ctrl;
648 		break;
649 	case ENCLS_EXITING_BITMAP:
650 		*value = current_evmcs->encls_exiting_bitmap;
651 		break;
652 	case TSC_MULTIPLIER:
653 		*value = current_evmcs->tsc_multiplier;
654 		break;
655 	default: return 1;
656 	}
657 
658 	return 0;
659 }
660 
661 static inline int evmcs_vmwrite(u64 encoding, u64 value)
662 {
663 	switch (encoding) {
664 	case GUEST_RIP:
665 		current_evmcs->guest_rip = value;
666 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
667 		break;
668 	case GUEST_RSP:
669 		current_evmcs->guest_rsp = value;
670 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
671 		break;
672 	case GUEST_RFLAGS:
673 		current_evmcs->guest_rflags = value;
674 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
675 		break;
676 	case HOST_IA32_PAT:
677 		current_evmcs->host_ia32_pat = value;
678 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
679 		break;
680 	case HOST_IA32_EFER:
681 		current_evmcs->host_ia32_efer = value;
682 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
683 		break;
684 	case HOST_CR0:
685 		current_evmcs->host_cr0 = value;
686 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
687 		break;
688 	case HOST_CR3:
689 		current_evmcs->host_cr3 = value;
690 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
691 		break;
692 	case HOST_CR4:
693 		current_evmcs->host_cr4 = value;
694 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
695 		break;
696 	case HOST_IA32_SYSENTER_ESP:
697 		current_evmcs->host_ia32_sysenter_esp = value;
698 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
699 		break;
700 	case HOST_IA32_SYSENTER_EIP:
701 		current_evmcs->host_ia32_sysenter_eip = value;
702 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
703 		break;
704 	case HOST_RIP:
705 		current_evmcs->host_rip = value;
706 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
707 		break;
708 	case IO_BITMAP_A:
709 		current_evmcs->io_bitmap_a = value;
710 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP;
711 		break;
712 	case IO_BITMAP_B:
713 		current_evmcs->io_bitmap_b = value;
714 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP;
715 		break;
716 	case MSR_BITMAP:
717 		current_evmcs->msr_bitmap = value;
718 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP;
719 		break;
720 	case GUEST_ES_BASE:
721 		current_evmcs->guest_es_base = value;
722 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
723 		break;
724 	case GUEST_CS_BASE:
725 		current_evmcs->guest_cs_base = value;
726 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
727 		break;
728 	case GUEST_SS_BASE:
729 		current_evmcs->guest_ss_base = value;
730 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
731 		break;
732 	case GUEST_DS_BASE:
733 		current_evmcs->guest_ds_base = value;
734 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
735 		break;
736 	case GUEST_FS_BASE:
737 		current_evmcs->guest_fs_base = value;
738 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
739 		break;
740 	case GUEST_GS_BASE:
741 		current_evmcs->guest_gs_base = value;
742 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
743 		break;
744 	case GUEST_LDTR_BASE:
745 		current_evmcs->guest_ldtr_base = value;
746 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
747 		break;
748 	case GUEST_TR_BASE:
749 		current_evmcs->guest_tr_base = value;
750 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
751 		break;
752 	case GUEST_GDTR_BASE:
753 		current_evmcs->guest_gdtr_base = value;
754 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
755 		break;
756 	case GUEST_IDTR_BASE:
757 		current_evmcs->guest_idtr_base = value;
758 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
759 		break;
760 	case TSC_OFFSET:
761 		current_evmcs->tsc_offset = value;
762 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
763 		break;
764 	case VIRTUAL_APIC_PAGE_ADDR:
765 		current_evmcs->virtual_apic_page_addr = value;
766 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
767 		break;
768 	case VMCS_LINK_POINTER:
769 		current_evmcs->vmcs_link_pointer = value;
770 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
771 		break;
772 	case GUEST_IA32_DEBUGCTL:
773 		current_evmcs->guest_ia32_debugctl = value;
774 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
775 		break;
776 	case GUEST_IA32_PAT:
777 		current_evmcs->guest_ia32_pat = value;
778 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
779 		break;
780 	case GUEST_IA32_EFER:
781 		current_evmcs->guest_ia32_efer = value;
782 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
783 		break;
784 	case GUEST_PDPTR0:
785 		current_evmcs->guest_pdptr0 = value;
786 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
787 		break;
788 	case GUEST_PDPTR1:
789 		current_evmcs->guest_pdptr1 = value;
790 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
791 		break;
792 	case GUEST_PDPTR2:
793 		current_evmcs->guest_pdptr2 = value;
794 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
795 		break;
796 	case GUEST_PDPTR3:
797 		current_evmcs->guest_pdptr3 = value;
798 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
799 		break;
800 	case GUEST_PENDING_DBG_EXCEPTIONS:
801 		current_evmcs->guest_pending_dbg_exceptions = value;
802 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
803 		break;
804 	case GUEST_SYSENTER_ESP:
805 		current_evmcs->guest_sysenter_esp = value;
806 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
807 		break;
808 	case GUEST_SYSENTER_EIP:
809 		current_evmcs->guest_sysenter_eip = value;
810 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
811 		break;
812 	case CR0_GUEST_HOST_MASK:
813 		current_evmcs->cr0_guest_host_mask = value;
814 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
815 		break;
816 	case CR4_GUEST_HOST_MASK:
817 		current_evmcs->cr4_guest_host_mask = value;
818 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
819 		break;
820 	case CR0_READ_SHADOW:
821 		current_evmcs->cr0_read_shadow = value;
822 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
823 		break;
824 	case CR4_READ_SHADOW:
825 		current_evmcs->cr4_read_shadow = value;
826 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
827 		break;
828 	case GUEST_CR0:
829 		current_evmcs->guest_cr0 = value;
830 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
831 		break;
832 	case GUEST_CR3:
833 		current_evmcs->guest_cr3 = value;
834 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
835 		break;
836 	case GUEST_CR4:
837 		current_evmcs->guest_cr4 = value;
838 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
839 		break;
840 	case GUEST_DR7:
841 		current_evmcs->guest_dr7 = value;
842 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
843 		break;
844 	case HOST_FS_BASE:
845 		current_evmcs->host_fs_base = value;
846 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
847 		break;
848 	case HOST_GS_BASE:
849 		current_evmcs->host_gs_base = value;
850 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
851 		break;
852 	case HOST_TR_BASE:
853 		current_evmcs->host_tr_base = value;
854 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
855 		break;
856 	case HOST_GDTR_BASE:
857 		current_evmcs->host_gdtr_base = value;
858 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
859 		break;
860 	case HOST_IDTR_BASE:
861 		current_evmcs->host_idtr_base = value;
862 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
863 		break;
864 	case HOST_RSP:
865 		current_evmcs->host_rsp = value;
866 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
867 		break;
868 	case EPT_POINTER:
869 		current_evmcs->ept_pointer = value;
870 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT;
871 		break;
872 	case GUEST_BNDCFGS:
873 		current_evmcs->guest_bndcfgs = value;
874 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
875 		break;
876 	case XSS_EXIT_BITMAP:
877 		current_evmcs->xss_exit_bitmap = value;
878 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
879 		break;
880 	case GUEST_PHYSICAL_ADDRESS:
881 		current_evmcs->guest_physical_address = value;
882 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
883 		break;
884 	case EXIT_QUALIFICATION:
885 		current_evmcs->exit_qualification = value;
886 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
887 		break;
888 	case GUEST_LINEAR_ADDRESS:
889 		current_evmcs->guest_linear_address = value;
890 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
891 		break;
892 	case VM_EXIT_MSR_STORE_ADDR:
893 		current_evmcs->vm_exit_msr_store_addr = value;
894 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
895 		break;
896 	case VM_EXIT_MSR_LOAD_ADDR:
897 		current_evmcs->vm_exit_msr_load_addr = value;
898 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
899 		break;
900 	case VM_ENTRY_MSR_LOAD_ADDR:
901 		current_evmcs->vm_entry_msr_load_addr = value;
902 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
903 		break;
904 	case CR3_TARGET_VALUE0:
905 		current_evmcs->cr3_target_value0 = value;
906 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
907 		break;
908 	case CR3_TARGET_VALUE1:
909 		current_evmcs->cr3_target_value1 = value;
910 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
911 		break;
912 	case CR3_TARGET_VALUE2:
913 		current_evmcs->cr3_target_value2 = value;
914 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
915 		break;
916 	case CR3_TARGET_VALUE3:
917 		current_evmcs->cr3_target_value3 = value;
918 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
919 		break;
920 	case TPR_THRESHOLD:
921 		current_evmcs->tpr_threshold = value;
922 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
923 		break;
924 	case GUEST_INTERRUPTIBILITY_INFO:
925 		current_evmcs->guest_interruptibility_info = value;
926 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
927 		break;
928 	case CPU_BASED_VM_EXEC_CONTROL:
929 		current_evmcs->cpu_based_vm_exec_control = value;
930 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC;
931 		break;
932 	case EXCEPTION_BITMAP:
933 		current_evmcs->exception_bitmap = value;
934 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN;
935 		break;
936 	case VM_ENTRY_CONTROLS:
937 		current_evmcs->vm_entry_controls = value;
938 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY;
939 		break;
940 	case VM_ENTRY_INTR_INFO_FIELD:
941 		current_evmcs->vm_entry_intr_info_field = value;
942 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
943 		break;
944 	case VM_ENTRY_EXCEPTION_ERROR_CODE:
945 		current_evmcs->vm_entry_exception_error_code = value;
946 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
947 		break;
948 	case VM_ENTRY_INSTRUCTION_LEN:
949 		current_evmcs->vm_entry_instruction_len = value;
950 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
951 		break;
952 	case HOST_IA32_SYSENTER_CS:
953 		current_evmcs->host_ia32_sysenter_cs = value;
954 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
955 		break;
956 	case PIN_BASED_VM_EXEC_CONTROL:
957 		current_evmcs->pin_based_vm_exec_control = value;
958 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
959 		break;
960 	case VM_EXIT_CONTROLS:
961 		current_evmcs->vm_exit_controls = value;
962 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
963 		break;
964 	case SECONDARY_VM_EXEC_CONTROL:
965 		current_evmcs->secondary_vm_exec_control = value;
966 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
967 		break;
968 	case GUEST_ES_LIMIT:
969 		current_evmcs->guest_es_limit = value;
970 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
971 		break;
972 	case GUEST_CS_LIMIT:
973 		current_evmcs->guest_cs_limit = value;
974 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
975 		break;
976 	case GUEST_SS_LIMIT:
977 		current_evmcs->guest_ss_limit = value;
978 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
979 		break;
980 	case GUEST_DS_LIMIT:
981 		current_evmcs->guest_ds_limit = value;
982 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
983 		break;
984 	case GUEST_FS_LIMIT:
985 		current_evmcs->guest_fs_limit = value;
986 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
987 		break;
988 	case GUEST_GS_LIMIT:
989 		current_evmcs->guest_gs_limit = value;
990 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
991 		break;
992 	case GUEST_LDTR_LIMIT:
993 		current_evmcs->guest_ldtr_limit = value;
994 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
995 		break;
996 	case GUEST_TR_LIMIT:
997 		current_evmcs->guest_tr_limit = value;
998 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
999 		break;
1000 	case GUEST_GDTR_LIMIT:
1001 		current_evmcs->guest_gdtr_limit = value;
1002 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1003 		break;
1004 	case GUEST_IDTR_LIMIT:
1005 		current_evmcs->guest_idtr_limit = value;
1006 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1007 		break;
1008 	case GUEST_ES_AR_BYTES:
1009 		current_evmcs->guest_es_ar_bytes = value;
1010 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1011 		break;
1012 	case GUEST_CS_AR_BYTES:
1013 		current_evmcs->guest_cs_ar_bytes = value;
1014 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1015 		break;
1016 	case GUEST_SS_AR_BYTES:
1017 		current_evmcs->guest_ss_ar_bytes = value;
1018 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1019 		break;
1020 	case GUEST_DS_AR_BYTES:
1021 		current_evmcs->guest_ds_ar_bytes = value;
1022 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1023 		break;
1024 	case GUEST_FS_AR_BYTES:
1025 		current_evmcs->guest_fs_ar_bytes = value;
1026 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1027 		break;
1028 	case GUEST_GS_AR_BYTES:
1029 		current_evmcs->guest_gs_ar_bytes = value;
1030 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1031 		break;
1032 	case GUEST_LDTR_AR_BYTES:
1033 		current_evmcs->guest_ldtr_ar_bytes = value;
1034 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1035 		break;
1036 	case GUEST_TR_AR_BYTES:
1037 		current_evmcs->guest_tr_ar_bytes = value;
1038 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1039 		break;
1040 	case GUEST_ACTIVITY_STATE:
1041 		current_evmcs->guest_activity_state = value;
1042 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
1043 		break;
1044 	case GUEST_SYSENTER_CS:
1045 		current_evmcs->guest_sysenter_cs = value;
1046 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
1047 		break;
1048 	case VM_INSTRUCTION_ERROR:
1049 		current_evmcs->vm_instruction_error = value;
1050 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1051 		break;
1052 	case VM_EXIT_REASON:
1053 		current_evmcs->vm_exit_reason = value;
1054 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1055 		break;
1056 	case VM_EXIT_INTR_INFO:
1057 		current_evmcs->vm_exit_intr_info = value;
1058 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1059 		break;
1060 	case VM_EXIT_INTR_ERROR_CODE:
1061 		current_evmcs->vm_exit_intr_error_code = value;
1062 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1063 		break;
1064 	case IDT_VECTORING_INFO_FIELD:
1065 		current_evmcs->idt_vectoring_info_field = value;
1066 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1067 		break;
1068 	case IDT_VECTORING_ERROR_CODE:
1069 		current_evmcs->idt_vectoring_error_code = value;
1070 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1071 		break;
1072 	case VM_EXIT_INSTRUCTION_LEN:
1073 		current_evmcs->vm_exit_instruction_len = value;
1074 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1075 		break;
1076 	case VMX_INSTRUCTION_INFO:
1077 		current_evmcs->vmx_instruction_info = value;
1078 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
1079 		break;
1080 	case PAGE_FAULT_ERROR_CODE_MASK:
1081 		current_evmcs->page_fault_error_code_mask = value;
1082 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1083 		break;
1084 	case PAGE_FAULT_ERROR_CODE_MATCH:
1085 		current_evmcs->page_fault_error_code_match = value;
1086 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1087 		break;
1088 	case CR3_TARGET_COUNT:
1089 		current_evmcs->cr3_target_count = value;
1090 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1091 		break;
1092 	case VM_EXIT_MSR_STORE_COUNT:
1093 		current_evmcs->vm_exit_msr_store_count = value;
1094 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1095 		break;
1096 	case VM_EXIT_MSR_LOAD_COUNT:
1097 		current_evmcs->vm_exit_msr_load_count = value;
1098 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1099 		break;
1100 	case VM_ENTRY_MSR_LOAD_COUNT:
1101 		current_evmcs->vm_entry_msr_load_count = value;
1102 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
1103 		break;
1104 	case HOST_ES_SELECTOR:
1105 		current_evmcs->host_es_selector = value;
1106 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1107 		break;
1108 	case HOST_CS_SELECTOR:
1109 		current_evmcs->host_cs_selector = value;
1110 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1111 		break;
1112 	case HOST_SS_SELECTOR:
1113 		current_evmcs->host_ss_selector = value;
1114 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1115 		break;
1116 	case HOST_DS_SELECTOR:
1117 		current_evmcs->host_ds_selector = value;
1118 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1119 		break;
1120 	case HOST_FS_SELECTOR:
1121 		current_evmcs->host_fs_selector = value;
1122 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1123 		break;
1124 	case HOST_GS_SELECTOR:
1125 		current_evmcs->host_gs_selector = value;
1126 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1127 		break;
1128 	case HOST_TR_SELECTOR:
1129 		current_evmcs->host_tr_selector = value;
1130 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1131 		break;
1132 	case GUEST_ES_SELECTOR:
1133 		current_evmcs->guest_es_selector = value;
1134 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1135 		break;
1136 	case GUEST_CS_SELECTOR:
1137 		current_evmcs->guest_cs_selector = value;
1138 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1139 		break;
1140 	case GUEST_SS_SELECTOR:
1141 		current_evmcs->guest_ss_selector = value;
1142 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1143 		break;
1144 	case GUEST_DS_SELECTOR:
1145 		current_evmcs->guest_ds_selector = value;
1146 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1147 		break;
1148 	case GUEST_FS_SELECTOR:
1149 		current_evmcs->guest_fs_selector = value;
1150 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1151 		break;
1152 	case GUEST_GS_SELECTOR:
1153 		current_evmcs->guest_gs_selector = value;
1154 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1155 		break;
1156 	case GUEST_LDTR_SELECTOR:
1157 		current_evmcs->guest_ldtr_selector = value;
1158 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1159 		break;
1160 	case GUEST_TR_SELECTOR:
1161 		current_evmcs->guest_tr_selector = value;
1162 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
1163 		break;
1164 	case VIRTUAL_PROCESSOR_ID:
1165 		current_evmcs->virtual_processor_id = value;
1166 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT;
1167 		break;
1168 	case HOST_IA32_PERF_GLOBAL_CTRL:
1169 		current_evmcs->host_ia32_perf_global_ctrl = value;
1170 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
1171 		break;
1172 	case GUEST_IA32_PERF_GLOBAL_CTRL:
1173 		current_evmcs->guest_ia32_perf_global_ctrl = value;
1174 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
1175 		break;
1176 	case ENCLS_EXITING_BITMAP:
1177 		current_evmcs->encls_exiting_bitmap = value;
1178 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
1179 		break;
1180 	case TSC_MULTIPLIER:
1181 		current_evmcs->tsc_multiplier = value;
1182 		current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
1183 		break;
1184 	default: return 1;
1185 	}
1186 
1187 	return 0;
1188 }
1189 
1190 #endif /* !SELFTEST_KVM_EVMCS_H */
1191