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)¤t_evmcs->host_rsp),
1230 [host_rip]"r"
1231 ((uint64_t)¤t_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)¤t_evmcs->host_rsp),
1269 [host_rip]"r"
1270 ((uint64_t)¤t_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