VirtualBox

Changeset 45904 in vbox


Ignore:
Timestamp:
May 6, 2013 11:53:53 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85530
Message:

VMM/HMVMXR0: Fixes for pure 32-bit darwin hosts (not hybrid) with better identification and separation of guest-natural, host-natural fields.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/hm_vmx.h

    r45894 r45904  
    17291729#ifdef VBOX_WITH_OLD_VTX_CODE
    17301730# if HC_ARCH_BITS == 64
    1731 # define VMXWriteVmcs VMXWriteVmcs64
     1731#  define VMXWriteVmcs VMXWriteVmcs64
    17321732# else
    1733 # define VMXWriteVmcs VMXWriteVmcs32
     1733#  define VMXWriteVmcs VMXWriteVmcs32
    17341734# endif
    17351735#else /* !VBOX_WITH_OLD_VTX_CODE */
    1736 # if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
    1737 # define VMXWriteVmcsHstN VMXWriteVmcs64
    1738 # else
    1739 # define VMXWriteVmcsHstN VMXWriteVmcs32
     1736# ifdef VBOX_WITH_HYBRID_32BIT_KERNEL
     1737#  define VMXWriteVmcsHstN(idxField, uVal)       HMVMX_IS_64BIT_HOST_MODE() ?                     \
     1738                                                   VMXWriteVmcs64(idxField, uVal)                 \
     1739                                                 : VMXWriteVmcs32(idxField, uVal)
     1740#  define VMXWriteVmcsGstN(idxField, u64Val)     (pVCpu->CTX_SUFF(pVM)->hm.s.fAllow64BitGuests) ? \
     1741                                                   VMXWriteVmcs64(idxField, u64Val)               \
     1742                                                 : VMXWriteVmcs32(idxField, u64Val)
     1743# elif HC_ARCH_BITS == 32
     1744#  define VMXWriteVmcsHstN                       VMXWriteVmcs32
     1745#  define VMXWriteVmcsGstN(idxField, u64Val)     VMXWriteVmcs64Ex(pVCpu, idxField, u64Val)
     1746# else  /* HC_ARCH_BITS == 64 */
     1747#  define VMXWriteVmcsHstN                       VMXWriteVmcs64
     1748#  define VMXWriteVmcsGstN                       VMXWriteVmcs64
    17401749# endif
    1741 # define VMXWriteVmcsGstN VMXWriteVmcs64
    1742 #endif
     1750#endif  /* !VBOX_WITH_OLD_VTX_CODE */
    17431751
    17441752
     
    18371845#endif
    18381846
     1847#ifdef VBOX_WITH_OLD_VTX_CODE
    18391848# if HC_ARCH_BITS == 64
    18401849#  define VMXReadVmcsField VMXReadVmcs64
     
    18421851#  define VMXReadVmcsField VMXReadVmcs32
    18431852# endif
     1853#endif
    18441854
    18451855/**
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r45896 r45904  
    21982198        /* We need the 64-bit TR base for hybrid darwin. */
    21992199        uint64_t u64TRBase = X86DESC64_BASE((PX86DESC64)pDesc);
    2200         rc = VMXWriteVmcsHstN(VMX_VMCS_HOST_TR_BASE, u64TRBase);
     2200        rc = VMXWriteVmcs64(VMX_VMCS_HOST_TR_BASE, u64TRBase);
    22012201    }
    22022202    else
     
    22232223        uint64_t u64FSBase = ASMRdMsr(MSR_K8_FS_BASE);
    22242224        uint64_t u64GSBase = ASMRdMsr(MSR_K8_GS_BASE);
    2225         rc  = VMXWriteVmcsHstN(VMX_VMCS_HOST_FS_BASE, u64FSBase);
    2226         rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_GS_BASE, u64GSBase);
     2225        rc  = VMXWriteVmcs64(VMX_VMCS_HOST_FS_BASE, u64FSBase);
     2226        rc |= VMXWriteVmcs64(VMX_VMCS_HOST_GS_BASE, u64GSBase);
    22272227        AssertRCReturn(rc, rc);
    22282228    }
     
    23032303     * Host Sysenter MSRs.
    23042304     */
    2305     rc |= VMXWriteVmcs32(VMX_VMCS32_HOST_SYSENTER_CS,    ASMRdMsr_Low(MSR_IA32_SYSENTER_CS));
     2305    rc |= VMXWriteVmcs32(VMX_VMCS32_HOST_SYSENTER_CS,        ASMRdMsr_Low(MSR_IA32_SYSENTER_CS));
    23062306# ifdef VBOX_WITH_HYBRID_32BIT_KERNEL
    23072307    if (HMVMX_IS_64BIT_HOST_MODE())
    23082308    {
    2309         rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_ESP,   ASMRdMsr(MSR_IA32_SYSENTER_ESP));
    2310         rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_EIP,   ASMRdMsr(MSR_IA32_SYSENTER_EIP));
     2309        rc |= VMXWriteVmcs64(VMX_VMCS_HOST_SYSENTER_ESP,     ASMRdMsr(MSR_IA32_SYSENTER_ESP));
     2310        rc |= VMXWriteVmcs64(VMX_VMCS_HOST_SYSENTER_EIP,     ASMRdMsr(MSR_IA32_SYSENTER_EIP));
    23112311    }
    23122312    else
    23132313    {
    2314         rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_ESP,   ASMRdMsr_Low(MSR_IA32_SYSENTER_ESP));
    2315         rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_EIP,   ASMRdMsr_Low(MSR_IA32_SYSENTER_EIP));
     2314        rc |= VMXWriteVmcs32(VMX_VMCS_HOST_SYSENTER_ESP,     ASMRdMsr_Low(MSR_IA32_SYSENTER_ESP));
     2315        rc |= VMXWriteVmcs32(VMX_VMCS_HOST_SYSENTER_EIP,     ASMRdMsr_Low(MSR_IA32_SYSENTER_EIP));
    23162316    }
    23172317# elif HC_ARCH_BITS == 32
    2318     rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_ESP,       ASMRdMsr_Low(MSR_IA32_SYSENTER_ESP));
    2319     rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_EIP,       ASMRdMsr_Low(MSR_IA32_SYSENTER_EIP));
     2318    rc |= VMXWriteVmcs32(VMX_VMCS_HOST_SYSENTER_ESP,         ASMRdMsr_Low(MSR_IA32_SYSENTER_ESP));
     2319    rc |= VMXWriteVmcs32(VMX_VMCS_HOST_SYSENTER_EIP,         ASMRdMsr_Low(MSR_IA32_SYSENTER_EIP));
    23202320# else
    2321     rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_ESP,       ASMRdMsr(MSR_IA32_SYSENTER_ESP));
    2322     rc |= VMXWriteVmcsHstN(VMX_VMCS_HOST_SYSENTER_EIP,       ASMRdMsr(MSR_IA32_SYSENTER_EIP));
     2321    rc |= VMXWriteVmcs64(VMX_VMCS_HOST_SYSENTER_ESP,         ASMRdMsr(MSR_IA32_SYSENTER_ESP));
     2322    rc |= VMXWriteVmcs64(VMX_VMCS_HOST_SYSENTER_EIP,         ASMRdMsr(MSR_IA32_SYSENTER_EIP));
    23232323# endif
    23242324    AssertRCReturn(rc, rc);
     
    28332833         * we want to be notified immediately of guest CR0 changes (e.g. PG to update our shadow page tables).
    28342834         */
    2835         uint64_t u64CR0Mask = 0;
    2836         u64CR0Mask =  X86_CR0_PE
     2835        uint64_t u32CR0Mask = 0;
     2836        u32CR0Mask =  X86_CR0_PE
    28372837                    | X86_CR0_NE
    28382838                    | X86_CR0_WP
     
    28422842                    | X86_CR0_NW;   /* Bit ignored on VM-entry and VM-exit. Don't let the guest modify the host CR0.NW */
    28432843        if (pVM->hm.s.vmx.fUnrestrictedGuest)
    2844             u64CR0Mask &= ~X86_CR0_PE;
     2844            u32CR0Mask &= ~X86_CR0_PE;
    28452845        if (pVM->hm.s.fNestedPaging)
    2846             u64CR0Mask &= ~X86_CR0_WP;
     2846            u32CR0Mask &= ~X86_CR0_WP;
    28472847
    28482848        /* If the guest FPU state is active, don't need to VM-exit on writes to FPU related bits in CR0. */
    28492849        if (fInterceptNM)
    2850             u64CR0Mask |=  (X86_CR0_TS | X86_CR0_MP);
     2850            u32CR0Mask |=  (X86_CR0_TS | X86_CR0_MP);
    28512851        else
    2852             u64CR0Mask &= ~(X86_CR0_TS | X86_CR0_MP);
     2852            u32CR0Mask &= ~(X86_CR0_TS | X86_CR0_MP);
    28532853
    28542854        /* Write the CR0 mask into the VMCS and update the VCPU's copy of the current CR0 mask. */
    2855         pVCpu->hm.s.vmx.cr0_mask = u64CR0Mask;
    2856         rc |= VMXWriteVmcsHstN(VMX_VMCS_CTRL_CR0_MASK, u64CR0Mask);
     2855        pVCpu->hm.s.vmx.cr0_mask = u32CR0Mask;
     2856        rc |= VMXWriteVmcs32(VMX_VMCS_CTRL_CR0_MASK, u32CR0Mask);
    28572857        AssertRCReturn(rc, rc);
    28582858
     
    29282928                GCPhysGuestCR3 = GCPhys;
    29292929            }
     2930
     2931            Log(("Load: VMX_VMCS_GUEST_CR3=%#RGv (GstN)\n", GCPhysGuestCR3));
     2932            rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_CR3, GCPhysGuestCR3);
    29302933        }
    29312934        else
    29322935        {
    29332936            /* Non-nested paging case, just use the hypervisor's CR3. */
    2934             GCPhysGuestCR3 = PGMGetHyperCR3(pVCpu);
    2935         }
    2936 
    2937         Log(("Load: VMX_VMCS_GUEST_CR3=%#RGv\n", GCPhysGuestCR3));
    2938         rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_CR3, GCPhysGuestCR3);
     2937            RTHCPHYS HCPhysGuestCR3 = PGMGetHyperCR3(pVCpu);
     2938
     2939            Log(("Load: VMX_VMCS_GUEST_CR3=%#RHv (HstN)\n", HCPhysGuestCR3));
     2940            rc = VMXWriteVmcsHstN(VMX_VMCS_GUEST_CR3, HCPhysGuestCR3);
     2941        }
    29392942        AssertRCReturn(rc, rc);
    29402943
     
    29512954
    29522955        /* The guest's view of its CR4 is unblemished. */
    2953         rc  = VMXWriteVmcs32(VMX_VMCS_CTRL_CR4_READ_SHADOW, u32GuestCR4);
     2956        rc = VMXWriteVmcs32(VMX_VMCS_CTRL_CR4_READ_SHADOW, u32GuestCR4);
    29542957        AssertRCReturn(rc, rc);
    29552958        Log(("Load: VMX_VMCS_CTRL_CR4_READ_SHADOW=%#RX32\n", u32GuestCR4));
     
    30253028
    30263029        /* Setup CR4 mask. CR4 flags owned by the host, if the guest attempts to change them, that would cause a VM exit. */
    3027         uint64_t u64CR4Mask = 0;
    3028         u64CR4Mask =  X86_CR4_VME
     3030        uint32_t u32CR4Mask = 0;
     3031        u32CR4Mask =  X86_CR4_VME
    30293032                    | X86_CR4_PAE
    30303033                    | X86_CR4_PGE
    30313034                    | X86_CR4_PSE
    30323035                    | X86_CR4_VMXE;
    3033         pVCpu->hm.s.vmx.cr4_mask = u64CR4Mask;
    3034         rc |= VMXWriteVmcsHstN(VMX_VMCS_CTRL_CR4_MASK, u64CR4Mask);
     3036        pVCpu->hm.s.vmx.cr4_mask = u32CR4Mask;
     3037        rc |= VMXWriteVmcs32(VMX_VMCS_CTRL_CR4_MASK, u32CR4Mask);
    30353038        AssertRCReturn(rc, rc);
    30363039
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.h

    r45786 r45904  
    6969# endif
    7070#  define VMXReadVmcs                                    VMXReadVmcsField
    71 #else
    72 # if HC_ARCH_BITS == 32 && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
    73 # define VMXReadVmcsHstN                                 VMXReadVmcs32
    74 # define VMXReadVmcsGstN(idxField, pVal)                 VMXReadCachedVmcsEx(pVCpu, idxField##_CACHE_IDX, pVal)
    75 # define VMXReadVmcsGstNByIdxVal(idxField, pVal)         VMXReadCachedVmcsEx(pVCpu, idxField, pVal)
    76 # else
    77 # define VMXReadVmcsHstN                                 VMXReadVmcs64
    78 # define VMXReadVmcsGstN                                 VMXReadVmcs64
    79 # define VMXReadVmcsGstNByIdxVal                         VMXReadVmcs64
     71#else /* !VBOX_WITH_OLD_VTX_CODE */
     72# ifdef VBOX_WITH_HYBRID_32BIT_KERNEL
     73#  define VMXReadVmcsHstN(idxField, pVal)                 HMVMX_IS_64BIT_HOST_MODE() ?                     \
     74                                                            VMXReadVmcs64(idxField, pVal)                  \
     75                                                          : VMXReadVmcs32(idxField, (uint32_t *)pVal)
     76#  define VMXReadVmcsGstN(idxField, pVal)                 (pVCpu->CTX_SUFF(pVM)->hm.s.fAllow64BitGuests) ? \
     77                                                            VMXReadVmcs64(idxField, pVal)                  \
     78                                                          : VMXReadVmcs32(idxField, (uint32_t *)pVal)
     79#  define VMXReadVmcsGstNByIdxVal(idxField, pVal)         VMXReadVmcsGstN(idxField, pVal)
     80# elif HC_ARCH_BITS == 32
     81#  define VMXReadVmcsHstN                                 VMXReadVmcs32
     82#  define VMXReadVmcsGstN(idxField, pVal)                 VMXReadCachedVmcsEx(pVCpu, idxField##_CACHE_IDX, pVal)
     83#  define VMXReadVmcsGstNByIdxVal(idxField, pVal)         VMXReadCachedVmcsEx(pVCpu, idxField, pVal)
     84# else /* HC_ARCH_BITS == 64 */
     85#  define VMXReadVmcsHstN                                 VMXReadVmcs64
     86#  define VMXReadVmcsGstN                                 VMXReadVmcs64
     87#  define VMXReadVmcsGstNByIdxVal                         VMXReadVmcs64
    8088# endif
    81 #endif
     89#endif  /* !VBOX_WITH_OLD_VTX_CODE */
    8290
    8391#endif /* IN_RING0 */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette