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