File Index
Files and directories
Sign in
FILE

evmcs.h

File preview with syntax highlighting.

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