VirtualBox

Changeset 73797 in vbox for trunk


Ignore:
Timestamp:
Aug 21, 2018 6:37:22 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
124481
Message:

VMM/IEM: Nested VMX: bugref:9180 Add iemVmxIsVmcsFieldValid.

File:
1 edited

Legend:

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

    r73756 r73797  
    105105        (a_u64Disp) = (int32_t)RT_MAKE_U32_FROM_U8(bTmp0, bTmp1, bTmp2, bTmp3); \
    106106    } while (0)
    107 # endif /* !IEM_WITH_CODE_TLB */
     107#endif /* !IEM_WITH_CODE_TLB */
     108
     109
     110#if 0 /* Disabled static fn until we use it with VMREAD/VMWRITE instruction implementation. */
     111/**
     112 * Returns whether the given VMCS field is valid and supported by our emulation.
     113 *
     114 * @param   pVCpu       The cross context virtual CPU structure.
     115 * @param   encField    The VMCS field encoding.
     116 *
     117 * @remarks This takes into account the CPU features exposed to the guest.
     118 */
     119IEM_STATIC bool iemVmxIsVmcsFieldValid(PVMCPU pVCpu, VMXVMCSFIELDENC encField)
     120{
     121    PCCPUMFEATURES pFeat = IEM_GET_GUEST_CPU_FEATURES(pVCpu);
     122    switch (encField.u)
     123    {
     124        /*
     125         * 16-bit fields.
     126         */
     127        /* Control fields. */
     128        case VMX_VMCS16_VPID:                             return pFeat->fVmxVpid;
     129        case VMX_VMCS16_POSTED_INT_NOTIFY_VECTOR:         return pFeat->fVmxPostedInt;
     130        case VMX_VMCS16_EPTP_INDEX:                       return pFeat->fVmxEptXcptVe;
     131
     132        /* Guest-state fields. */
     133        case VMX_VMCS16_GUEST_ES_SEL:
     134        case VMX_VMCS16_GUEST_CS_SEL:
     135        case VMX_VMCS16_GUEST_SS_SEL:
     136        case VMX_VMCS16_GUEST_DS_SEL:
     137        case VMX_VMCS16_GUEST_FS_SEL:
     138        case VMX_VMCS16_GUEST_GS_SEL:
     139        case VMX_VMCS16_GUEST_LDTR_SEL:
     140        case VMX_VMCS16_GUEST_TR_SEL:
     141        case VMX_VMCS16_GUEST_INTR_STATUS:                return true;
     142        case VMX_VMCS16_GUEST_PML_INDEX:                  return false;
     143
     144        /* Host-state fields. */
     145        case VMX_VMCS16_HOST_ES_SEL:
     146        case VMX_VMCS16_HOST_CS_SEL:
     147        case VMX_VMCS16_HOST_SS_SEL:
     148        case VMX_VMCS16_HOST_DS_SEL:
     149        case VMX_VMCS16_HOST_FS_SEL:
     150        case VMX_VMCS16_HOST_GS_SEL:
     151        case VMX_VMCS16_HOST_TR_SEL:                      return true;
     152
     153        /*
     154         * 64-bit fields.
     155         */
     156        /* Control fields. */
     157        case VMX_VMCS64_CTRL_IO_BITMAP_A_FULL:
     158        case VMX_VMCS64_CTRL_IO_BITMAP_A_HIGH:
     159        case VMX_VMCS64_CTRL_IO_BITMAP_B_FULL:
     160        case VMX_VMCS64_CTRL_IO_BITMAP_B_HIGH:            return pFeat->fVmxUseIoBitmaps;
     161        case VMX_VMCS64_CTRL_MSR_BITMAP_FULL:
     162        case VMX_VMCS64_CTRL_MSR_BITMAP_HIGH:             return pFeat->fVmxUseMsrBitmaps;
     163        case VMX_VMCS64_CTRL_EXIT_MSR_STORE_FULL:
     164        case VMX_VMCS64_CTRL_EXIT_MSR_STORE_HIGH:
     165        case VMX_VMCS64_CTRL_EXIT_MSR_LOAD_FULL:
     166        case VMX_VMCS64_CTRL_EXIT_MSR_LOAD_HIGH:
     167        case VMX_VMCS64_CTRL_ENTRY_MSR_LOAD_FULL:
     168        case VMX_VMCS64_CTRL_ENTRY_MSR_LOAD_HIGH:
     169        case VMX_VMCS64_CTRL_EXEC_VMCS_PTR_FULL:
     170        case VMX_VMCS64_CTRL_EXEC_VMCS_PTR_HIGH:          return true;
     171        case VMX_VMCS64_CTRL_EXEC_PML_ADDR_FULL:
     172        case VMX_VMCS64_CTRL_EXEC_PML_ADDR_HIGH:          return false;
     173        case VMX_VMCS64_CTRL_TSC_OFFSET_FULL:
     174        case VMX_VMCS64_CTRL_TSC_OFFSET_HIGH:             return true;
     175        case VMX_VMCS64_CTRL_VIRT_APIC_PAGEADDR_FULL:
     176        case VMX_VMCS64_CTRL_VIRT_APIC_PAGEADDR_HIGH:     return pFeat->fVmxUseTprShadow;
     177        case VMX_VMCS64_CTRL_APIC_ACCESSADDR_FULL:
     178        case VMX_VMCS64_CTRL_APIC_ACCESSADDR_HIGH:        return pFeat->fVmxVirtApicAccess;
     179        case VMX_VMCS64_CTRL_POSTED_INTR_DESC_FULL:
     180        case VMX_VMCS64_CTRL_POSTED_INTR_DESC_HIGH:       return pFeat->fVmxPostedInt;
     181        case VMX_VMCS64_CTRL_VMFUNC_CTRLS_FULL:
     182        case VMX_VMCS64_CTRL_VMFUNC_CTRLS_HIGH:           return pFeat->fVmxVmFunc;
     183        case VMX_VMCS64_CTRL_EPTP_FULL:
     184        case VMX_VMCS64_CTRL_EPTP_HIGH:                   return pFeat->fVmxEpt;
     185        case VMX_VMCS64_CTRL_EOI_BITMAP_0_FULL:
     186        case VMX_VMCS64_CTRL_EOI_BITMAP_0_HIGH:
     187        case VMX_VMCS64_CTRL_EOI_BITMAP_1_FULL:
     188        case VMX_VMCS64_CTRL_EOI_BITMAP_1_HIGH:
     189        case VMX_VMCS64_CTRL_EOI_BITMAP_2_FULL:
     190        case VMX_VMCS64_CTRL_EOI_BITMAP_2_HIGH:
     191        case VMX_VMCS64_CTRL_EOI_BITMAP_3_FULL:
     192        case VMX_VMCS64_CTRL_EOI_BITMAP_3_HIGH:           return pFeat->fVmxVirtIntDelivery;
     193        case VMX_VMCS64_CTRL_EPTP_LIST_FULL:
     194        case VMX_VMCS64_CTRL_EPTP_LIST_HIGH:
     195        {
     196            uint64_t const uVmFuncMsr = CPUMGetGuestIa32VmxVmFunc(pVCpu);
     197            return RT_BOOL(RT_BF_GET(uVmFuncMsr, VMX_BF_VMFUNC_EPTP_SWITCHING));
     198        }
     199        case VMX_VMCS64_CTRL_VMREAD_BITMAP_FULL:
     200        case VMX_VMCS64_CTRL_VMREAD_BITMAP_HIGH:
     201        case VMX_VMCS64_CTRL_VMWRITE_BITMAP_FULL:
     202        case VMX_VMCS64_CTRL_VMWRITE_BITMAP_HIGH:         return pFeat->fVmxVmcsShadowing;
     203        case VMX_VMCS64_CTRL_VIRTXCPT_INFO_ADDR_FULL:
     204        case VMX_VMCS64_CTRL_VIRTXCPT_INFO_ADDR_HIGH:     return pFeat->fVmxEptXcptVe;
     205        case VMX_VMCS64_CTRL_XSS_EXITING_BITMAP_FULL:
     206        case VMX_VMCS64_CTRL_XSS_EXITING_BITMAP_HIGH:     return pFeat->fVmxXsavesXrstors;
     207        case VMX_VMCS64_CTRL_ENCLS_EXITING_BITMAP_FULL:
     208        case VMX_VMCS64_CTRL_ENCLS_EXITING_BITMAP_HIGH:   return false;
     209        case VMX_VMCS64_CTRL_TSC_MULTIPLIER_FULL:
     210        case VMX_VMCS64_CTRL_TSC_MULTIPLIER_HIGH:         return pFeat->fVmxUseTscScaling;
     211
     212        /* Read-only data fields. */
     213        case VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL:
     214        case VMX_VMCS64_RO_GUEST_PHYS_ADDR_HIGH:          return pFeat->fVmxEpt;
     215
     216        /* Guest-state fields. */
     217        case VMX_VMCS64_GUEST_VMCS_LINK_PTR_FULL:
     218        case VMX_VMCS64_GUEST_VMCS_LINK_PTR_HIGH:
     219        case VMX_VMCS64_GUEST_DEBUGCTL_FULL:
     220        case VMX_VMCS64_GUEST_DEBUGCTL_HIGH:              return true;
     221        case VMX_VMCS64_GUEST_PAT_FULL:
     222        case VMX_VMCS64_GUEST_PAT_HIGH:                   return pFeat->fVmxEntryLoadPatMsr || pFeat->fVmxExitSavePatMsr;
     223        case VMX_VMCS64_GUEST_EFER_FULL:
     224        case VMX_VMCS64_GUEST_EFER_HIGH:                  return pFeat->fVmxEntryLoadEferMsr || pFeat->fVmxExitSaveEferMsr;
     225        case VMX_VMCS64_GUEST_PERF_GLOBAL_CTRL_FULL:
     226        case VMX_VMCS64_GUEST_PERF_GLOBAL_CTRL_HIGH:      return false;
     227        case VMX_VMCS64_GUEST_PDPTE0_FULL:
     228        case VMX_VMCS64_GUEST_PDPTE0_HIGH:
     229        case VMX_VMCS64_GUEST_PDPTE1_FULL:
     230        case VMX_VMCS64_GUEST_PDPTE1_HIGH:
     231        case VMX_VMCS64_GUEST_PDPTE2_FULL:
     232        case VMX_VMCS64_GUEST_PDPTE2_HIGH:
     233        case VMX_VMCS64_GUEST_PDPTE3_FULL:
     234        case VMX_VMCS64_GUEST_PDPTE3_HIGH:                return pFeat->fVmxEpt;
     235        case VMX_VMCS64_GUEST_BNDCFGS_FULL:
     236        case VMX_VMCS64_GUEST_BNDCFGS_HIGH:               return false;
     237
     238        /* Host-state fields. */
     239        case VMX_VMCS64_HOST_PAT_FULL:
     240        case VMX_VMCS64_HOST_PAT_HIGH:                    return pFeat->fVmxExitLoadPatMsr;
     241        case VMX_VMCS64_HOST_EFER_FULL:
     242        case VMX_VMCS64_HOST_EFER_HIGH:                   return pFeat->fVmxExitLoadEferMsr;
     243        case VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_FULL:
     244        case VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_HIGH:       return false;
     245
     246        /*
     247         * 32-bit fields.
     248         */
     249        /* Control fields. */
     250        case VMX_VMCS32_CTRL_PIN_EXEC:
     251        case VMX_VMCS32_CTRL_PROC_EXEC:
     252        case VMX_VMCS32_CTRL_EXCEPTION_BITMAP:
     253        case VMX_VMCS32_CTRL_PAGEFAULT_ERROR_MASK:
     254        case VMX_VMCS32_CTRL_PAGEFAULT_ERROR_MATCH:
     255        case VMX_VMCS32_CTRL_CR3_TARGET_COUNT:
     256        case VMX_VMCS32_CTRL_EXIT:
     257        case VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT:
     258        case VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT:
     259        case VMX_VMCS32_CTRL_ENTRY:
     260        case VMX_VMCS32_CTRL_ENTRY_MSR_LOAD_COUNT:
     261        case VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO:
     262        case VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE:
     263        case VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH:          return true;
     264        case VMX_VMCS32_CTRL_TPR_THRESHOLD:               return pFeat->fVmxUseTprShadow;
     265        case VMX_VMCS32_CTRL_PROC_EXEC2:                  return pFeat->fVmxSecondaryExecCtls;
     266        case VMX_VMCS32_CTRL_PLE_GAP:
     267        case VMX_VMCS32_CTRL_PLE_WINDOW:                  return pFeat->fVmxPauseLoopExit;
     268
     269        /* Read-only data fields. */
     270        case VMX_VMCS32_RO_VM_INSTR_ERROR:
     271        case VMX_VMCS32_RO_EXIT_REASON:
     272        case VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO:
     273        case VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE:
     274        case VMX_VMCS32_RO_IDT_VECTORING_INFO:
     275        case VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE:
     276        case VMX_VMCS32_RO_EXIT_INSTR_LENGTH:
     277        case VMX_VMCS32_RO_EXIT_INSTR_INFO:               return true;
     278
     279        /* Guest-state fields. */
     280        case VMX_VMCS32_GUEST_ES_LIMIT:
     281        case VMX_VMCS32_GUEST_CS_LIMIT:
     282        case VMX_VMCS32_GUEST_SS_LIMIT:
     283        case VMX_VMCS32_GUEST_DS_LIMIT:
     284        case VMX_VMCS32_GUEST_FS_LIMIT:
     285        case VMX_VMCS32_GUEST_GS_LIMIT:
     286        case VMX_VMCS32_GUEST_LDTR_LIMIT:
     287        case VMX_VMCS32_GUEST_TR_LIMIT:
     288        case VMX_VMCS32_GUEST_GDTR_LIMIT:
     289        case VMX_VMCS32_GUEST_IDTR_LIMIT:
     290        case VMX_VMCS32_GUEST_ES_ACCESS_RIGHTS:
     291        case VMX_VMCS32_GUEST_CS_ACCESS_RIGHTS:
     292        case VMX_VMCS32_GUEST_SS_ACCESS_RIGHTS:
     293        case VMX_VMCS32_GUEST_DS_ACCESS_RIGHTS:
     294        case VMX_VMCS32_GUEST_FS_ACCESS_RIGHTS:
     295        case VMX_VMCS32_GUEST_GS_ACCESS_RIGHTS:
     296        case VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS:
     297        case VMX_VMCS32_GUEST_TR_ACCESS_RIGHTS:
     298        case VMX_VMCS32_GUEST_INT_STATE:
     299        case VMX_VMCS32_GUEST_ACTIVITY_STATE:
     300        case VMX_VMCS32_GUEST_SMBASE:
     301        case VMX_VMCS32_GUEST_SYSENTER_CS:                return true;
     302        case VMX_VMCS32_PREEMPT_TIMER_VALUE:              return pFeat->fVmxPreemptTimer;
     303
     304        /* Host-state fields. */
     305        case VMX_VMCS32_HOST_SYSENTER_CS:                 return true;
     306
     307        /*
     308         * Natural-width fields.
     309         */
     310        /* Control fields. */
     311        case VMX_VMCS_CTRL_CR0_MASK:
     312        case VMX_VMCS_CTRL_CR4_MASK:
     313        case VMX_VMCS_CTRL_CR0_READ_SHADOW:
     314        case VMX_VMCS_CTRL_CR4_READ_SHADOW:
     315        case VMX_VMCS_CTRL_CR3_TARGET_VAL0:
     316        case VMX_VMCS_CTRL_CR3_TARGET_VAL1:
     317        case VMX_VMCS_CTRL_CR3_TARGET_VAL2:
     318        case VMX_VMCS_CTRL_CR3_TARGET_VAL3:               return true;
     319
     320        /* Read-only data fields. */
     321        case VMX_VMCS_RO_EXIT_QUALIFICATION:
     322        case VMX_VMCS_RO_IO_RCX:
     323        case VMX_VMCS_RO_IO_RSX:
     324        case VMX_VMCS_RO_IO_RDI:
     325        case VMX_VMCS_RO_IO_RIP:
     326        case VMX_VMCS_RO_EXIT_GUEST_LINEAR_ADDR:          return true;
     327
     328        /* Guest-state fields. */
     329        case VMX_VMCS_GUEST_CR0:
     330        case VMX_VMCS_GUEST_CR3:
     331        case VMX_VMCS_GUEST_CR4:
     332        case VMX_VMCS_GUEST_ES_BASE:
     333        case VMX_VMCS_GUEST_CS_BASE:
     334        case VMX_VMCS_GUEST_SS_BASE:
     335        case VMX_VMCS_GUEST_DS_BASE:
     336        case VMX_VMCS_GUEST_FS_BASE:
     337        case VMX_VMCS_GUEST_GS_BASE:
     338        case VMX_VMCS_GUEST_LDTR_BASE:
     339        case VMX_VMCS_GUEST_TR_BASE:
     340        case VMX_VMCS_GUEST_GDTR_BASE:
     341        case VMX_VMCS_GUEST_IDTR_BASE:
     342        case VMX_VMCS_GUEST_DR7:
     343        case VMX_VMCS_GUEST_RSP:
     344        case VMX_VMCS_GUEST_RIP:
     345        case VMX_VMCS_GUEST_RFLAGS:
     346        case VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS:
     347        case VMX_VMCS_GUEST_SYSENTER_ESP:
     348        case VMX_VMCS_GUEST_SYSENTER_EIP:                 return true;
     349
     350        /* Host-state fields. */
     351        case VMX_VMCS_HOST_CR0:
     352        case VMX_VMCS_HOST_CR3:
     353        case VMX_VMCS_HOST_CR4:
     354        case VMX_VMCS_HOST_FS_BASE:
     355        case VMX_VMCS_HOST_GS_BASE:
     356        case VMX_VMCS_HOST_TR_BASE:
     357        case VMX_VMCS_HOST_GDTR_BASE:
     358        case VMX_VMCS_HOST_IDTR_BASE:
     359        case VMX_VMCS_HOST_SYSENTER_ESP:
     360        case VMX_VMCS_HOST_SYSENTER_EIP:
     361        case VMX_VMCS_HOST_RSP:
     362        case VMX_VMCS_HOST_RIP:                           return true;
     363    }
     364
     365    return false;
     366}
     367#endif
    108368
    109369/**
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