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