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 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 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 258 static 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 268 static 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 276 static 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 675 static 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 1204 static 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)¤t_evmcs->host_rsp), 1230 [host_rip]"r" 1231 ((uint64_t)¤t_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 */ 1240 static 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)¤t_evmcs->host_rsp), 1269 [host_rip]"r" 1270 ((uint64_t)¤t_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 */ 1277