VirtualBox

Changeset 220 in vbox


Ignore:
Timestamp:
Jan 22, 2007 12:38:21 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
17712
Message:

32-bit kernel doesn't mean 32-bit cpu - I really hope this doesn't break anything... Fixed SUPR0MemLock when using the new API.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c

    r1 r220  
    5353#undef MSR_K6_EFER_NXE
    5454#define MSR_K6_EFER_NXE                     BIT(11)
     55#undef MSR_K6_EFER_LMA
     56#define  MSR_K6_EFER_LMA                    BIT(10)
    5557#undef X86_CR4_PGE
    5658#define X86_CR4_PGE                         BIT(7)
    5759#undef X86_CR4_PAE
    5860#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
    5964
    6065/** The frequency by which we recalculate the u32UpdateHz and
     
    17041709    if (RT_SUCCESS(rc))
    17051710    {
    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);
    17071725        if (RT_FAILURE(rc))
    17081726        {
     
    36543672    {
    36553673        RTUINTREG cr4 = ASMGetCR4();
    3656         uint32_t fNXE = 0;
     3674        uint32_t fNXEPlusLMA = 0;
    36573675        if (cr4 & X86_CR4_PAE)
    36583676        {
    36593677            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))
    36613679            {
    36623680                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        {
    36713690            case 0:
    36723691                pOut->enmMode = SUPPAGINGMODE_32_BIT;
     
    36813700                break;
    36823701
    3683             case X86_CR4_PAE | 1:
     3702            case X86_CR4_PAE | BIT(0):
    36843703                pOut->enmMode = SUPPAGINGMODE_PAE_NX;
    36853704                break;
     
    36893708                break;
    36903709
    3691             case X86_CR4_PAE | X86_CR4_PGE | 1:
     3710            case X86_CR4_PAE | X86_CR4_PGE | BIT(0):
    36923711                pOut->enmMode = SUPPAGINGMODE_PAE_GLOBAL;
    36933712                break;
    3694 #else /* __AMD64__ */
    3695             case X86_CR4_PAE:
     3713
     3714            case BIT(1) | X86_CR4_PAE:
    36963715                pOut->enmMode = SUPPAGINGMODE_AMD64;
    36973716                break;
    36983717
    3699             case X86_CR4_PAE | 1:
     3718            case BIT(1) | X86_CR4_PAE | BIT(0):
    37003719                pOut->enmMode = SUPPAGINGMODE_AMD64_NX;
    37013720                break;
    37023721
    3703             case X86_CR4_PAE | X86_CR4_PGE:
     3722            case BIT(1) | X86_CR4_PAE | X86_CR4_PGE:
    37043723                pOut->enmMode = SUPPAGINGMODE_AMD64_GLOBAL;
    37053724                break;
    37063725
    3707             case X86_CR4_PAE | X86_CR4_PGE | 1:
     3726            case BIT(1) | X86_CR4_PAE | X86_CR4_PGE | BIT(0):
    37083727                pOut->enmMode = SUPPAGINGMODE_AMD64_GLOBAL_NX;
    37093728                break;
    3710 #endif /* __AMD64__ */
    37113729
    37123730            default:
    3713                 AssertMsgFailed(("Cannot happen! cr4=%#x fNXE=%d\n", cr4, fNXE));
     3731                AssertMsgFailed(("Cannot happen! cr4=%#x fNXEPlusLMA=%d\n", cr4, fNXEPlusLMA));
    37143732                pOut->enmMode = SUPPAGINGMODE_INVALID;
    37153733                break;
Note: See TracChangeset for help on using the changeset viewer.

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