VirtualBox

Changeset 2934 in vbox


Ignore:
Timestamp:
May 30, 2007 3:46:43 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
21614
Message:

Initial code for proper tsc offset or rdtsc emulation. Needs testing.

Location:
trunk/src/VBox/VMM/VMMR0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r2699 r2934  
    469469
    470470    /** 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;
    473475
    474476    /** @todo 64 bits stuff (?):
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r2897 r2934  
    336336        {
    337337            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);
    339340            AssertRC(rc);
    340341        }
     
    597598
    598599        /* 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        }
    604610        val = pCtx->trHid.Attr.u;
    605611
     
    793799
    794800    /** 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? */
    798806#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);
    800808#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    }
    805824
    806825    /* Done. */
     
    14621481        /* Clear VM-exit on IF=1 change. */
    14631482        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;
    14641484        rc = VMXWriteVMCS(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVM->hwaccm.s.vmx.proc_ctls);
    14651485        AssertRC(rc);
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