VirtualBox

Changeset 74100 in vbox


Ignore:
Timestamp:
Sep 6, 2018 3:11:02 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
124865
Message:

VMM/CPUM: Nested VMX: bugref:9180 Added a separate function for obtaining the valid guest EFER mask (required for
upcoming VMX entry checks), adjusted CPUMQueryValidatedGuestEfer() accordingly.

Location:
trunk
Files:
2 edited

Legend:

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

    r74054 r74100  
    19991999VMMDECL(uint32_t)       CPUMGetGuestMxCsrMask(PVM pVM);
    20002000VMMDECL(uint64_t)       CPUMGetGuestScalableBusFrequency(PVM pVM);
     2001VMMDECL(uint64_t)       CPUMGetGuestEferMsrValidMask(PVM pVM);
    20012002VMMDECL(int)            CPUMQueryValidatedGuestEfer(PVM pVM, uint64_t uCr0, uint64_t uOldEfer, uint64_t uNewEfer,
    20022003                                                    uint64_t *puValidEfer);
  • trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp

    r74054 r74100  
    66196619VMMDECL(int) CPUMQueryValidatedGuestEfer(PVM pVM, uint64_t uCr0, uint64_t uOldEfer, uint64_t uNewEfer, uint64_t *puValidEfer)
    66206620{
     6621    /* #GP(0) If anything outside the allowed bits is set. */
     6622    uint64_t fMask = CPUMGetGuestEferMsrValidMask(pVM);
     6623    if (uNewEfer & ~fMask)
     6624    {
     6625        Log(("CPUM: Settings disallowed EFER bit. uNewEfer=%#RX64 fAllowed=%#RX64 -> #GP(0)\n", uNewEfer, fMask));
     6626        return VERR_CPUM_RAISE_GP_0;
     6627    }
     6628
     6629    /* Check for illegal MSR_K6_EFER_LME transitions: not allowed to change LME if
     6630       paging is enabled. (AMD Arch. Programmer's Manual Volume 2: Table 14-5) */
     6631    if (   (uOldEfer & MSR_K6_EFER_LME) != (uNewEfer & MSR_K6_EFER_LME)
     6632        && (uCr0 & X86_CR0_PG))
     6633    {
     6634        Log(("CPUM: Illegal MSR_K6_EFER_LME change: paging is enabled!!\n"));
     6635        return VERR_CPUM_RAISE_GP_0;
     6636    }
     6637
     6638    /* There are a few more: e.g. MSR_K6_EFER_LMSLE. */
     6639    AssertMsg(!(uNewEfer & ~(  MSR_K6_EFER_NXE
     6640                             | MSR_K6_EFER_LME
     6641                             | MSR_K6_EFER_LMA /* ignored anyway */
     6642                             | MSR_K6_EFER_SCE
     6643                             | MSR_K6_EFER_FFXSR
     6644                             | MSR_K6_EFER_SVME)),
     6645              ("Unexpected value %#RX64\n", uNewEfer));
     6646
     6647    /* Ignore EFER.LMA, it's updated when setting CR0. */
     6648    fMask &= ~MSR_K6_EFER_LMA;
     6649
     6650    *puValidEfer = (uOldEfer & ~fMask) | (uNewEfer & fMask);
     6651    return VINF_SUCCESS;
     6652}
     6653
     6654
     6655/**
     6656 * Gets the mask of valid EFER bits depending on supported guest-CPU features.
     6657 *
     6658 * @returns Mask of valid EFER bits.
     6659 * @param   pVM     The cross context VM structure.
     6660 *
     6661 * @remarks EFER.LMA is included as part of the valid mask. It's not invalid but
     6662 *          rather a read-only bit.
     6663 */
     6664VMMDECL(uint64_t) CPUMGetGuestEferMsrValidMask(PVM pVM)
     6665{
    66216666    uint32_t const  fExtFeatures = pVM->cpum.s.aGuestCpuIdPatmExt[0].uEax >= 0x80000001
    66226667                                 ? pVM->cpum.s.aGuestCpuIdPatmExt[1].uEdx
     
    66376682        fMask |= MSR_K6_EFER_SVME;
    66386683
    6639     /* #GP(0) If anything outside the allowed bits is set. */
    6640     if (uNewEfer & ~(fIgnoreMask | fMask))
    6641     {
    6642         Log(("CPUM: Settings disallowed EFER bit. uNewEfer=%#RX64 fAllowed=%#RX64 -> #GP(0)\n", uNewEfer, fMask));
    6643         return VERR_CPUM_RAISE_GP_0;
    6644     }
    6645 
    6646     /* Check for illegal MSR_K6_EFER_LME transitions: not allowed to change LME if
    6647        paging is enabled. (AMD Arch. Programmer's Manual Volume 2: Table 14-5) */
    6648     if (   (uOldEfer & MSR_K6_EFER_LME) != (uNewEfer & fMask & MSR_K6_EFER_LME)
    6649         && (uCr0 & X86_CR0_PG))
    6650     {
    6651         Log(("CPUM: Illegal MSR_K6_EFER_LME change: paging is enabled!!\n"));
    6652         return VERR_CPUM_RAISE_GP_0;
    6653     }
    6654 
    6655     /* There are a few more: e.g. MSR_K6_EFER_LMSLE */
    6656     AssertMsg(!(uNewEfer & ~(  MSR_K6_EFER_NXE
    6657                              | MSR_K6_EFER_LME
    6658                              | MSR_K6_EFER_LMA /* ignored anyway */
    6659                              | MSR_K6_EFER_SCE
    6660                              | MSR_K6_EFER_FFXSR
    6661                              | MSR_K6_EFER_SVME)),
    6662               ("Unexpected value %#RX64\n", uNewEfer));
    6663 
    6664     *puValidEfer = (uOldEfer & ~fMask) | (uNewEfer & fMask);
    6665     return VINF_SUCCESS;
     6684    return (fIgnoreMask | fMask);
    66666685}
    66676686
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