VirtualBox

Changeset 44032 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Dec 4, 2012 2:11:49 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
82462
Message:

VMM/VMMR0: VMX pin, entry, exit controls are 32-bit.

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

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

    r43977 r44032  
    580580        /** @todo make sure they don't conflict with the above requirements. */
    581581        val &= pVM->hm.s.vmx.msr.vmx_proc_ctls.n.allowed1;
    582         pVCpu->hm.s.vmx.u64ProcCtls = val;
     582        pVCpu->hm.s.vmx.u32ProcCtls = val;
    583583
    584584        rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, val);
     
    612612            /** @todo make sure they don't conflict with the above requirements. */
    613613            val &= pVM->hm.s.vmx.msr.vmx_proc_ctls2.n.allowed1;
    614             pVCpu->hm.s.vmx.u64ProcCtls2 = val;
     614            pVCpu->hm.s.vmx.u32ProcCtls2 = val;
    615615            rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS2, val);
    616616            AssertRC(rc);
     
    676676            hmR0VmxSetMSRPermission(pVCpu, MSR_K8_GS_BASE, true, true);
    677677            hmR0VmxSetMSRPermission(pVCpu, MSR_K8_FS_BASE, true, true);
    678             if (pVCpu->hm.s.vmx.u64ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
     678            if (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
    679679                hmR0VmxSetMSRPermission(pVCpu, MSR_K8_TSC_AUX, true, true);
    680680        }
     
    10401040            if (!(pCtx->eflags.u32 & X86_EFL_IF))
    10411041            {
    1042                 if (!(pVCpu->hm.s.vmx.u64ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT))
     1042                if (!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT))
    10431043                {
    10441044                    LogFlow(("Enable irq window exit!\n"));
    1045                     pVCpu->hm.s.vmx.u64ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT;
    1046                     rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     1045                    pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT;
     1046                    rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    10471047                    AssertRC(rc);
    10481048                }
     
    14481448# endif
    14491449
    1450         if (pVCpu->hm.s.vmx.u64ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
     1450        if (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
    14511451        {
    14521452            pMsr->u32IndexMSR = MSR_K8_TSC_AUX;
     
    19121912            {
    19131913                /* Disable CR3 read/write monitoring as we don't need it for EPT. */
    1914                 pVCpu->hm.s.vmx.u64ProcCtls &=  ~(  VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_LOAD_EXIT
     1914                pVCpu->hm.s.vmx.u32ProcCtls &=  ~(  VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_LOAD_EXIT
    19151915                                                    | VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_STORE_EXIT);
    19161916            }
     
    19181918            {
    19191919                /* Reenable CR3 read/write monitoring as our identity mapped page table is active. */
    1920                 pVCpu->hm.s.vmx.u64ProcCtls |=   VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_LOAD_EXIT
     1920                pVCpu->hm.s.vmx.u32ProcCtls |=   VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_LOAD_EXIT
    19211921                                                 | VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_CR3_STORE_EXIT;
    19221922            }
    1923             rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     1923            rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    19241924            AssertRC(rc);
    19251925        }
     
    20372037        if (DBGFIsStepping(pVCpu))
    20382038        {
    2039             pVCpu->hm.s.vmx.u64ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MONITOR_TRAP_FLAG;
    2040             rc = VMXWriteVmcs(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     2039            pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MONITOR_TRAP_FLAG;
     2040            rc = VMXWriteVmcs(VMX_VMCS_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    20412041            AssertRC(rc);
    20422042        }
     
    21342134
    21352135            /* Disable DRx move intercepts. */
    2136             pVCpu->hm.s.vmx.u64ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
    2137             rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     2136            pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
     2137            rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    21382138            AssertRC(rc);
    21392139
     
    22312231    }
    22322232
    2233     if (   pVCpu->hm.s.vmx.u64ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP
     2233    if (   pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP
    22342234        && (u32GstExtFeatures & X86_CPUID_EXT_FEATURE_EDX_RDTSCP))
    22352235    {
     
    22782278            AssertRC(rc);
    22792279
    2280             pVCpu->hm.s.vmx.u64ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
    2281             rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     2280            pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
     2281            rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    22822282            AssertRC(rc);
    22832283            STAM_COUNTER_INC(&pVCpu->hm.s.StatTscOffset);
     
    22902290                     TMCpuTickGetLastSeen(pVCpu), TMCpuTickGetLastSeen(pVCpu) - u64CurTSC - pVCpu->hm.s.vmx.u64TSCOffset,
    22912291                     TMCpuTickGet(pVCpu)));
    2292             pVCpu->hm.s.vmx.u64ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
    2293             rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     2292            pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
     2293            rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    22942294            AssertRC(rc);
    22952295            STAM_COUNTER_INC(&pVCpu->hm.s.StatTscInterceptOverFlow);
     
    22982298    else
    22992299    {
    2300         pVCpu->hm.s.vmx.u64ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
    2301         rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     2300        pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT;
     2301        rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    23022302        AssertRC(rc);
    23032303        STAM_COUNTER_INC(&pVCpu->hm.s.StatTscIntercept);
     
    32263226     * RDTSCPs (that don't cause exits) reads the guest MSR. See @bugref{3324}.
    32273227     */
    3228     if (    (pVCpu->hm.s.vmx.u64ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
    3229         && !(pVCpu->hm.s.vmx.u64ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT))
     3228    if (    (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
     3229        && !(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT))
    32303230    {
    32313231        pVCpu->hm.s.u64HostTSCAux = ASMRdMsr(MSR_K8_TSC_AUX);
     
    32463246
    32473247    /* Possibly the last TSC value seen by the guest (too high) (only when we're in TSC offset mode). */
    3248     if (!(pVCpu->hm.s.vmx.u64ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT))
     3248    if (!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT))
    32493249    {
    32503250#ifndef VBOX_WITH_AUTO_MSR_LOAD_RESTORE
    32513251        /* Restore host's TSC_AUX. */
    3252         if (pVCpu->hm.s.vmx.u64ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
     3252        if (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
    32533253            ASMWrMsr(MSR_K8_TSC_AUX, pVCpu->hm.s.u64HostTSCAux);
    32543254#endif
     
    41374137        LogFlow(("VMX_EXIT_IRQ_WINDOW %RGv pending=%d IF=%d\n", (RTGCPTR)pCtx->rip,
    41384138                 VMCPU_FF_ISPENDING(pVCpu, (VMCPU_FF_INTERRUPT_APIC|VMCPU_FF_INTERRUPT_PIC)), pCtx->eflags.Bits.u1IF));
    4139         pVCpu->hm.s.vmx.u64ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT;
    4140         rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     4139        pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_IRQ_WINDOW_EXIT;
     4140        rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    41414141        AssertRC(rc2);
    41424142        STAM_COUNTER_INC(&pVCpu->hm.s.StatExitIrqWindow);
     
    43924392        {
    43934393            /* Disable DRx move intercepts. */
    4394             pVCpu->hm.s.vmx.u64ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
    4395             rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     4394            pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
     4395            rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    43964396            AssertRC(rc2);
    43974397
     
    47584758    case VMX_EXIT_MTF:                  /* 37 Exit due to Monitor Trap Flag. */
    47594759        LogFlow(("VMX_EXIT_MTF at %RGv\n", (RTGCPTR)pCtx->rip));
    4760         pVCpu->hm.s.vmx.u64ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MONITOR_TRAP_FLAG;
    4761         rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     4760        pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MONITOR_TRAP_FLAG;
     4761        rc2 = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    47624762        AssertRC(rc2);
    47634763        STAM_COUNTER_INC(&pVCpu->hm.s.StatExitMtf);
     
    49804980    {
    49814981        CPUMR0LoadHostDebugState(pVM, pVCpu);
    4982         Assert(pVCpu->hm.s.vmx.u64ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT);
     4982        Assert(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT);
    49834983    }
    49844984    else
     
    49934993
    49944994        /* Enable DRx move intercepts again. */
    4995         pVCpu->hm.s.vmx.u64ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
    4996         int rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u64ProcCtls);
     4995        pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT;
     4996        int rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls);
    49974997        AssertRC(rc);
    49984998
     
    50015001    }
    50025002    else
    5003         Assert(pVCpu->hm.s.vmx.u64ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT);
     5003        Assert(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_MOV_DR_EXIT);
    50045004
    50055005    /*
  • trunk/src/VBox/VMM/include/HMInternal.h

    r43977 r44032  
    541541#endif
    542542
    543         /** Current VMX_VMCS_CTRL_PROC_EXEC_CONTROLS. */
    544         uint64_t                    u64ProcCtls;
    545         /** Current VMX_VMCS_CTRL_PROC_EXEC2_CONTROLS. */
    546         uint64_t                    u64ProcCtls2;
    547         /** Current VMX_VMCS_CTRL_EXIT_CONTROLS. */
    548         uint64_t                    u64ExitCtls;
    549         /** Current VMX_VMCS_CTRL_ENTRY_CONTROLS. */
    550         uint64_t                    u64EntryCtls;
     543        /** Current VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS. */
     544        uint32_t                    u32ProcCtls;
     545        /** Current VMX_VMCS32_CTRL_PROC_EXEC2_CONTROLS. */
     546        uint32_t                    u32ProcCtls2;
     547        /** Current VMX_VMCS32_CTRL_EXIT_CONTROLS. */
     548        uint32_t                    u32ExitCtls;
     549        /** Current VMX_VMCS32_CTRL_ENTRY_CONTROLS. */
     550        uint32_t                    u32EntryCtls;
    551551        /** Physical address of the virtual APIC page for TPR caching. */
    552552        RTHCPHYS                    HCPhysVirtApic;
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r43798 r44032  
    401401    CHECK_MEMBER_ALIGNMENT(HMCPU, StatEntry, 8);
    402402    CHECK_MEMBER_ALIGNMENT(HMCPU, vmx.HCPhysVMCS, sizeof(RTHCPHYS));
    403     CHECK_MEMBER_ALIGNMENT(HMCPU, vmx.u64ProcCtls, 8);
     403    CHECK_MEMBER_ALIGNMENT(HMCPU, vmx.u32ProcCtls, 8);
    404404    CHECK_MEMBER_ALIGNMENT(HMCPU, Event.intInfo, 8);
    405405
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