- Timestamp:
- Aug 21, 2018 6:37:22 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 124481
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r73756 r73797 105 105 (a_u64Disp) = (int32_t)RT_MAKE_U32_FROM_U8(bTmp0, bTmp1, bTmp2, bTmp3); \ 106 106 } 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 */ 119 IEM_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 108 368 109 369 /**
Note:
See TracChangeset
for help on using the changeset viewer.