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