Changeset 79196 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jun 18, 2019 5:42:13 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131371
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r79143 r79196 439 439 } 440 440 }; 441 442 443 /**444 * Returns whether the given VMCS field is valid and supported by our emulation.445 *446 * @param pVCpu The cross context virtual CPU structure.447 * @param u64VmcsField The VMCS field.448 *449 * @remarks This takes into account the CPU features exposed to the guest.450 */451 IEM_STATIC bool iemVmxIsVmcsFieldValid(PCVMCPU pVCpu, uint64_t u64VmcsField)452 {453 uint32_t const uFieldEncHi = RT_HI_U32(u64VmcsField);454 uint32_t const uFieldEncLo = RT_LO_U32(u64VmcsField);455 if (!uFieldEncHi)456 { /* likely */ }457 else458 return false;459 460 PCCPUMFEATURES pFeat = IEM_GET_GUEST_CPU_FEATURES(pVCpu);461 switch (uFieldEncLo)462 {463 /*464 * 16-bit fields.465 */466 /* Control fields. */467 case VMX_VMCS16_VPID: return pFeat->fVmxVpid;468 case VMX_VMCS16_POSTED_INT_NOTIFY_VECTOR: return pFeat->fVmxPostedInt;469 case VMX_VMCS16_EPTP_INDEX: return pFeat->fVmxEptXcptVe;470 471 /* Guest-state fields. */472 case VMX_VMCS16_GUEST_ES_SEL:473 case VMX_VMCS16_GUEST_CS_SEL:474 case VMX_VMCS16_GUEST_SS_SEL:475 case VMX_VMCS16_GUEST_DS_SEL:476 case VMX_VMCS16_GUEST_FS_SEL:477 case VMX_VMCS16_GUEST_GS_SEL:478 case VMX_VMCS16_GUEST_LDTR_SEL:479 case VMX_VMCS16_GUEST_TR_SEL: return true;480 case VMX_VMCS16_GUEST_INTR_STATUS: return pFeat->fVmxVirtIntDelivery;481 case VMX_VMCS16_GUEST_PML_INDEX: return pFeat->fVmxPml;482 483 /* Host-state fields. */484 case VMX_VMCS16_HOST_ES_SEL:485 case VMX_VMCS16_HOST_CS_SEL:486 case VMX_VMCS16_HOST_SS_SEL:487 case VMX_VMCS16_HOST_DS_SEL:488 case VMX_VMCS16_HOST_FS_SEL:489 case VMX_VMCS16_HOST_GS_SEL:490 case VMX_VMCS16_HOST_TR_SEL: return true;491 492 /*493 * 64-bit fields.494 */495 /* Control fields. */496 case VMX_VMCS64_CTRL_IO_BITMAP_A_FULL:497 case VMX_VMCS64_CTRL_IO_BITMAP_A_HIGH:498 case VMX_VMCS64_CTRL_IO_BITMAP_B_FULL:499 case VMX_VMCS64_CTRL_IO_BITMAP_B_HIGH: return pFeat->fVmxUseIoBitmaps;500 case VMX_VMCS64_CTRL_MSR_BITMAP_FULL:501 case VMX_VMCS64_CTRL_MSR_BITMAP_HIGH: return pFeat->fVmxUseMsrBitmaps;502 case VMX_VMCS64_CTRL_EXIT_MSR_STORE_FULL:503 case VMX_VMCS64_CTRL_EXIT_MSR_STORE_HIGH:504 case VMX_VMCS64_CTRL_EXIT_MSR_LOAD_FULL:505 case VMX_VMCS64_CTRL_EXIT_MSR_LOAD_HIGH:506 case VMX_VMCS64_CTRL_ENTRY_MSR_LOAD_FULL:507 case VMX_VMCS64_CTRL_ENTRY_MSR_LOAD_HIGH:508 case VMX_VMCS64_CTRL_EXEC_VMCS_PTR_FULL:509 case VMX_VMCS64_CTRL_EXEC_VMCS_PTR_HIGH: return true;510 case VMX_VMCS64_CTRL_EXEC_PML_ADDR_FULL:511 case VMX_VMCS64_CTRL_EXEC_PML_ADDR_HIGH: return pFeat->fVmxPml;512 case VMX_VMCS64_CTRL_TSC_OFFSET_FULL:513 case VMX_VMCS64_CTRL_TSC_OFFSET_HIGH: return true;514 case VMX_VMCS64_CTRL_VIRT_APIC_PAGEADDR_FULL:515 case VMX_VMCS64_CTRL_VIRT_APIC_PAGEADDR_HIGH: return pFeat->fVmxUseTprShadow;516 case VMX_VMCS64_CTRL_APIC_ACCESSADDR_FULL:517 case VMX_VMCS64_CTRL_APIC_ACCESSADDR_HIGH: return pFeat->fVmxVirtApicAccess;518 case VMX_VMCS64_CTRL_POSTED_INTR_DESC_FULL:519 case VMX_VMCS64_CTRL_POSTED_INTR_DESC_HIGH: return pFeat->fVmxPostedInt;520 case VMX_VMCS64_CTRL_VMFUNC_CTRLS_FULL:521 case VMX_VMCS64_CTRL_VMFUNC_CTRLS_HIGH: return pFeat->fVmxVmFunc;522 case VMX_VMCS64_CTRL_EPTP_FULL:523 case VMX_VMCS64_CTRL_EPTP_HIGH: return pFeat->fVmxEpt;524 case VMX_VMCS64_CTRL_EOI_BITMAP_0_FULL:525 case VMX_VMCS64_CTRL_EOI_BITMAP_0_HIGH:526 case VMX_VMCS64_CTRL_EOI_BITMAP_1_FULL:527 case VMX_VMCS64_CTRL_EOI_BITMAP_1_HIGH:528 case VMX_VMCS64_CTRL_EOI_BITMAP_2_FULL:529 case VMX_VMCS64_CTRL_EOI_BITMAP_2_HIGH:530 case VMX_VMCS64_CTRL_EOI_BITMAP_3_FULL:531 case VMX_VMCS64_CTRL_EOI_BITMAP_3_HIGH: return pFeat->fVmxVirtIntDelivery;532 case VMX_VMCS64_CTRL_EPTP_LIST_FULL:533 case VMX_VMCS64_CTRL_EPTP_LIST_HIGH:534 {535 uint64_t const uVmFuncMsr = pVCpu->cpum.GstCtx.hwvirt.vmx.Msrs.u64VmFunc;536 return RT_BOOL(RT_BF_GET(uVmFuncMsr, VMX_BF_VMFUNC_EPTP_SWITCHING));537 }538 case VMX_VMCS64_CTRL_VMREAD_BITMAP_FULL:539 case VMX_VMCS64_CTRL_VMREAD_BITMAP_HIGH:540 case VMX_VMCS64_CTRL_VMWRITE_BITMAP_FULL:541 case VMX_VMCS64_CTRL_VMWRITE_BITMAP_HIGH: return pFeat->fVmxVmcsShadowing;542 case VMX_VMCS64_CTRL_VIRTXCPT_INFO_ADDR_FULL:543 case VMX_VMCS64_CTRL_VIRTXCPT_INFO_ADDR_HIGH: return pFeat->fVmxEptXcptVe;544 case VMX_VMCS64_CTRL_XSS_EXITING_BITMAP_FULL:545 case VMX_VMCS64_CTRL_XSS_EXITING_BITMAP_HIGH: return pFeat->fVmxXsavesXrstors;546 case VMX_VMCS64_CTRL_ENCLS_EXITING_BITMAP_FULL:547 case VMX_VMCS64_CTRL_ENCLS_EXITING_BITMAP_HIGH: return false;548 case VMX_VMCS64_CTRL_TSC_MULTIPLIER_FULL:549 case VMX_VMCS64_CTRL_TSC_MULTIPLIER_HIGH: return pFeat->fVmxUseTscScaling;550 551 /* Read-only data fields. */552 case VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL:553 case VMX_VMCS64_RO_GUEST_PHYS_ADDR_HIGH: return pFeat->fVmxEpt;554 555 /* Guest-state fields. */556 case VMX_VMCS64_GUEST_VMCS_LINK_PTR_FULL:557 case VMX_VMCS64_GUEST_VMCS_LINK_PTR_HIGH:558 case VMX_VMCS64_GUEST_DEBUGCTL_FULL:559 case VMX_VMCS64_GUEST_DEBUGCTL_HIGH: return true;560 case VMX_VMCS64_GUEST_PAT_FULL:561 case VMX_VMCS64_GUEST_PAT_HIGH: return pFeat->fVmxEntryLoadPatMsr || pFeat->fVmxExitSavePatMsr;562 case VMX_VMCS64_GUEST_EFER_FULL:563 case VMX_VMCS64_GUEST_EFER_HIGH: return pFeat->fVmxEntryLoadEferMsr || pFeat->fVmxExitSaveEferMsr;564 case VMX_VMCS64_GUEST_PERF_GLOBAL_CTRL_FULL:565 case VMX_VMCS64_GUEST_PERF_GLOBAL_CTRL_HIGH: return false;566 case VMX_VMCS64_GUEST_PDPTE0_FULL:567 case VMX_VMCS64_GUEST_PDPTE0_HIGH:568 case VMX_VMCS64_GUEST_PDPTE1_FULL:569 case VMX_VMCS64_GUEST_PDPTE1_HIGH:570 case VMX_VMCS64_GUEST_PDPTE2_FULL:571 case VMX_VMCS64_GUEST_PDPTE2_HIGH:572 case VMX_VMCS64_GUEST_PDPTE3_FULL:573 case VMX_VMCS64_GUEST_PDPTE3_HIGH: return pFeat->fVmxEpt;574 case VMX_VMCS64_GUEST_BNDCFGS_FULL:575 case VMX_VMCS64_GUEST_BNDCFGS_HIGH: return false;576 577 /* Host-state fields. */578 case VMX_VMCS64_HOST_PAT_FULL:579 case VMX_VMCS64_HOST_PAT_HIGH: return pFeat->fVmxExitLoadPatMsr;580 case VMX_VMCS64_HOST_EFER_FULL:581 case VMX_VMCS64_HOST_EFER_HIGH: return pFeat->fVmxExitLoadEferMsr;582 case VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_FULL:583 case VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_HIGH: return false;584 585 /*586 * 32-bit fields.587 */588 /* Control fields. */589 case VMX_VMCS32_CTRL_PIN_EXEC:590 case VMX_VMCS32_CTRL_PROC_EXEC:591 case VMX_VMCS32_CTRL_EXCEPTION_BITMAP:592 case VMX_VMCS32_CTRL_PAGEFAULT_ERROR_MASK:593 case VMX_VMCS32_CTRL_PAGEFAULT_ERROR_MATCH:594 case VMX_VMCS32_CTRL_CR3_TARGET_COUNT:595 case VMX_VMCS32_CTRL_EXIT:596 case VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT:597 case VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT:598 case VMX_VMCS32_CTRL_ENTRY:599 case VMX_VMCS32_CTRL_ENTRY_MSR_LOAD_COUNT:600 case VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO:601 case VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE:602 case VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH: return true;603 case VMX_VMCS32_CTRL_TPR_THRESHOLD: return pFeat->fVmxUseTprShadow;604 case VMX_VMCS32_CTRL_PROC_EXEC2: return pFeat->fVmxSecondaryExecCtls;605 case VMX_VMCS32_CTRL_PLE_GAP:606 case VMX_VMCS32_CTRL_PLE_WINDOW: return pFeat->fVmxPauseLoopExit;607 608 /* Read-only data fields. */609 case VMX_VMCS32_RO_VM_INSTR_ERROR:610 case VMX_VMCS32_RO_EXIT_REASON:611 case VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO:612 case VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE:613 case VMX_VMCS32_RO_IDT_VECTORING_INFO:614 case VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE:615 case VMX_VMCS32_RO_EXIT_INSTR_LENGTH:616 case VMX_VMCS32_RO_EXIT_INSTR_INFO: return true;617 618 /* Guest-state fields. */619 case VMX_VMCS32_GUEST_ES_LIMIT:620 case VMX_VMCS32_GUEST_CS_LIMIT:621 case VMX_VMCS32_GUEST_SS_LIMIT:622 case VMX_VMCS32_GUEST_DS_LIMIT:623 case VMX_VMCS32_GUEST_FS_LIMIT:624 case VMX_VMCS32_GUEST_GS_LIMIT:625 case VMX_VMCS32_GUEST_LDTR_LIMIT:626 case VMX_VMCS32_GUEST_TR_LIMIT:627 case VMX_VMCS32_GUEST_GDTR_LIMIT:628 case VMX_VMCS32_GUEST_IDTR_LIMIT:629 case VMX_VMCS32_GUEST_ES_ACCESS_RIGHTS:630 case VMX_VMCS32_GUEST_CS_ACCESS_RIGHTS:631 case VMX_VMCS32_GUEST_SS_ACCESS_RIGHTS:632 case VMX_VMCS32_GUEST_DS_ACCESS_RIGHTS:633 case VMX_VMCS32_GUEST_FS_ACCESS_RIGHTS:634 case VMX_VMCS32_GUEST_GS_ACCESS_RIGHTS:635 case VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS:636 case VMX_VMCS32_GUEST_TR_ACCESS_RIGHTS:637 case VMX_VMCS32_GUEST_INT_STATE:638 case VMX_VMCS32_GUEST_ACTIVITY_STATE:639 case VMX_VMCS32_GUEST_SMBASE:640 case VMX_VMCS32_GUEST_SYSENTER_CS: return true;641 case VMX_VMCS32_PREEMPT_TIMER_VALUE: return pFeat->fVmxPreemptTimer;642 643 /* Host-state fields. */644 case VMX_VMCS32_HOST_SYSENTER_CS: return true;645 646 /*647 * Natural-width fields.648 */649 /* Control fields. */650 case VMX_VMCS_CTRL_CR0_MASK:651 case VMX_VMCS_CTRL_CR4_MASK:652 case VMX_VMCS_CTRL_CR0_READ_SHADOW:653 case VMX_VMCS_CTRL_CR4_READ_SHADOW:654 case VMX_VMCS_CTRL_CR3_TARGET_VAL0:655 case VMX_VMCS_CTRL_CR3_TARGET_VAL1:656 case VMX_VMCS_CTRL_CR3_TARGET_VAL2:657 case VMX_VMCS_CTRL_CR3_TARGET_VAL3: return true;658 659 /* Read-only data fields. */660 case VMX_VMCS_RO_EXIT_QUALIFICATION:661 case VMX_VMCS_RO_IO_RCX:662 case VMX_VMCS_RO_IO_RSI:663 case VMX_VMCS_RO_IO_RDI:664 case VMX_VMCS_RO_IO_RIP:665 case VMX_VMCS_RO_GUEST_LINEAR_ADDR: return true;666 667 /* Guest-state fields. */668 case VMX_VMCS_GUEST_CR0:669 case VMX_VMCS_GUEST_CR3:670 case VMX_VMCS_GUEST_CR4:671 case VMX_VMCS_GUEST_ES_BASE:672 case VMX_VMCS_GUEST_CS_BASE:673 case VMX_VMCS_GUEST_SS_BASE:674 case VMX_VMCS_GUEST_DS_BASE:675 case VMX_VMCS_GUEST_FS_BASE:676 case VMX_VMCS_GUEST_GS_BASE:677 case VMX_VMCS_GUEST_LDTR_BASE:678 case VMX_VMCS_GUEST_TR_BASE:679 case VMX_VMCS_GUEST_GDTR_BASE:680 case VMX_VMCS_GUEST_IDTR_BASE:681 case VMX_VMCS_GUEST_DR7:682 case VMX_VMCS_GUEST_RSP:683 case VMX_VMCS_GUEST_RIP:684 case VMX_VMCS_GUEST_RFLAGS:685 case VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS:686 case VMX_VMCS_GUEST_SYSENTER_ESP:687 case VMX_VMCS_GUEST_SYSENTER_EIP: return true;688 689 /* Host-state fields. */690 case VMX_VMCS_HOST_CR0:691 case VMX_VMCS_HOST_CR3:692 case VMX_VMCS_HOST_CR4:693 case VMX_VMCS_HOST_FS_BASE:694 case VMX_VMCS_HOST_GS_BASE:695 case VMX_VMCS_HOST_TR_BASE:696 case VMX_VMCS_HOST_GDTR_BASE:697 case VMX_VMCS_HOST_IDTR_BASE:698 case VMX_VMCS_HOST_SYSENTER_ESP:699 case VMX_VMCS_HOST_SYSENTER_EIP:700 case VMX_VMCS_HOST_RSP:701 case VMX_VMCS_HOST_RIP: return true;702 }703 704 return false;705 }706 441 707 442 … … 7839 7574 7840 7575 /* Supported VMCS field. */ 7841 if ( iemVmxIsVmcsFieldValid(pVCpu, u64VmcsField))7576 if (CPUMIsGuestVmxVmcsFieldValid(pVCpu->CTX_SUFF(pVM), u64VmcsField)) 7842 7577 { /* likely */ } 7843 7578 else … … 8080 7815 8081 7816 /* Supported VMCS field. */ 8082 if ( iemVmxIsVmcsFieldValid(pVCpu, u64VmcsField))7817 if (CPUMIsGuestVmxVmcsFieldValid(pVCpu->CTX_SUFF(pVM), u64VmcsField)) 8083 7818 { /* likely */ } 8084 7819 else
Note:
See TracChangeset
for help on using the changeset viewer.