VirtualBox

Ignore:
Timestamp:
May 20, 2008 3:41:55 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
31036
Message:

Nested paging updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/PGMR0.cpp

    r8155 r8965  
    3030#include <iprt/assert.h>
    3131
     32__BEGIN_DECLS
     33#define PGM_BTH_NAME(name)          PGM_BTH_NAME_32BIT_PROT(name)
     34#include "PGMR0Bth.h"
     35
     36#define PGM_BTH_NAME(name)          PGM_BTH_NAME_PAE_PROT(name)
     37#include "PGMR0Bth.h"
     38/*
     39#define PGM_BTH_NAME(name)          PGM_BTH_NAME_AMD64_PROT(name)
     40#include "PGMR0Bth.h"
     41*/
     42__END_DECLS
    3243
    3344
     
    4556PGMR0DECL(int) PGMR0PhysAllocateHandyPages(PVM pVM)
    4657{
    47 
    4858    return VERR_NOT_IMPLEMENTED;
    4959}
    5060
    5161
     62/**
     63 * #PF Handler for nested paging.
     64 *
     65 * @returns VBox status code (appropriate for trap handling and GC return).
     66 * @param   pVM                 VM Handle.
     67 * @param   enmShwPagingMode    Paging mode for the nested page tables
     68 * @param   uErr                The trap error code.
     69 * @param   pRegFrame           Trap register frame.
     70 * @param   pvFault             The fault address.
     71 */
     72PGMR0DECL(int) PGMR0Trap0eHandlerNestedPaging(PVM pVM, PGMMODE enmShwPagingMode, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPHYS pvFault)
     73{
     74    int rc;
     75
     76    LogFlow(("PGMTrap0eHandler: uErr=%#x pvFault=%VGp eip=%VGv\n", uErr, pvFault, pRegFrame->eip));
     77    STAM_PROFILE_START(&pVM->pgm.s.StatGCTrap0e, a);
     78    STAM_STATS({ pVM->pgm.s.CTXSUFF(pStatTrap0eAttribution) = NULL; } );
     79
     80    /* AMD uses the host's paging mode; Intel's version is on the todo list */
     81    Assert(enmShwPagingMode == PGMMODE_32_BIT || enmShwPagingMode == PGMMODE_PAE); // || enmShwPagingMode == PGMMODE_AMD64);
     82
     83#ifdef VBOX_WITH_STATISTICS
     84    /*
     85     * Error code stats.
     86     */
     87    if (uErr & X86_TRAP_PF_US)
     88    {
     89        if (!(uErr & X86_TRAP_PF_P))
     90        {
     91            if (uErr & X86_TRAP_PF_RW)
     92                STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSNotPresentWrite);
     93            else
     94                STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSNotPresentRead);
     95        }
     96        else if (uErr & X86_TRAP_PF_RW)
     97            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSWrite);
     98        else if (uErr & X86_TRAP_PF_RSVD)
     99            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSReserved);
     100        else if (uErr & X86_TRAP_PF_ID)
     101            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSNXE);
     102        else
     103            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eUSRead);
     104    }
     105    else
     106    {   /* Supervisor */
     107        if (!(uErr & X86_TRAP_PF_P))
     108        {
     109            if (uErr & X86_TRAP_PF_RW)
     110                STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eSVNotPresentWrite);
     111            else
     112                STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eSVNotPresentRead);
     113        }
     114        else if (uErr & X86_TRAP_PF_RW)
     115            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eSVWrite);
     116        else if (uErr & X86_TRAP_PF_ID)
     117            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eSNXE);
     118        else if (uErr & X86_TRAP_PF_RSVD)
     119            STAM_COUNTER_INC(&pVM->pgm.s.StatGCTrap0eSVReserved);
     120    }
     121#endif
     122
     123    /*
     124     * Call the worker.
     125     */
     126    switch(enmShwPagingMode)
     127    {
     128    case PGMMODE_32_BIT:
     129        rc = PGM_BTH_NAME_32BIT_PROT(Trap0eHandler)(pVM, uErr, pRegFrame, pvFault);
     130        break;
     131    case PGMMODE_PAE:
     132        rc = PGM_BTH_NAME_PAE_PROT(Trap0eHandler)(pVM, uErr, pRegFrame, pvFault);
     133        break;
     134        /*
     135    case PGMMODE_AMD64:
     136        rc = PGM_BTH_NAME_AMD64_PROT(Trap0eHandler)(pVM, uErr, pRegFrame, pvFault);
     137        break;
     138        */
     139    }
     140    if (rc == VINF_PGM_SYNCPAGE_MODIFIED_PDE)
     141        rc = VINF_SUCCESS;
     142    STAM_STATS({ if (!pVM->pgm.s.CTXSUFF(pStatTrap0eAttribution))
     143                    pVM->pgm.s.CTXSUFF(pStatTrap0eAttribution) = &pVM->pgm.s.StatTrap0eMisc; });
     144    STAM_PROFILE_STOP_EX(&pVM->pgm.s.StatGCTrap0e, pVM->pgm.s.CTXSUFF(pStatTrap0eAttribution), a);
     145    return rc;
     146}
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