1280 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * tools/testing/selftests/kvm/include/x86_64/evmcs.h4 *5 * Copyright (C) 2018, Red Hat, Inc.6 *7 */8 9#ifndef SELFTEST_KVM_EVMCS_H10#define SELFTEST_KVM_EVMCS_H11 12#include <stdint.h>13#include "hyperv.h"14#include "vmx.h"15 16#define u16 uint16_t17#define u32 uint32_t18#define u64 uint64_t19 20#define EVMCS_VERSION 121 22extern bool enable_evmcs;23 24struct 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 0222#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 0xFFFF239 240#define HV_VMX_SYNTHETIC_EXIT_REASON_TRAP_AFTER_FLUSH 0x10000031241 242extern struct hv_enlightened_vmcs *current_evmcs;243 244int vcpu_enable_evmcs(struct kvm_vcpu *vcpu);245 246static inline void evmcs_enable(void)247{248 enable_evmcs = true;249}250 251static 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 261static 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 271static 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 279static 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 678static 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 1207static 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)¤t_evmcs->host_rsp),1233 [host_rip]"r"1234 ((uint64_t)¤t_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 */1243static 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)¤t_evmcs->host_rsp),1272 [host_rip]"r"1273 ((uint64_t)¤t_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