PGMAllMap.cpp revision 1999ae03c34840fa4d712fd2e020120b2cb7182a
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/* $Id$ */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/** @file
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * PGM - Page Manager and Monitor - All context code.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Copyright (C) 2006-2007 Oracle Corporation
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * This file is part of VirtualBox Open Source Edition (OSE), as
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * available from http://www.virtualbox.org. This file is free software;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * you can redistribute it and/or modify it under the terms of the GNU
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * General Public License (GPL) as published by the Free Software
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Foundation, in version 2 as it comes in the "COPYING" file of the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*******************************************************************************
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China* Header Files *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China*******************************************************************************/
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#define LOG_GROUP LOG_GROUP_PGM
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <VBox/vmm/pgm.h>
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du#include "PGMInternal.h"
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald#include <VBox/vmm/vm.h>
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald#include "PGMInline.h"
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles#include <VBox/err.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <iprt/asm-amd64-x86.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <iprt/assert.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Maps a range of physical pages at a given virtual address
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * in the guest context.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * The GC virtual address range must be within an existing mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status code.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param GCPtr Where to map the page(s). Must be page aligned.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param HCPhys Start of the range of physical pages. Must be page aligned.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param cbPages Number of bytes to map. Must be page aligned.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param fFlags Page flags (X86_PTE_*).
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(int) PGMMap(PVM pVM, RTGCUINTPTR GCPtr, RTHCPHYS HCPhys, uint32_t cbPages, unsigned fFlags)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(pVM->pgm.s.offVM, ("Bad init order\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Validate input.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(RT_ALIGN_T(GCPtr, PAGE_SIZE, RTGCUINTPTR) == GCPtr, ("Invalid alignment GCPtr=%#x\n", GCPtr));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(cbPages > 0 && RT_ALIGN_32(cbPages, PAGE_SIZE) == cbPages, ("Invalid cbPages=%#x\n", cbPages));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(!(fFlags & X86_PDE_PG_MASK), ("Invalid flags %#x\n", fFlags));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* hypervisor defaults */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!fFlags)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China fFlags = X86_PTE_P | X86_PTE_A | X86_PTE_D;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Find the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (pCur)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (GCPtr - pCur->GCPtr < pCur->cb)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (GCPtr + cbPages - 1 > pCur->GCPtrLast)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsgFailed(("Invalid range!!\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VERR_INVALID_PARAMETER;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Setup PTE.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China X86PTEPAE Pte;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Pte.u = fFlags | (HCPhys & X86_PTE_PAE_PG_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Update the page tables.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (;;)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China RTGCUINTPTR off = GCPtr - pCur->GCPtr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China const unsigned iPT = off >> X86_PD_SHIFT;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China const unsigned iPageNo = (off >> PAGE_SHIFT) & X86_PT_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* 32-bit */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur->aPTs[iPT].CTX_SUFF(pPT)->a[iPageNo].u = (uint32_t)Pte.u; /* ASSUMES HCPhys < 4GB and/or that we're never gonna do 32-bit on a PAE host! */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* pae */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMSHWPTEPAE_SET(pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPageNo / 512].a[iPageNo % 512], Pte.u);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* next */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cbPages -= PAGE_SIZE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!cbPages)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr += PAGE_SIZE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Pte.u += PAGE_SIZE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* next */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur = pCur->CTX_SUFF(pNext);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsgFailed(("GCPtr=%#x was not found in any mapping ranges!\n", GCPtr));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VERR_INVALID_PARAMETER;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Sets (replaces) the page flags for a range of pages in a mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param GCPtr Virtual address of the first page in the range.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param cb Size (in bytes) of the range to apply the modification to.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param fFlags Page flags X86_PTE_*, excluding the page mask of course.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(int) PGMMapSetPage(PVM pVM, RTGCPTR GCPtr, uint64_t cb, uint64_t fFlags)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return PGMMapModifyPage(pVM, GCPtr, cb, fFlags, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Modify page flags for a range of pages in a mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * The existing flags are ANDed with the fMask and ORed with the fFlags.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status code.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param GCPtr Virtual address of the first page in the range.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param cb Size (in bytes) of the range to apply the modification to.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param fFlags The OR mask - page flags X86_PTE_*, excluding the page mask of course.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param fMask The AND mask - page flags X86_PTE_*, excluding the page mask of course.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(int) PGMMapModifyPage(PVM pVM, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Validate input.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(!(fFlags & (X86_PTE_PAE_PG_MASK | X86_PTE_PAE_MBZ_MASK_NX)), ("fFlags=%#x\n", fFlags));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(cb);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Align the input.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cb += (RTGCUINTPTR)GCPtr & PAGE_OFFSET_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cb = RT_ALIGN_Z(cb, PAGE_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr = (RTGCPTR)((RTGCUINTPTR)GCPtr & PAGE_BASE_GC_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Find the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (pCur)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China RTGCUINTPTR off = (RTGCUINTPTR)GCPtr - (RTGCUINTPTR)pCur->GCPtr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (off < pCur->cb)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsgReturn(off + cb <= pCur->cb,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ("Invalid page range %#x LB%#x. mapping '%s' %#x to %#x\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr, cb, pCur->pszDesc, pCur->GCPtr, pCur->GCPtrLast),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China VERR_INVALID_PARAMETER);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Perform the requested operation.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (cb > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = off >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPTE = (off >> PAGE_SHIFT) & X86_PT_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (cb > 0 && iPTE < RT_ELEMENTS(pCur->aPTs[iPT].CTX_SUFF(pPT)->a))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* 32-Bit */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur->aPTs[iPT].CTX_SUFF(pPT)->a[iPTE].u &= fMask | X86_PTE_PG_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur->aPTs[iPT].CTX_SUFF(pPT)->a[iPTE].u |= fFlags & ~X86_PTE_PG_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* PAE */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMSHWPTEPAE pPtePae = &pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPTE / 512].a[iPTE % 512];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMSHWPTEPAE_SET(*pPtePae,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ( PGMSHWPTEPAE_GET_U(*pPtePae)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China & (fMask | X86_PTE_PAE_PG_MASK))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China | (fFlags & ~(X86_PTE_PAE_PG_MASK | X86_PTE_PAE_MBZ_MASK_NX)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* invalidate tls */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGM_INVL_PG(VMMGetCpu(pVM), (RTGCUINTPTR)pCur->GCPtr + off);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* next */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPTE++;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cb -= PAGE_SIZE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China off += PAGE_SIZE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* next */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur = pCur->CTX_SUFF(pNext);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles AssertMsgFailed(("Page range %#x LB%#x not found\n", GCPtr, cb));
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles return VERR_INVALID_PARAMETER;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get information about a page in a mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * This differs from PGMShwGetPage and PGMGstGetPage in that it only consults
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * the page table to calculate the flags.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VINF_SUCCESS, VERR_PAGE_NOT_PRESENT or VERR_NOT_FOUND.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param GCPtr The page address.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pfFlags Where to return the flags. Optional.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pHCPhys Where to return the address. Optional.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(int) PGMMapGetPage(PVM pVM, RTGCPTR GCPtr, uint64_t *pfFlags, PRTHCPHYS pHCPhys)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Find the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr &= PAGE_BASE_GC_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (pCur)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China RTGCUINTPTR off = (RTGCUINTPTR)GCPtr - (RTGCUINTPTR)pCur->GCPtr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (off < pCur->cb)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Dig out the information.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rc = VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = off >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPTE = (off >> PAGE_SHIFT) & X86_PT_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PCPGMSHWPTEPAE pPtePae = &pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPTE / 512].a[iPTE % 512];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (PGMSHWPTEPAE_IS_P(*pPtePae))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pfFlags)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *pfFlags = PGMSHWPTEPAE_GET_U(*pPtePae) & ~X86_PTE_PAE_PG_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pHCPhys)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *pHCPhys = PGMSHWPTEPAE_GET_HCPHYS(*pPtePae);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rc = VERR_PAGE_NOT_PRESENT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return rc;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* next */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur = pCur->CTX_SUFF(pNext);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VERR_NOT_FOUND;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef IN_RING0
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Sets all PDEs involved with the mapping in the shadow page table.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pMap Pointer to the mapping in question.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param iNewPDE The index of the 32-bit PDE corresponding to the base of the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinavoid pgmMapSetShadowPDEs(PVM pVM, PPGMMAPPING pMap, unsigned iNewPDE)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log4(("pgmMapSetShadowPDEs new pde %x (mappings enabled %d)\n", iNewPDE, pgmMapAreMappingsEnabled(pVM)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( !pgmMapAreMappingsEnabled(pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || pVM->cCpus > 1)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* This only applies to raw mode where we only support 1 VCPU. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = VMMGetCpu0(pVM);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!pVCpu->pgm.s.CTX_SUFF(pShwPageCR3))
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles return; /* too early */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMMODE enmShadowMode = PGMGetShadowMode(pVCpu);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles Assert(enmShadowMode <= PGMMODE_PAE_NX);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Insert the page tables into the shadow page directories.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned i = pMap->cPTs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iNewPDE += i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (i-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iNewPDE--;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch (enmShadowMode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_32_BIT:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PD pShw32BitPd = pgmShwGet32BitPDPtr(pVCpu);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada AssertFatal(pShw32BitPd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* Free any previous user, unless it's us. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert( (pShw32BitPd->a[iNewPDE].u & (X86_PDE_P | PGM_PDFLAGS_MAPPING)) != (X86_PDE_P | PGM_PDFLAGS_MAPPING)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || (pShw32BitPd->a[iNewPDE].u & X86_PDE_PG_MASK) == pMap->aPTs[i].HCPhysPT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pShw32BitPd->a[iNewPDE].n.u1Present
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && !(pShw32BitPd->a[iNewPDE].u & PGM_PDFLAGS_MAPPING))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmPoolFree(pVM, pShw32BitPd->a[iNewPDE].u & X86_PDE_PG_MASK, pVCpu->pgm.s.CTX_SUFF(pShwPageCR3)->idx, iNewPDE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Default mapping page directory flags are read/write and supervisor; individual page attributes determine the final flags. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShw32BitPd->a[iNewPDE].u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China | (uint32_t)pMap->aPTs[i].HCPhysPT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGM_DYNMAP_UNUSED_HINT_VM(pVM, pShw32BitPd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_PAE:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_PAE_NX:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China const uint32_t iPdPt = iNewPDE / 256;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPaePde = iNewPDE * 2 % 512;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PDPT pShwPdpt = pgmShwGetPaePDPTPtr(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPdpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get the shadow PD.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If no PD, sync it (PAE guest) or fake (not present or 32-bit guest).
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Note! The RW, US and A bits are reserved for PAE PDPTEs. Setting the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * accessed bit causes invalid VT-x guest state errors.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PDPAE pShwPaePd = pgmShwGetPaePDPtr(pVCpu, iPdPt << X86_PDPT_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!pShwPaePd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China X86PDPE GstPdpe;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (PGMGetGuestMode(pVCpu) < PGMMODE_PAE)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GstPdpe.u = X86_PDPE_P;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PDPE pGstPdpe = pgmGstGetPaePDPEPtr(pVCpu, iPdPt << X86_PDPT_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pGstPdpe)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GstPdpe = *pGstPdpe;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GstPdpe.u = X86_PDPE_P;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rc = pgmShwSyncPaePDPtr(pVCpu, iPdPt << X86_PDPT_SHIFT, GstPdpe.u, &pShwPaePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatalRC(rc);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPaePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Mark the page as locked; disallow flushing.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMPOOLPAGE pPoolPagePd = pgmPoolGetPage(pPool, pShwPdpt->a[iPdPt].u & X86_PDPE_PG_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pPoolPagePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!pgmPoolIsPageLocked(pPoolPagePd))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmPoolLockPage(pPool, pPoolPagePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifdef VBOX_STRICT
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else if (pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING)
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada Assert(PGMGetGuestMode(pVCpu) >= PGMMODE_PAE); /** @todo We may hit this during reset, will fix later. */
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada AssertFatalMsg( (pShwPaePd->a[iPaePde].u & X86_PDE_PAE_PG_MASK) == pMap->aPTs[i].HCPhysPaePT0
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada || !PGMMODE_WITH_PAGING(PGMGetGuestMode(pVCpu)),
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada ("%RX64 vs %RX64\n", pShwPaePd->a[iPaePde+1].u & X86_PDE_PAE_PG_MASK, pMap->aPTs[i].HCPhysPaePT0));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPaePd->a[iPaePde+1].u & PGM_PDFLAGS_MAPPING);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada AssertFatalMsg( (pShwPaePd->a[iPaePde+1].u & X86_PDE_PAE_PG_MASK) == pMap->aPTs[i].HCPhysPaePT1
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada || !PGMMODE_WITH_PAGING(PGMGetGuestMode(pVCpu)),
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada ("%RX64 vs %RX64\n", pShwPaePd->a[iPaePde+1].u & X86_PDE_PAE_PG_MASK, pMap->aPTs[i].HCPhysPaePT1));
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada#endif
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada /*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * Insert our first PT, freeing anything we might be replacing unless it's a mapping (i.e. us).
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert( (pShwPaePd->a[iPaePde].u & (X86_PDE_P | PGM_PDFLAGS_MAPPING)) != (X86_PDE_P | PGM_PDFLAGS_MAPPING)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || (pShwPaePd->a[iPaePde].u & X86_PDE_PAE_PG_MASK) == pMap->aPTs[i].HCPhysPaePT0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pShwPaePd->a[iPaePde].n.u1Present
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && !(pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(!(pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmPoolFree(pVM, pShwPaePd->a[iPaePde].u & X86_PDE_PAE_PG_MASK, pPoolPagePd->idx, iPaePde);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPaePd->a[iPaePde].u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China | pMap->aPTs[i].HCPhysPaePT0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* 2nd 2 MB PDE of the 4 MB region, same as above. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPaePde++;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(iPaePde < 512);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert( (pShwPaePd->a[iPaePde].u & (X86_PDE_P | PGM_PDFLAGS_MAPPING)) != (X86_PDE_P | PGM_PDFLAGS_MAPPING)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || (pShwPaePd->a[iPaePde].u & X86_PDE_PAE_PG_MASK) == pMap->aPTs[i].HCPhysPaePT1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pShwPaePd->a[iPaePde].n.u1Present
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && !(pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmPoolFree(pVM, pShwPaePd->a[iPaePde].u & X86_PDE_PG_MASK, pPoolPagePd->idx, iPaePde);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles pShwPaePd->a[iPaePde].u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China | pMap->aPTs[i].HCPhysPaePT1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Set the PGM_PDFLAGS_MAPPING flag in the page directory pointer entry. (legacy PAE guest mode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPdpt->a[iPdPt].u |= PGM_PLXFLAGS_MAPPING;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGM_DYNMAP_UNUSED_HINT_VM(pVM, pShwPaePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGM_DYNMAP_UNUSED_HINT_VM(pVM, pShwPdpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China default:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFailed();
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Clears all PDEs involved with the mapping in the shadow page table.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pShwPageCR3 CR3 root page
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pMap Pointer to the mapping in question.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param iOldPDE The index of the 32-bit PDE corresponding to the base of the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param fDeactivateCR3 Set if it's pgmMapDeactivateCR3 calling.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinavoid pgmMapClearShadowPDEs(PVM pVM, PPGMPOOLPAGE pShwPageCR3, PPGMMAPPING pMap, unsigned iOldPDE, bool fDeactivateCR3)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("pgmMapClearShadowPDEs: old pde %x (cPTs=%x) (mappings enabled %d) fDeactivateCR3=%RTbool\n", iOldPDE, pMap->cPTs, pgmMapAreMappingsEnabled(pVM), fDeactivateCR3));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Skip this if disabled or if it doesn't apply.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( !pgmMapAreMappingsEnabled(pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || pVM->cCpus > 1)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* This only applies to raw mode where we only support 1 VCPU. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = VMMGetCpu0(pVM);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China# ifdef IN_RC
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPageCR3 != pVCpu->pgm.s.CTX_SUFF(pShwPageCR3));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China# endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PDPT pCurrentShwPdpt = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( PGMGetGuestMode(pVCpu) >= PGMMODE_PAE
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du && pShwPageCR3 != pVCpu->pgm.s.CTX_SUFF(pShwPageCR3))
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du pCurrentShwPdpt = pgmShwGetPaePDPTPtr(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned i = pMap->cPTs;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du PGMMODE enmShadowMode = PGMGetShadowMode(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iOldPDE += i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (i-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iOldPDE--;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch(enmShadowMode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_32_BIT:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PD pShw32BitPd = (PX86PD)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pShw32BitPd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada Assert(!pShw32BitPd->a[iOldPDE].n.u1Present || (pShw32BitPd->a[iOldPDE].u & PGM_PDFLAGS_MAPPING));
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada pShw32BitPd->a[iOldPDE].u = 0;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada break;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald }
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles case PGMMODE_PAE:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_PAE_NX:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald const unsigned iPdpt = iOldPDE / 256; /* iOldPDE * 2 / 512; iOldPDE is in 4 MB pages */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald unsigned iPaePde = iOldPDE * 2 % 512;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald PX86PDPT pShwPdpt = (PX86PDPT)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PDPAE pShwPaePd = pgmShwGetPaePDPtr(pVCpu, pShwPdpt, (iPdpt << X86_PDPT_SHIFT));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Clear the PGM_PDFLAGS_MAPPING flag for the page directory pointer entry. (legacy PAE guest mode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (fDeactivateCR3)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPdpt->a[iPdpt].u &= ~PGM_PLXFLAGS_MAPPING;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else if (pShwPdpt->a[iPdpt].u & PGM_PLXFLAGS_MAPPING)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* See if there are any other mappings here. This is suboptimal code. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPdpt->a[iPdpt].u &= ~PGM_PLXFLAGS_MAPPING;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pCur != pMap
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && ( (pCur->GCPtr >> X86_PDPT_SHIFT) == iPdpt
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || (pCur->GCPtrLast >> X86_PDPT_SHIFT) == iPdpt))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPdpt->a[iPdpt].u |= PGM_PLXFLAGS_MAPPING;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If the page directory of the old CR3 is reused in the new one, then don't
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * clear the hypervisor mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pCurrentShwPdpt
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada && (pCurrentShwPdpt->a[iPdpt].u & X86_PDPE_PG_MASK) == (pShwPdpt->a[iPdpt].u & X86_PDPE_PG_MASK) )
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada LogFlow(("pgmMapClearShadowPDEs: Pdpe %d reused -> don't clear hypervisor mappings!\n", iPdpt));
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada break;
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada /*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * Clear the mappings in the PD.
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada */
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada AssertFatal(pShwPaePd);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada Assert(!pShwPaePd->a[iPaePde].n.u1Present || (pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING));
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada pShwPaePd->a[iPaePde].u = 0;
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada iPaePde++;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(iPaePde < 512);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(!pShwPaePd->a[iPaePde].n.u1Present || (pShwPaePd->a[iPaePde].u & PGM_PDFLAGS_MAPPING));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPaePd->a[iPaePde].u = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Unlock the shadow pool PD page if the PDPTE no longer holds any mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( fDeactivateCR3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || !(pShwPdpt->a[iPdpt].u & PGM_PLXFLAGS_MAPPING))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMPOOLPAGE pPoolPagePd = pgmPoolGetPage(pPool, pShwPdpt->a[iPdpt].u & X86_PDPE_PG_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pPoolPagePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pgmPoolIsPageLocked(pPoolPagePd))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmPoolUnlockPage(pPool, pPoolPagePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China default:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFailed();
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGM_DYNMAP_UNUSED_HINT_VM(pVM, pCurrentShwPdpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif /* !IN_RING0 */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#if defined(VBOX_STRICT) && !defined(IN_RING0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Clears all PDEs involved with the mapping in the shadow page table.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The VM handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVCpu The VMCPU handle.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pShwPageCR3 CR3 root page
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pMap Pointer to the mapping in question.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param iPDE The index of the 32-bit PDE corresponding to the base of the mapping.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic void pgmMapCheckShadowPDEs(PVM pVM, PVMCPU pVCpu, PPGMPOOLPAGE pShwPageCR3, PPGMMAPPING pMap, unsigned iPDE)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t i = pMap->cPTs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMMODE enmShadowMode = PGMGetShadowMode(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE += i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (i-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE--;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch (enmShadowMode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_32_BIT:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PCX86PD pShw32BitPd = (PCX86PD)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pShw32BitPd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(pShw32BitPd->a[iPDE].u == (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | (uint32_t)pMap->aPTs[i].HCPhysPT),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ("Expected %x vs %x; iPDE=%#x %RGv %s\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShw32BitPd->a[iPDE].u, (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | (uint32_t)pMap->aPTs[i].HCPhysPT),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, pMap->GCPtr, R3STRING(pMap->pszDesc) ));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case PGMMODE_PAE:
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du case PGMMODE_PAE_NX:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China const unsigned iPdpt = iPDE / 256; /* iPDE * 2 / 512; iPDE is in 4 MB pages */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPaePDE = iPDE * 2 % 512;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du PX86PDPT pShwPdpt = (PX86PDPT)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPageCR3);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du PCX86PDPAE pShwPaePd = pgmShwGetPaePDPtr(pVCpu, pShwPdpt, iPdpt << X86_PDPT_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pShwPaePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du AssertMsg(pShwPaePd->a[iPaePDE].u == (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT0),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ("Expected %RX64 vs %RX64; iPDE=%#x iPdpt=%#x iPaePDE=%#x %RGv %s\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPaePd->a[iPaePDE].u, (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT0),
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald iPDE, iPdpt, iPaePDE, pMap->GCPtr, R3STRING(pMap->pszDesc) ));
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPaePDE++;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(iPaePDE < 512);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(pShwPaePd->a[iPaePDE].u == (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT1),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ("Expected %RX64 vs %RX64; iPDE=%#x iPdpt=%#x iPaePDE=%#x %RGv %s\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPaePd->a[iPaePDE].u, (PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT1),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPdpt, iPaePDE, pMap->GCPtr, R3STRING(pMap->pszDesc) ));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(pShwPdpt->a[iPdpt].u & PGM_PLXFLAGS_MAPPING,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada ("%RX64; iPdpt=%#x iPDE=%#x iPaePDE=%#x %RGv %s\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pShwPdpt->a[iPdpt].u,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPdpt, iPaePDE, pMap->GCPtr, R3STRING(pMap->pszDesc) ));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PCPGMPOOLPAGE pPoolPagePd = pgmPoolGetPage(pPool, pShwPdpt->a[iPdpt].u & X86_PDPE_PG_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFatal(pPoolPagePd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertMsg(pPoolPagePd->cLocked, (".idx=%d .type=%d\n", pPoolPagePd->idx, pPoolPagePd->enmKind));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China default:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFailed();
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Check the hypervisor mappings in the active CR3.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(void) PGMMapCheck(PVM pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Can skip this if mappings are disabled.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!pgmMapAreMappingsEnabled(pVM))
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles return;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles /* This only applies to raw mode where we only support 1 VCPU. */
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles Assert(pVM->cCpus == 1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = VMMGetCpu0(pVM);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pVCpu->pgm.s.CTX_SUFF(pShwPageCR3));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmLock(pVM); /* to avoid assertions */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPDE = pCur->GCPtr >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmMapCheckShadowPDEs(pVM, pVCpu, pVCpu->pgm.s.CTX_SUFF(pShwPageCR3), pCur, iPDE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmUnlock(pVM);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif /* defined(VBOX_STRICT) && !defined(IN_RING0) */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles#ifndef IN_RING0
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Apply the hypervisor mappings to the active CR3.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pShwPageCR3 CR3 root page
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint pgmMapActivateCR3(PVM pVM, PPGMPOOLPAGE pShwPageCR3)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Skip this if disabled or if it doesn't apply.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( !pgmMapAreMappingsEnabled(pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || pVM->cCpus > 1)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* Note! This might not be logged successfully in RC because we usually
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles cannot flush the log at this point. */
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles Log4(("pgmMapActivateCR3: fixed mappings=%RTbool idxShwPageCR3=%#x\n", pVM->pgm.s.fMappingsFixed, pShwPageCR3 ? pShwPageCR3->idx : NIL_PGMPOOL_IDX));
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles#ifdef VBOX_STRICT
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = VMMGetCpu0(pVM);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPageCR3 && pShwPageCR3 == pVCpu->pgm.s.CTX_SUFF(pShwPageCR3));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPDE = pCur->GCPtr >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmMapSetShadowPDEs(pVM, pCur, iPDE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Remove the hypervisor mappings from the specified CR3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pShwPageCR3 CR3 root page
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint pgmMapDeactivateCR3(PVM pVM, PPGMPOOLPAGE pShwPageCR3)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Skip this if disabled or if it doesn't apply.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( !pgmMapAreMappingsEnabled(pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || pVM->cCpus > 1)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pShwPageCR3);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log4(("pgmMapDeactivateCR3: fixed mappings=%d idxShwPageCR3=%#x\n", pVM->pgm.s.fMappingsFixed, pShwPageCR3 ? pShwPageCR3->idx : NIL_PGMPOOL_IDX));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPDE = pCur->GCPtr >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pgmMapClearShadowPDEs(pVM, pShwPageCR3, pCur, iPDE, true /*fDeactivateCR3*/);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Checks guest PD for conflicts with VMM GC mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns true if conflict detected.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns false if not.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing ChinaVMMDECL(bool) PGMMapHasConflicts(PVM pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Can skip this if mappings are safely fixed.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!pgmMapAreMappingsFloating(pVM))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return false;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pVM->cCpus == 1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* This only applies to raw mode where we only support 1 VCPU. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = &pVM->aCpus[0];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMMODE const enmGuestMode = PGMGetGuestMode(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(enmGuestMode <= PGMMODE_PAE_NX);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (enmGuestMode == PGMMODE_32_BIT)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Resolve the page directory.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PD pPD = pgmGstGet32bitPDPtr(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pPD);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPDE = pCur->GCPtr >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = pCur->cPTs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (iPT-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pPD->a[iPDE + iPT].n.u1Present /** @todo PGMGstGetPDE. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && (pVM->fRawR0Enabled || pPD->a[iPDE + iPT].n.u1User))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->StatR3DetectedConflicts);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifdef IN_RING3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %08RX32 for mapping %s (32 bits)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " iPDE=%#x iPT=%#x PDE=%RGp.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iPT + iPDE) << X86_PD_SHIFT, pCur->pszDesc,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPT, pPD->a[iPDE + iPT].au32[0]));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %08RX32 for mapping (32 bits)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " iPDE=%#x iPT=%#x PDE=%RGp.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iPT + iPDE) << X86_PD_SHIFT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPT, pPD->a[iPDE + iPT].au32[0]));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return true;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else if ( enmGuestMode == PGMMODE_PAE
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || enmGuestMode == PGMMODE_PAE_NX)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; pCur = pCur->CTX_SUFF(pNext))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China RTGCPTR GCPtr = pCur->GCPtr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = pCur->cb >> X86_PD_PAE_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (iPT-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China X86PDEPAE Pde = pgmGstGetPaePDE(pVCpu, GCPtr);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( Pde.n.u1Present
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && (pVM->fRawR0Enabled || Pde.n.u1User))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->StatR3DetectedConflicts);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifdef IN_RING3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %RGv for mapping %s (PAE)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " PDE=%016RX64.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr, pCur->pszDesc, Pde.u));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %RGv for mapping (PAE)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " PDE=%016RX64.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr, Pde.u));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return true;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr += (1 << X86_PD_PAE_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFailed();
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return false;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/**
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Checks and resolves (ring 3 only) guest conflicts with the guest mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @returns VBox status.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * @param pVM The virtual machine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint pgmMapResolveConflicts(PVM pVM)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* The caller is expected to check these two conditions. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(!pVM->pgm.s.fMappingsFixed);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(!pVM->pgm.s.fMappingsDisabled);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /* This only applies to raw mode where we only support 1 VCPU. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pVM->cCpus == 1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PVMCPU pVCpu = &pVM->aCpus[0];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PGMMODE const enmGuestMode = PGMGetGuestMode(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(enmGuestMode <= PGMMODE_PAE_NX);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (enmGuestMode == PGMMODE_32_BIT)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Resolve the page directory.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PX86PD pPD = pgmGstGet32bitPDPtr(pVCpu);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(pPD);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur; )
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMMAPPING pNext = pCur->CTX_SUFF(pNext);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPDE = pCur->GCPtr >> X86_PD_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = pCur->cPTs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (iPT-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( pPD->a[iPDE + iPT].n.u1Present /** @todo PGMGstGetPDE. */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && ( pVM->fRawR0Enabled
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || pPD->a[iPDE + iPT].n.u1User))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->StatR3DetectedConflicts);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifdef IN_RING3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %08RX32 for mapping %s (32 bits)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " iPDE=%#x iPT=%#x PDE=%RGp.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iPT + iPDE) << X86_PD_SHIFT, pCur->pszDesc,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPT, pPD->a[iPDE + iPT].au32[0]));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rc = pgmR3SyncPTResolveConflict(pVM, pCur, pPD, iPDE << X86_PD_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertRCReturn(rc, rc);
2856b5e3c5137244fef1ffe380906d7006f41d5bAda break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %08RX32 for mapping (32 bits)\n"
2856b5e3c5137244fef1ffe380906d7006f41d5bAda " iPDE=%#x iPT=%#x PDE=%RGp.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iPT + iPDE) << X86_PD_SHIFT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iPDE, iPT, pPD->a[iPDE + iPT].au32[0]));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_PGM_SYNC_CR3;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur = pNext;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else if ( enmGuestMode == PGMMODE_PAE
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China || enmGuestMode == PGMMODE_PAE_NX)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Iterate mappings.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (PPGMMAPPING pCur = pVM->pgm.s.CTX_SUFF(pMappings); pCur;)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PPGMMAPPING pNext = pCur->CTX_SUFF(pNext);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China RTGCPTR GCPtr = pCur->GCPtr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China unsigned iPT = pCur->cb >> X86_PD_PAE_SHIFT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (iPT-- > 0)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China X86PDEPAE Pde = pgmGstGetPaePDE(pVCpu, GCPtr);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ( Pde.n.u1Present
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China && (pVM->fRawR0Enabled || Pde.n.u1User))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->StatR3DetectedConflicts);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifdef IN_RING3
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %RGv for mapping %s (PAE)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " PDE=%016RX64.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr, pCur->pszDesc, Pde.u));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rc = pgmR3SyncPTResolveConflictPAE(pVM, pCur, pCur->GCPtr);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertRCReturn(rc, rc);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Log(("PGMHasMappingConflicts: Conflict was detected at %RGv for mapping (PAE)\n"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " PDE=%016RX64.\n",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr, Pde.u));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_PGM_SYNC_CR3;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China GCPtr += (1 << X86_PD_PAE_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pCur = pNext;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China AssertFailed();
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China Assert(!PGMMapHasConflicts(pVM));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return VINF_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif /* IN_RING0 */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China