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