brintos

brintos / linux-shallow public Read only

0
0
Text · 37.9 KiB · 901caf0 Raw
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)&current_evmcs->host_rsp),1233			       [host_rip]"r"1234			       ((uint64_t)&current_evmcs->host_rip)1235			     : "memory", "cc", "rbx", "r8", "r9", "r10",1236			       "r11", "r12", "r13", "r14", "r15");1237	return ret;1238}1239 1240/*1241 * No guest state (e.g. GPRs) is established by this vmresume.1242 */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)&current_evmcs->host_rsp),1272			       [host_rip]"r"1273			       ((uint64_t)&current_evmcs->host_rip)1274			     : "memory", "cc", "rbx", "r8", "r9", "r10",1275			       "r11", "r12", "r13", "r14", "r15");1276	return ret;1277}1278 1279#endif /* !SELFTEST_KVM_EVMCS_H */1280