Changeset 72619 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jun 19, 2018 7:12:46 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 123118
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r72596 r72619 1865 1865 } 1866 1866 1867 1868 #if 1 /** @todo Remove after testing and enabling @bugref{6973}. */ 1869 1870 /** 1871 * Interpret RDTSC. 1872 * 1873 * @returns VBox status code. 1874 * @param pVM The cross context VM structure. 1875 * @param pVCpu The cross context virtual CPU structure. 1876 * @param pRegFrame The register frame. 1877 * 1878 */ 1879 VMM_INT_DECL(int) EMInterpretRdtsc(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame) 1880 { 1881 Assert(pRegFrame == CPUMGetGuestCtxCore(pVCpu)); 1882 unsigned uCR4 = CPUMGetGuestCR4(pVCpu); 1883 1884 if (uCR4 & X86_CR4_TSD) 1885 return VERR_EM_INTERPRETER; /* genuine #GP */ 1886 1887 uint64_t uTicks = TMCpuTickGet(pVCpu); 1888 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM 1889 uTicks = CPUMApplyNestedGuestTscOffset(pVCpu, uTicks); 1890 #endif 1891 1892 /* Same behaviour in 32 & 64 bits mode */ 1893 pRegFrame->rax = RT_LO_U32(uTicks); 1894 pRegFrame->rdx = RT_HI_U32(uTicks); 1895 #ifdef VBOX_COMPARE_IEM_AND_EM 1896 g_fIgnoreRaxRdx = true; 1897 #endif 1898 1899 NOREF(pVM); 1900 return VINF_SUCCESS; 1901 } 1902 1903 /** 1904 * Interpret RDTSCP. 1905 * 1906 * @returns VBox status code. 1907 * @param pVM The cross context VM structure. 1908 * @param pVCpu The cross context virtual CPU structure. 1909 * @param pCtx The CPU context. 1910 * 1911 */ 1912 VMM_INT_DECL(int) EMInterpretRdtscp(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx) 1913 { 1914 Assert(pCtx == CPUMQueryGuestCtxPtr(pVCpu)); 1915 uint32_t uCR4 = CPUMGetGuestCR4(pVCpu); 1916 1917 if (!pVM->cpum.ro.GuestFeatures.fRdTscP) 1918 { 1919 AssertFailed(); 1920 return VERR_EM_INTERPRETER; /* genuine #UD */ 1921 } 1922 1923 if (uCR4 & X86_CR4_TSD) 1924 return VERR_EM_INTERPRETER; /* genuine #GP */ 1925 1926 uint64_t uTicks = TMCpuTickGet(pVCpu); 1927 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM 1928 uTicks = CPUMApplyNestedGuestTscOffset(pVCpu, uTicks); 1929 #endif 1930 1931 /* Same behaviour in 32 & 64 bits mode */ 1932 pCtx->rax = RT_LO_U32(uTicks); 1933 pCtx->rdx = RT_HI_U32(uTicks); 1934 #ifdef VBOX_COMPARE_IEM_AND_EM 1935 g_fIgnoreRaxRdx = true; 1936 #endif 1937 /* Low dword of the TSC_AUX msr only. */ 1938 VBOXSTRICTRC rc2 = CPUMQueryGuestMsr(pVCpu, MSR_K8_TSC_AUX, &pCtx->rcx); Assert(rc2 == VINF_SUCCESS); NOREF(rc2); 1939 pCtx->rcx &= UINT32_C(0xffffffff); 1940 1941 return VINF_SUCCESS; 1942 } 1943 1944 #endif /* Trying to use IEM APIs instead. */ 1867 1945 1868 1946 /** -
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r72609 r72619 6255 6255 { 6256 6256 HMSVM_VALIDATE_EXIT_HANDLER_PARAMS(); 6257 #if 0 /** @todo Needs testing. @bugref{6973} */ 6257 6258 VBOXSTRICTRC rcStrict = IEMExecDecodedRdtsc(pVCpu, hmR0SvmGetInstrLengthHwAssist(pVCpu, pCtx, 2)); 6258 6259 if (rcStrict == VINF_SUCCESS) … … 6263 6264 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtsc); 6264 6265 return VBOXSTRICTRC_TODO(rcStrict); 6266 #else 6267 int rc = EMInterpretRdtsc(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx)); 6268 if (RT_LIKELY(rc == VINF_SUCCESS)) 6269 { 6270 pSvmTransient->fUpdateTscOffsetting = true; 6271 hmR0SvmAdvanceRipHwAssist(pVCpu, pCtx, 2); 6272 HMSVM_CHECK_SINGLE_STEP(pVCpu, rc); 6273 } 6274 else 6275 { 6276 AssertMsgFailed(("hmR0SvmExitRdtsc: EMInterpretRdtsc failed with %Rrc\n", rc)); 6277 rc = VERR_EM_INTERPRETER; 6278 } 6279 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtsc); 6280 return rc; 6281 #endif 6265 6282 } 6266 6283 … … 6272 6289 { 6273 6290 HMSVM_VALIDATE_EXIT_HANDLER_PARAMS(); 6291 #if 0 /** @todo Needs testing. @bugref{6973} */ 6274 6292 VBOXSTRICTRC rcStrict = IEMExecDecodedRdtscp(pVCpu, hmR0SvmGetInstrLengthHwAssist(pVCpu, pCtx, 3)); 6275 6293 if (rcStrict == VINF_SUCCESS) … … 6280 6298 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtscp); 6281 6299 return VBOXSTRICTRC_TODO(rcStrict); 6300 #else 6301 int rc = EMInterpretRdtscp(pVCpu->CTX_SUFF(pVM), pVCpu, pCtx); 6302 if (RT_LIKELY(rc == VINF_SUCCESS)) 6303 { 6304 pSvmTransient->fUpdateTscOffsetting = true; 6305 hmR0SvmAdvanceRipHwAssist(pVCpu, pCtx, 3); 6306 HMSVM_CHECK_SINGLE_STEP(pVCpu, rc); 6307 } 6308 else 6309 { 6310 AssertMsgFailed(("hmR0SvmExitRdtsc: EMInterpretRdtscp failed with %Rrc\n", rc)); 6311 rc = VERR_EM_INTERPRETER; 6312 } 6313 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtscp); 6314 return rc; 6315 #endif 6282 6316 } 6283 6317 -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r72606 r72619 11917 11917 { 11918 11918 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(); 11919 #if 0 /** @todo Needs testing. @bugref{6973} */ 11919 11920 int rc = hmR0VmxSaveGuestCR4(pVCpu, pMixedCtx); /* Needed for CPL < 0 only, really. */ 11920 11921 rc |= hmR0VmxSaveGuestRegsForIemExec(pVCpu, pMixedCtx, false /*fMemory*/, false /*fNeedRsp*/); … … 11932 11933 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtsc); 11933 11934 return rcStrict; 11935 #else 11936 int rc = hmR0VmxSaveGuestCR4(pVCpu, pMixedCtx); 11937 AssertRCReturn(rc, rc); 11938 11939 PVM pVM = pVCpu->CTX_SUFF(pVM); 11940 rc = EMInterpretRdtsc(pVM, pVCpu, CPUMCTX2CORE(pMixedCtx)); 11941 if (RT_LIKELY(rc == VINF_SUCCESS)) 11942 { 11943 rc = hmR0VmxAdvanceGuestRip(pVCpu, pMixedCtx, pVmxTransient); 11944 Assert(pVmxTransient->cbInstr == 2); 11945 /* If we get a spurious VM-exit when offsetting is enabled, we must reset offsetting on VM-reentry. See @bugref{6634}. */ 11946 if (pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_TSC_OFFSETTING) 11947 pVmxTransient->fUpdateTscOffsettingAndPreemptTimer = true; 11948 } 11949 else 11950 rc = VERR_EM_INTERPRETER; 11951 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtsc); 11952 return rc; 11953 #endif 11934 11954 } 11935 11955 … … 11941 11961 { 11942 11962 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(); 11963 #if 0 /** @todo Needs testing. @bugref{6973} */ 11943 11964 int rc = hmR0VmxSaveGuestCR4(pVCpu, pMixedCtx); /* Needed for CPL < 0 only, really. */ 11944 11965 rc |= hmR0VmxSaveGuestRegsForIemExec(pVCpu, pMixedCtx, false /*fMemory*/, false /*fNeedRsp*/); … … 11957 11978 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtscp); 11958 11979 return rcStrict; 11980 #else 11981 int rc = hmR0VmxSaveGuestCR4(pVCpu, pMixedCtx); 11982 rc |= hmR0VmxSaveGuestAutoLoadStoreMsrs(pVCpu, pMixedCtx); /* For MSR_K8_TSC_AUX */ 11983 AssertRCReturn(rc, rc); 11984 11985 PVM pVM = pVCpu->CTX_SUFF(pVM); 11986 rc = EMInterpretRdtscp(pVM, pVCpu, pMixedCtx); 11987 if (RT_SUCCESS(rc)) 11988 { 11989 rc = hmR0VmxAdvanceGuestRip(pVCpu, pMixedCtx, pVmxTransient); 11990 Assert(pVmxTransient->cbInstr == 3); 11991 /* If we get a spurious VM-exit when offsetting is enabled, we must reset offsetting on VM-reentry. See @bugref{6634}. */ 11992 if (pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_TSC_OFFSETTING) 11993 pVmxTransient->fUpdateTscOffsettingAndPreemptTimer = true; 11994 } 11995 else 11996 { 11997 AssertMsgFailed(("hmR0VmxExitRdtscp: EMInterpretRdtscp failed with %Rrc\n", rc)); 11998 rc = VERR_EM_INTERPRETER; 11999 } 12000 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdtscp); 12001 return rc; 12002 #endif 11959 12003 } 11960 12004
Note:
See TracChangeset
for help on using the changeset viewer.