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