VirtualBox

Changeset 93905 in vbox for trunk


Ignore:
Timestamp:
Feb 24, 2022 9:13:26 AM (3 years ago)
Author:
vboxsync
Message:

VMM: More arm tweaks. bugref:9898

Location:
trunk/src/VBox/VMM
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Config.kmk

    r93419 r93905  
    7878 VMM_COMMON_DEFS += VBOX_WITH_LINEAR_HOST_PHYS_MEM
    7979endif
     80ifn1of ($(KBUILD_TARGET_ARCH), amd64 x86)
     81 VMM_COMMON_DEFS += VBOX_WITH_PGM_NEM_MODE
     82endif
    8083
    8184# VMM_COMMON_DEFS += VBOX_WITH_NS_ACCOUNTING_STATS
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r93901 r93905  
    31523152
    31533153    /*
    3154      * Override the shadow mode when NEM or nested paging is active.
     3154     * Override the shadow mode when NEM, IEM or nested paging is active.
    31553155     */
    3156     if (VM_IS_NEM_ENABLED(pVM))
    3157     {
     3156    if (!VM_IS_HM_ENABLED(pVM))
     3157    {
     3158        Assert(VM_IS_NEM_ENABLED(pVM) || VM_IS_EXEC_ENGINE_IEM(pVM));
    31583159        pVM->pgm.s.fNestedPaging = true;
    31593160        enmShadowMode = PGMMODE_NONE;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r93824 r93905  
    111111    PVMCC pVM = pVCpu->CTX_SUFF(pVM);
    112112
    113     Assert((HMIsNestedPagingActive(pVM) || VM_IS_NEM_ENABLED(pVM)) == pVM->pgm.s.fNestedPaging);
     113    Assert(HMIsNestedPagingActive(pVM));
    114114    Assert(!pVM->pgm.s.fNestedPaging);
    115115
     
    28662866
    28672867# if defined(PGM_WITH_LARGE_PAGES) && PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE
    2868     if (    BTH_IS_NP_ACTIVE(pVM)
    2869         && !VM_IS_NEM_ENABLED(pVM)) /** @todo NEM: Large page support. */
    2870     {
     2868    if (BTH_IS_NP_ACTIVE(pVM))
     2869    {
     2870        Assert(!VM_IS_NEM_ENABLED(pVM));
     2871
    28712872        /* Check if we allocated a big page before for this 2 MB range. */
    28722873        PPGMPAGE pPage;
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r93617 r93905  
    234234    PVMCC        pVM       = pVCpu->CTX_SUFF(pVM);
    235235
    236     Assert((HMIsNestedPagingActive(pVM) || VM_IS_NEM_ENABLED(pVM)) == pVM->pgm.s.fNestedPaging);
     236    Assert(HMIsNestedPagingActive(pVM));
    237237    Assert(pVM->pgm.s.fNestedPaging);
    238238    Assert(!pVCpu->pgm.s.pShwPageCR3R3);
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r93830 r93905  
    20462046     * Check that the CPU supports the minimum features we require.
    20472047     */
     2048#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
    20482049    if (!pVM->cpum.s.HostFeatures.fFxSaveRstor)
    20492050        return VMSetError(pVM, VERR_UNSUPPORTED_CPU, RT_SRC_POS, "Host CPU does not support the FXSAVE/FXRSTOR instruction.");
     
    20522053    if (!pVM->cpum.s.HostFeatures.fTsc)
    20532054        return VMSetError(pVM, VERR_UNSUPPORTED_CPU, RT_SRC_POS, "Host CPU does not support RDTSC.");
     2055#endif
    20542056
    20552057    /*
     
    20812083     * Initialize the host XSAVE/XRSTOR mask.
    20822084     */
     2085#if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)
    20832086    uint32_t cbMaxXState = pVM->cpum.s.HostFeatures.cbMaxExtendedState;
    20842087    cbMaxXState = RT_ALIGN(cbMaxXState, 128);
     
    20872090                       && pVM->cpum.s.HostFeatures.cbMaxExtendedState <= sizeof(pVM->apCpusR3[0]->cpum.s.Guest.XState)
    20882091                       , VERR_CPUM_IPE_2);
     2092#endif
    20892093
    20902094    for (VMCPUID i = 0; i < pVM->cCpus; i++)
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r93745 r93905  
    43544354    bool const fMayHaveXSave = pVM->cpum.s.HostFeatures.fXSaveRstor
    43554355                            && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor
    4356                             && (  !VM_IS_NEM_ENABLED(pVM)
    4357                                 ? fNestedPagingAndFullGuestExec
    4358                                 : NEMHCGetFeatures(pVM) & NEM_FEAT_F_XSAVE_XRSTOR);
     4356                            && (  VM_IS_NEM_ENABLED(pVM)
     4357                                ? NEMHCGetFeatures(pVM) & NEM_FEAT_F_XSAVE_XRSTOR
     4358                                : VM_IS_EXEC_ENGINE_IEM(pVM)
     4359                                ? false /** @todo IEM and XSAVE @bugref{9898} */
     4360                                : fNestedPagingAndFullGuestExec);
    43594361    uint64_t const fXStateHostMask = pVM->cpum.s.fXStateHostMask;
    43604362
     
    45574559    RT_ZERO(Config);
    45584560
    4559     bool const fNestedPagingAndFullGuestExec = VM_IS_NEM_ENABLED(pVM) || HMAreNestedPagingAndFullGuestExecEnabled(pVM);
     4561    bool const fNestedPagingAndFullGuestExec = VM_IS_NEM_ENABLED(pVM)
     4562                                            || VM_IS_EXEC_ENGINE_IEM(pVM)
     4563                                            || HMAreNestedPagingAndFullGuestExecEnabled(pVM);
    45604564    int rc = cpumR3CpuIdReadConfig(pVM, &Config, pCpumCfg, fNestedPagingAndFullGuestExec);
    45614565    AssertRCReturn(rc, rc);
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r93901 r93905  
    638638                    LogRel(("HM: HMR3Init: Falling back on IEM: %s\n", !fFallbackToNEM ? pszMsg : "NEM not available"));
    639639                    VM_SET_MAIN_EXECUTION_ENGINE(pVM, VM_EXEC_ENGINE_IEM);
     640#ifdef VBOX_WITH_PGM_NEM_MODE
     641                    PGMR3EnableNemMode(pVM);
     642#endif
    640643                }
    641644                else
     
    667670            LogRel(("HM: HMR3Init: Falling back on IEM%s\n", fUseNEMInstead ? ": NEM not available" : ""));
    668671            VM_SET_MAIN_EXECUTION_ENGINE(pVM, VM_EXEC_ENGINE_IEM);
     672#ifdef VBOX_WITH_PGM_NEM_MODE
     673            PGMR3EnableNemMode(pVM);
     674#endif
    669675        }
    670676
  • trunk/src/VBox/VMM/VMMR3/NEMR3.cpp

    r93788 r93905  
    451451}
    452452
    453 
    454453#ifndef VBOX_WITH_NATIVE_NEM
     454
    455455VMMR3_INT_DECL(void) NEMR3NotifySetA20(PVMCPU pVCpu, bool fEnabled)
    456456{
    457457    RT_NOREF(pVCpu, fEnabled);
    458458}
    459 #endif
    460 
     459
     460# ifdef VBOX_WITH_PGM_NEM_MODE
     461
     462VMMR3_INT_DECL(bool) NEMR3IsMmio2DirtyPageTrackingSupported(PVM pVM)
     463{
     464    RT_NOREF(pVM);
     465    return false;
     466}
     467
     468
     469VMMR3_INT_DECL(int)  NEMR3PhysMmio2QueryAndResetDirtyBitmap(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, uint32_t uNemRange,
     470                                                            void *pvBitmap, size_t cbBitmap)
     471{
     472    RT_NOREF(pVM, GCPhys, cb, uNemRange, pvBitmap, cbBitmap);
     473    AssertFailed();
     474    return VERR_INTERNAL_ERROR_2;
     475}
     476
     477
     478VMMR3_INT_DECL(int)  NEMR3NotifyPhysMmioExMapEarly(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, uint32_t fFlags,
     479                                                   void *pvRam, void *pvMmio2, uint8_t *pu2State, uint32_t *puNemRange)
     480{
     481    RT_NOREF(pVM, GCPhys, cb, fFlags, pvRam, pvMmio2, pu2State, puNemRange);
     482    AssertFailed();
     483    return VERR_INTERNAL_ERROR_2;
     484}
     485
     486# endif /* VBOX_WITH_PGM_NEM_MODE */
     487#endif /* !VBOX_WITH_NATIVE_NEM */
    461488
    462489/**
  • trunk/src/VBox/VMM/VMMR3/PGM.cpp

    r93824 r93905  
    11351135        case SUPPAGINGMODE_PAE_NX:
    11361136        case SUPPAGINGMODE_PAE_GLOBAL_NX:
    1137             break;
    11381137
    11391138        case SUPPAGINGMODE_AMD64:
     
    11481147            }
    11491148            break;
     1149#if !defined(RT_ARCH_AMD64) && !defined(RT_ARCH_X86)
     1150        case SUPPAGINGMODE_INVALID:
     1151            pVM->pgm.s.enmHostMode = SUPPAGINGMODE_AMD64_GLOBAL_NX;
     1152            break;
     1153#endif
    11501154        default:
    11511155            AssertMsgFailed(("Host mode %d is not supported\n", pVM->pgm.s.enmHostMode));
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r93650 r93905  
    14981498    if (pVM->pgm.s.fNemMode)
    14991499    {
    1500         Assert(VM_IS_NEM_ENABLED(pVM));
    1501         uint32_t const  fNemNotify = (pvMmio2 ? NEM_NOTIFY_PHYS_MMIO_EX_F_MMIO2 : 0) | NEM_NOTIFY_PHYS_MMIO_EX_F_REPLACE;
    1502         uint8_t         u2State    = 0; /* (We don't support UINT8_MAX here.) */
    1503         int rc = NEMR3NotifyPhysMmioExMapEarly(pVM, GCPhys, GCPhysLast - GCPhys + 1, fNemNotify,
    1504                                                pRam->pvR3 ? (uint8_t *)pRam->pvR3 + GCPhys - pRam->GCPhys : NULL,
    1505                                                pvMmio2, &u2State, NULL /*puNemRange*/);
    1506         AssertLogRelRCReturn(rc, rc);
     1500        Assert(VM_IS_NEM_ENABLED(pVM) || VM_IS_EXEC_ENGINE_IEM(pVM));
     1501        uint8_t u2State = 0; /* (We don't support UINT8_MAX here.) */
     1502        if (VM_IS_NEM_ENABLED(pVM))
     1503        {
     1504            uint32_t const  fNemNotify = (pvMmio2 ? NEM_NOTIFY_PHYS_MMIO_EX_F_MMIO2 : 0) | NEM_NOTIFY_PHYS_MMIO_EX_F_REPLACE;
     1505            int rc = NEMR3NotifyPhysMmioExMapEarly(pVM, GCPhys, GCPhysLast - GCPhys + 1, fNemNotify,
     1506                                                   pRam->pvR3 ? (uint8_t *)pRam->pvR3 + GCPhys - pRam->GCPhys : NULL,
     1507                                                   pvMmio2, &u2State, NULL /*puNemRange*/);
     1508            AssertLogRelRCReturn(rc, rc);
     1509        }
    15071510
    15081511        /* Iterate the pages. */
     
    15111514        while (cPagesLeft-- > 0)
    15121515        {
    1513             rc = pgmPhysFreePage(pVM, NULL, NULL, pPageDst, GCPhys, PGMPAGETYPE_MMIO);
     1516            int rc = pgmPhysFreePage(pVM, NULL, NULL, pPageDst, GCPhys, PGMPAGETYPE_MMIO);
    15141517            AssertLogRelRCReturn(rc, rc); /* We're done for if this goes wrong. */
    15151518
     
    15201523            pPageDst++;
    15211524        }
    1522         return rc;
     1525        return VINF_SUCCESS;
    15231526    }
    15241527#else  /* !VBOX_WITH_PGM_NEM_MODE */
     
    30513054#ifdef VBOX_WITH_PGM_NEM_MODE
    30523055            if (PGM_IS_IN_NEM_MODE(pVM))
    3053             {
    3054                 for (uint32_t i = 0; i < cHostPages; i++)
    3055                 {
    3056                     paPages[i].Phys       = UINT64_C(0x0000fffffffff000);
    3057                     paPages[i].uReserved = 0;
    3058                 }
    30593056                rc = SUPR3PageAlloc(cHostPages, pVM->pgm.s.fUseLargePages ? SUP_PAGE_ALLOC_F_LARGE_PAGES : 0, &pvPages);
    3060             }
    30613057            else
    30623058#endif
     
    30933089
    30943090                        uint32_t iDstPage = pCur->RamRange.cb >> GUEST_PAGE_SHIFT;
    3095                         while (iDstPage-- > 0)
     3091#ifdef VBOX_WITH_PGM_NEM_MODE
     3092                        if (PGM_IS_IN_NEM_MODE(pVM))
     3093                            while (iDstPage-- > 0)
     3094                                PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage], UINT64_C(0x0000ffffffff0000),
     3095                                              PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage),
     3096                                              PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED);
     3097                        else
     3098#endif
    30963099                        {
    3097                             PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage],
    3098                                           paPages[iDstPage + iSrcPage].Phys,
    3099                                           PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage),
    3100                                           PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED);
     3100                            AssertRelease(HOST_PAGE_SHIFT == GUEST_PAGE_SHIFT);
     3101                            while (iDstPage-- > 0)
     3102                                PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage], paPages[iDstPage + iSrcPage].Phys,
     3103                                              PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage),
     3104                                              PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED);
    31013105                        }
    31023106
  • trunk/src/VBox/VMM/include/NEMInternal.h

    r93831 r93905  
    4444 */
    4545
    46 #if defined(VBOX_WITH_PGM_NEM_MODE) && !defined(VBOX_WITH_NATIVE_NEM)
     46#if defined(VBOX_WITH_PGM_NEM_MODE) && !defined(VBOX_WITH_NATIVE_NEM) && !defined(RT_ARCH_ARM64)
    4747# error "VBOX_WITH_PGM_NEM_MODE requires VBOX_WITH_NATIVE_NEM to be defined"
    4848#endif
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r93824 r93905  
    719719    do { \
    720720        RTHCPHYS SetHCPhysTmp = (a_HCPhys); \
    721         AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
     721        AssertFatalMsg(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000)), ("%RHp\n", SetHCPhysTmp)); \
    722722        (a_pPage)->au64[0]           = SetHCPhysTmp; \
    723723        (a_pPage)->au64[1]           = 0; \
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r93718 r93905  
    439439
    440440#undef AssertFatal
    441 #define AssertFatal(expr) do { } while (0)
     441#define AssertFatal(expr)           do { } while (0)
     442#undef AssertFatalMsg
     443#define AssertFatalMsg(expr, msg)   do { } while (0)
    442444#undef Assert
    443 #define Assert(expr)      do { } while (0)
     445#define Assert(expr)                do { } while (0)
    444446
    445447    PGM_PAGE_CLEAR(&Page);
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