Changeset 220 in vbox
- Timestamp:
- Jan 22, 2007 12:38:21 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 17712
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c
r1 r220 53 53 #undef MSR_K6_EFER_NXE 54 54 #define MSR_K6_EFER_NXE BIT(11) 55 #undef MSR_K6_EFER_LMA 56 #define MSR_K6_EFER_LMA BIT(10) 55 57 #undef X86_CR4_PGE 56 58 #define X86_CR4_PGE BIT(7) 57 59 #undef X86_CR4_PAE 58 60 #define X86_CR4_PAE BIT(5) 61 #undef X86_CPUID_AMD_FEATURE_EDX_LONG_MODE 62 #define X86_CPUID_AMD_FEATURE_EDX_LONG_MODE BIT(29) 63 59 64 60 65 /** The frequency by which we recalculate the u32UpdateHz and … … 1704 1709 if (RT_SUCCESS(rc)) 1705 1710 { 1706 rc = supdrvMemAdd(&Mem, pSession); 1711 unsigned iPage = cb >> PAGE_SHIFT; 1712 while (iPage-- > 0) 1713 { 1714 paPages[iPage].uReserved = 0; 1715 paPages[iPage].Phys = RTR0MemObjGetPagePhysAddr(Mem.MemObj, iPage); 1716 if (RT_UNLIKELY(paPages[iPage].Phys == NIL_RTCCPHYS)) 1717 { 1718 AssertMsgFailed(("iPage=%d\n", iPage)); 1719 rc = VERR_INTERNAL_ERROR; 1720 break; 1721 } 1722 } 1723 if (RT_SUCCESS(rc)) 1724 rc = supdrvMemAdd(&Mem, pSession); 1707 1725 if (RT_FAILURE(rc)) 1708 1726 { … … 3654 3672 { 3655 3673 RTUINTREG cr4 = ASMGetCR4(); 3656 uint32_t fNXE = 0;3674 uint32_t fNXEPlusLMA = 0; 3657 3675 if (cr4 & X86_CR4_PAE) 3658 3676 { 3659 3677 uint32_t fAmdFeatures = ASMCpuId_EDX(0x80000001); 3660 if (fAmdFeatures & X86_CPUID_AMD_FEATURE_EDX_NX)3678 if (fAmdFeatures & (X86_CPUID_AMD_FEATURE_EDX_NX | X86_CPUID_AMD_FEATURE_EDX_LONG_MODE)) 3661 3679 { 3662 3680 uint64_t efer = ASMRdMsr(MSR_K6_EFER); 3663 if (efer & MSR_K6_EFER_NXE) 3664 fNXE = 1; 3665 } 3666 } 3667 3668 switch ((cr4 & (X86_CR4_PAE | X86_CR4_PGE)) | fNXE) 3669 { 3670 #ifndef __AMD64__ 3681 if ((fAmdFeatures & X86_CPUID_AMD_FEATURE_EDX_NX) && (efer & MSR_K6_EFER_NXE)) 3682 fNXEPlusLMA |= BIT(0); 3683 if ((fAmdFeatures & X86_CPUID_AMD_FEATURE_EDX_LONG_MODE) && (efer & MSR_K6_EFER_LMA)) 3684 fNXEPlusLMA |= BIT(1); 3685 } 3686 } 3687 3688 switch ((cr4 & (X86_CR4_PAE | X86_CR4_PGE)) | fNXEPlusLMA) 3689 { 3671 3690 case 0: 3672 3691 pOut->enmMode = SUPPAGINGMODE_32_BIT; … … 3681 3700 break; 3682 3701 3683 case X86_CR4_PAE | 1:3702 case X86_CR4_PAE | BIT(0): 3684 3703 pOut->enmMode = SUPPAGINGMODE_PAE_NX; 3685 3704 break; … … 3689 3708 break; 3690 3709 3691 case X86_CR4_PAE | X86_CR4_PGE | 1:3710 case X86_CR4_PAE | X86_CR4_PGE | BIT(0): 3692 3711 pOut->enmMode = SUPPAGINGMODE_PAE_GLOBAL; 3693 3712 break; 3694 #else /* __AMD64__ */ 3695 case X86_CR4_PAE:3713 3714 case BIT(1) | X86_CR4_PAE: 3696 3715 pOut->enmMode = SUPPAGINGMODE_AMD64; 3697 3716 break; 3698 3717 3699 case X86_CR4_PAE | 1:3718 case BIT(1) | X86_CR4_PAE | BIT(0): 3700 3719 pOut->enmMode = SUPPAGINGMODE_AMD64_NX; 3701 3720 break; 3702 3721 3703 case X86_CR4_PAE | X86_CR4_PGE:3722 case BIT(1) | X86_CR4_PAE | X86_CR4_PGE: 3704 3723 pOut->enmMode = SUPPAGINGMODE_AMD64_GLOBAL; 3705 3724 break; 3706 3725 3707 case X86_CR4_PAE | X86_CR4_PGE | 1:3726 case BIT(1) | X86_CR4_PAE | X86_CR4_PGE | BIT(0): 3708 3727 pOut->enmMode = SUPPAGINGMODE_AMD64_GLOBAL_NX; 3709 3728 break; 3710 #endif /* __AMD64__ */3711 3729 3712 3730 default: 3713 AssertMsgFailed(("Cannot happen! cr4=%#x fNXE =%d\n", cr4, fNXE));3731 AssertMsgFailed(("Cannot happen! cr4=%#x fNXEPlusLMA=%d\n", cr4, fNXEPlusLMA)); 3714 3732 pOut->enmMode = SUPPAGINGMODE_INVALID; 3715 3733 break;
Note:
See TracChangeset
for help on using the changeset viewer.