Changeset 74100 in vbox
- Timestamp:
- Sep 6, 2018 3:11:02 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 124865
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpum.h
r74054 r74100 1999 1999 VMMDECL(uint32_t) CPUMGetGuestMxCsrMask(PVM pVM); 2000 2000 VMMDECL(uint64_t) CPUMGetGuestScalableBusFrequency(PVM pVM); 2001 VMMDECL(uint64_t) CPUMGetGuestEferMsrValidMask(PVM pVM); 2001 2002 VMMDECL(int) CPUMQueryValidatedGuestEfer(PVM pVM, uint64_t uCr0, uint64_t uOldEfer, uint64_t uNewEfer, 2002 2003 uint64_t *puValidEfer); -
trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp
r74054 r74100 6619 6619 VMMDECL(int) CPUMQueryValidatedGuestEfer(PVM pVM, uint64_t uCr0, uint64_t uOldEfer, uint64_t uNewEfer, uint64_t *puValidEfer) 6620 6620 { 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 */ 6664 VMMDECL(uint64_t) CPUMGetGuestEferMsrValidMask(PVM pVM) 6665 { 6621 6666 uint32_t const fExtFeatures = pVM->cpum.s.aGuestCpuIdPatmExt[0].uEax >= 0x80000001 6622 6667 ? pVM->cpum.s.aGuestCpuIdPatmExt[1].uEdx … … 6637 6682 fMask |= MSR_K6_EFER_SVME; 6638 6683 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); 6666 6685 } 6667 6686
Note:
See TracChangeset
for help on using the changeset viewer.