VirtualBox

Changeset 79196 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jun 18, 2019 5:42:13 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131371
Message:

VMM/IEM: Nested VMX: bugref:9180 Replace iemVmxIsVmcsFieldValid with CPUMIsGuestVmxVmcsFieldValid.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r79143 r79196  
    439439    }
    440440};
    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     else
    458         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 }
    706441
    707442
     
    78397574
    78407575    /* Supported VMCS field. */
    7841     if (iemVmxIsVmcsFieldValid(pVCpu, u64VmcsField))
     7576    if (CPUMIsGuestVmxVmcsFieldValid(pVCpu->CTX_SUFF(pVM), u64VmcsField))
    78427577    { /* likely */ }
    78437578    else
     
    80807815
    80817816    /* Supported VMCS field. */
    8082     if (iemVmxIsVmcsFieldValid(pVCpu, u64VmcsField))
     7817    if (CPUMIsGuestVmxVmcsFieldValid(pVCpu->CTX_SUFF(pVM), u64VmcsField))
    80837818    { /* likely */ }
    80847819    else
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette