VirtualBox

Changeset 74523 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Sep 28, 2018 12:43:19 PM (6 years ago)
Author:
vboxsync
Message:

VMM/IEM: Nested VMX: bugref:9180 More robust check for CR0/CR4 fixed0 bits (allows the fixed0 bits to be 0).
Also added missing checks for VMXON for checking fixed1 bits in CR0 and CR4 as well.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r74457 r74523  
    5656    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Cpl                        , "Cpl"                       ),
    5757    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Cr0Fixed0                  , "Cr0Fixed0"                 ),
     58    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Cr0Fixed1                  , "Cr0Fixed1"                 ),
    5859    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Cr4Fixed0                  , "Cr4Fixed0"                 ),
     60    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Cr4Fixed1                  , "Cr4Fixed1"                 ),
    5961    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_Intercept                  , "Intercept"                 ),
    6062    VMXV_DIAG_DESC(kVmxVDiag_Vmxon_LongModeCS                 , "LongModeCS"                ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r74520 r74523  
    27472747        if (fUnrestrictedGuest)
    27482748            u64Cr0Fixed0 &= ~(X86_CR0_PE | X86_CR0_PG);
    2749         if (~pVmcs->u64GuestCr0.u & u64Cr0Fixed0)
     2749        if ((pVmcs->u64GuestCr0.u & u64Cr0Fixed0) != u64Cr0Fixed0)
    27502750            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_GuestCr0Fixed0);
    27512751
     
    27662766        /* CR4 MB1 bits. */
    27672767        uint64_t const u64Cr4Fixed0 = CPUMGetGuestIa32VmxCr4Fixed0(pVCpu);
    2768         if (~pVmcs->u64GuestCr4.u & u64Cr4Fixed0)
     2768        if ((pVmcs->u64GuestCr4.u & u64Cr4Fixed0) != u64Cr4Fixed0)
    27692769            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_GuestCr4Fixed0);
    27702770
     
    37333733        /* CR0 MB1 bits. */
    37343734        uint64_t const u64Cr0Fixed0 = CPUMGetGuestIa32VmxCr0Fixed0(pVCpu);
    3735         if (~pVmcs->u64HostCr0.u & u64Cr0Fixed0)
     3735        if ((pVmcs->u64HostCr0.u & u64Cr0Fixed0) != u64Cr0Fixed0)
    37363736            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_HostCr0Fixed0);
    37373737
     
    37463746        /* CR4 MB1 bits. */
    37473747        uint64_t const u64Cr4Fixed0 = CPUMGetGuestIa32VmxCr4Fixed0(pVCpu);
    3748         if (~pVmcs->u64HostCr4.u & u64Cr4Fixed0)
     3748        if ((pVmcs->u64HostCr4.u & u64Cr4Fixed0) != u64Cr4Fixed0)
    37493749            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_HostCr4Fixed0);
    37503750
     
    55925592        }
    55935593
    5594         /* CR0 MB1 bits. */
    5595         uint64_t const uCr0Fixed0 = CPUMGetGuestIa32VmxCr0Fixed0(pVCpu);
    5596         if (~pVCpu->cpum.GstCtx.cr0 & uCr0Fixed0)
    5597         {
    5598             Log(("vmxon: CR0 fixed0 bits cleared -> #GP(0)\n"));
    5599             pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr0Fixed0;
    5600             return iemRaiseGeneralProtectionFault0(pVCpu);
    5601         }
    5602 
    5603         /* CR4 MB1 bits. */
    5604         uint64_t const uCr4Fixed0 = CPUMGetGuestIa32VmxCr4Fixed0(pVCpu);
    5605         if (~pVCpu->cpum.GstCtx.cr4 & uCr4Fixed0)
    5606         {
    5607             Log(("vmxon: CR4 fixed0 bits cleared -> #GP(0)\n"));
    5608             pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr4Fixed0;
    5609             return iemRaiseGeneralProtectionFault0(pVCpu);
     5594        /* CR0. */
     5595        {
     5596            /* CR0 MB1 bits. */
     5597            uint64_t const uCr0Fixed0 = CPUMGetGuestIa32VmxCr0Fixed0(pVCpu);
     5598            if ((pVCpu->cpum.GstCtx.cr0 & uCr0Fixed0) != uCr0Fixed0)
     5599            {
     5600                Log(("vmxon: CR0 fixed0 bits cleared -> #GP(0)\n"));
     5601                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr0Fixed0;
     5602                return iemRaiseGeneralProtectionFault0(pVCpu);
     5603            }
     5604
     5605            /* CR0 MBZ bits. */
     5606            uint64_t const uCr0Fixed1 = CPUMGetGuestIa32VmxCr0Fixed1(pVCpu);
     5607            if (pVCpu->cpum.GstCtx.cr0 & ~uCr0Fixed1)
     5608            {
     5609                Log(("vmxon: CR0 fixed1 bits set -> #GP(0)\n"));
     5610                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr0Fixed1;
     5611                return iemRaiseGeneralProtectionFault0(pVCpu);
     5612            }
     5613        }
     5614
     5615        /* CR4. */
     5616        {
     5617            /* CR4 MB1 bits. */
     5618            uint64_t const uCr4Fixed0 = CPUMGetGuestIa32VmxCr4Fixed0(pVCpu);
     5619            if ((pVCpu->cpum.GstCtx.cr4 & uCr4Fixed0) != uCr4Fixed0)
     5620            {
     5621                Log(("vmxon: CR4 fixed0 bits cleared -> #GP(0)\n"));
     5622                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr4Fixed0;
     5623                return iemRaiseGeneralProtectionFault0(pVCpu);
     5624            }
     5625
     5626            /* CR4 MBZ bits. */
     5627            uint64_t const uCr4Fixed1 = CPUMGetGuestIa32VmxCr4Fixed1(pVCpu);
     5628            if (pVCpu->cpum.GstCtx.cr4 & ~uCr4Fixed1)
     5629            {
     5630                Log(("vmxon: CR4 fixed1 bits set -> #GP(0)\n"));
     5631                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = kVmxVDiag_Vmxon_Cr4Fixed1;
     5632                return iemRaiseGeneralProtectionFault0(pVCpu);
     5633            }
    56105634        }
    56115635
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