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