Changeset 2934 in vbox
- Timestamp:
- May 30, 2007 3:46:43 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 21614
- Location:
- trunk/src/VBox/VMM/VMMR0
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp
r2699 r2934 469 469 470 470 /** TSC offset. */ 471 /** @todo use host tsc if safe, other intercept rdtsc */ 472 pVMCB->ctrl.u64TSCOffset = TMCpuTickGetOffset(pVM); 471 if (TMCpuTickCanUseRealTSC(pVM, &pVMCB->ctrl.u64TSCOffset)) 472 pVMCB->ctrl.u32InterceptCtrl1 &= ~SVM_CTRL1_INTERCEPT_RDTSC; 473 else 474 pVMCB->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_RDTSC; 473 475 474 476 /** @todo 64 bits stuff (?): -
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r2897 r2934 336 336 { 337 337 Log2(("Enable irq window exit!\n")); 338 rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls | VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT); 338 pVM->hwaccm.s.vmx.proc_ctls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT; 339 rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls); 339 340 AssertRC(rc); 340 341 } … … 597 598 598 599 /* Real mode emulation using v86 mode with CR4.VME (interrupt redirection using the int bitmap in the TSS) */ 599 /* @todo use fake TSS here */ 600 //if (!(pCtx->cr0 & X86_CR0_PROTECTION_ENABLE)) 601 602 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_LIMIT, pCtx->trHid.u32Limit); 603 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_BASE, pCtx->trHid.u32Base); 600 if (!(pCtx->cr0 & X86_CR0_PROTECTION_ENABLE)) 601 { 602 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_LIMIT, sizeof(*pVM->hwaccm.s.vmx.pRealModeTSS)); 603 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_BASE, 0); 604 } 605 else 606 { 607 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_LIMIT, pCtx->trHid.u32Limit); 608 rc |= VMXWriteVMCS(VMX_VMCS_GUEST_TR_BASE, pCtx->trHid.u32Base); 609 } 604 610 val = pCtx->trHid.Attr.u; 605 611 … … 793 799 794 800 /** TSC offset. */ 795 /** @todo use host tsc if safe, other intercept rdtsc */ 796 uint64_t u64TSCOffset = TMCpuTickGetOffset(pVM); 797 801 uint64_t u64TSCOffset; 802 803 if (TMCpuTickCanUseRealTSC(pVM, &u64TSCOffset)) 804 { 805 /** @todo does VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT take precedence over TSC_OFFSET? */ 798 806 #if HC_ARCH_BITS == 64 799 rc = VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_FULL, u64TSCOffset);807 rc = VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_FULL, u64TSCOffset); 800 808 #else 801 rc = VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_FULL, (uint32_t)u64TSCOffset); 802 rc |= VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_HIGH, (uint32_t)(u64TSCOffset >> 32ULL)); 803 #endif 804 AssertRC(rc); 809 rc = VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_FULL, (uint32_t)u64TSCOffset); 810 rc |= VMXWriteVMCS(VMX_VMCS_CTRL_TSC_OFFSET_HIGH, (uint32_t)(u64TSCOffset >> 32ULL)); 811 #endif 812 AssertRC(rc); 813 814 pVM->hwaccm.s.vmx.proc_ctls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT; 815 rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls); 816 AssertRC(rc); 817 } 818 else 819 { 820 pVM->hwaccm.s.vmx.proc_ctls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT; 821 rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls); 822 AssertRC(rc); 823 } 805 824 806 825 /* Done. */ … … 1462 1481 /* Clear VM-exit on IF=1 change. */ 1463 1482 Log2(("VMX_EXIT_IRQ_WINDOW %VGv\n", pCtx->eip)); 1483 pVM->hwaccm.s.vmx.proc_ctls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT; 1464 1484 rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls); 1465 1485 AssertRC(rc);
Note:
See TracChangeset
for help on using the changeset viewer.