VirtualBox

Ignore:
Timestamp:
Feb 23, 2010 1:14:16 PM (15 years ago)
Author:
vboxsync
Message:

Deal with missing PDEs in SyncPage for SMP guests.
Deal with big PDEs in SyncPage for SMP guests (nested paging only).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r26685 r26700  
    16151615# endif
    16161616    SHWPDE          PdeDst   = *pPdeDst;
     1617
     1618    /* In the guest SMP case we could have blocked while another VCPU reused this page table. */
    16171619    if (!PdeDst.n.u1Present)
    16181620    {
     
    19201922    PdeDst = pPDDst->a[iPDDst];
    19211923# endif
    1922     AssertMsg(PdeDst.n.u1Present, ("%#llx\n", (uint64_t)PdeDst.u));
     1924    /* In the guest SMP case we could have blocked while another VCPU reused this page table. */
     1925    if (!PdeDst.n.u1Present)
     1926    {
     1927        AssertMsg(pVM->cCpus > 1, ("Unexpected missing PDE %RX64\n", (uint64_t)PdeDst.u));
     1928        Log(("CPU%d: SyncPage: Pde at %RGv changed behind our back!\n", GCPtrPage));
     1929        return VINF_SUCCESS;    /* force the instruction to be executed again. */
     1930    }
     1931
    19231932    PPGMPOOLPAGE  pShwPage = pgmPoolGetPage(pPool, PdeDst.u & SHW_PDE_PG_MASK);
    19241933    PSHWPT        pPTDst   = (PSHWPT)PGMPOOL_PAGE_2_PTR(pVM, pShwPage);
     1934
     1935    /* Can happen in the guest SMP case; other VCPU activated this PDE while we were blocking to handle the page fault. */
     1936    if (PdeDst.n.u1Size)
     1937        return VINF_SUCCESS;
    19251938
    19261939    Assert(cPages == 1 || !(uErr & X86_TRAP_PF_P));
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