VirtualBox

Changeset 38707 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Sep 9, 2011 2:10:18 PM (13 years ago)
Author:
vboxsync
Message:

VMM/VT-x: Fix for PAE guests running on 32-bit hosts or 64-bit hosts where VBoxInternal/PGM/MaxRing3Chunks is used.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r37452 r38707  
    16241624#endif
    16251625
    1626 /**
    1627  * Gets the specified page directory pointer table entry.
    1628  *
    1629  * @returns PDP entry
    1630  * @param   pVCpu       VMCPU handle.
    1631  * @param   iPdpt       PDPT index
    1632  */
    1633 VMMDECL(int)  PGMGstQueryPaePDPtr(PVMCPU pVCpu, unsigned iPdpt, PX86PDPE pPdpe)
    1634 {
    1635     Assert(iPdpt <= 3);
    1636     PX86PDPT pPdpt;
    1637     int rc = pgmGstGetPaePDPTPtrEx(pVCpu, &pPdpt);
    1638     if (RT_SUCCESS(rc))
    1639         *pPdpe = pPdpt->a[iPdpt & 3];
    1640     return rc;
     1626
     1627/**
     1628 * Gets the PAE PDPEs values cached by the CPU.
     1629 *
     1630 * @returns VBox status code.
     1631 * @param   pVCpu               The virtual CPU.
     1632 * @param   paPdpes             Where to return the four PDPEs.  The array
     1633 *                              pointed to must have 4 entries.
     1634 */
     1635VMM_INT_DECL(int) PGMGstGetPaePdpes(PVMCPU pVCpu, PX86PDPE paPdpes)
     1636{
     1637    Assert(pVCpu->pgm.s.enmShadowMode == PGMMODE_EPT);
     1638
     1639    paPdpes[0] = pVCpu->pgm.s.aGstPaePdpeRegs[0];
     1640    paPdpes[1] = pVCpu->pgm.s.aGstPaePdpeRegs[1];
     1641    paPdpes[2] = pVCpu->pgm.s.aGstPaePdpeRegs[2];
     1642    paPdpes[3] = pVCpu->pgm.s.aGstPaePdpeRegs[3];
     1643    return VINF_SUCCESS;
     1644}
     1645
     1646
     1647/**
     1648 * Sets the PAE PDPEs values cached by the CPU.
     1649 *
     1650 * @remarks This must be called *AFTER* PGMUpdateCR3.
     1651 *
     1652 * @returns VBox status code.
     1653 * @param   pVCpu               The virtual CPU.
     1654 * @param   paPdpes             The four PDPE values.  The array pointed to
     1655 *                              must have exactly 4 entries.
     1656 */
     1657VMM_INT_DECL(int) PGMGstUpdatePaePdpes(PVMCPU pVCpu, PCX86PDPE paPdpes)
     1658{
     1659    Assert(pVCpu->pgm.s.enmShadowMode == PGMMODE_EPT);
     1660
     1661    for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->pgm.s.aGstPaePdpeRegs); i++)
     1662    {
     1663        if (pVCpu->pgm.s.aGstPaePdpeRegs[i].u != paPdpes[i].u)
     1664        {
     1665            pVCpu->pgm.s.aGstPaePdpeRegs[i] = paPdpes[i];
     1666
     1667            /* Force lazy remapping if it changed in any way. */
     1668            pVCpu->pgm.s.apGstPaePDsR3[i]     = 0;
     1669#  ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     1670            pVCpu->pgm.s.apGstPaePDsR0[i]     = 0;
     1671#  endif
     1672            pVCpu->pgm.s.apGstPaePDsRC[i]     = 0;
     1673            pVCpu->pgm.s.aGCPhysGstPaePDs[i]  = NIL_RTGCPHYS;
     1674        }
     1675    }
     1676    return VINF_SUCCESS;
    16411677}
    16421678
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r38086 r38707  
    44594459            for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++, GCPtr += PAGE_SIZE)
    44604460            {
     4461                pVCpu->pgm.s.aGstPaePdpeRegs[i].u = pGuestPDPT->a[i].u;
    44614462                if (pGuestPDPT->a[i].n.u1Present)
    44624463                {
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