HMAll.cpp revision 264f9f874b1fcfeae07f3fe8939a2fcccd5473c1
/* $Id$ */
/** @file
* HM - All contexts.
*/
/*
* Copyright (C) 2006-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#define LOG_GROUP LOG_GROUP_HM
#include "HMInternal.h"
/**
* Queues a page for invalidation
*
* @returns VBox status code.
* @param pVCpu Pointer to the VMCPU.
* @param GCVirt Page to invalidate
*/
{
/* Nothing to do if a TLB flush is already pending */
return;
#if 1
#else
/* Be very careful when activating this code! */
else
#endif
}
/**
* Invalidates a guest page
*
* @returns VBox status code.
* @param pVCpu Pointer to the VMCPU.
* @param GCVirt Page to invalidate
*/
{
#ifdef IN_RING0
#else
return VINF_SUCCESS;
#endif
}
/**
* Flushes the guest TLB
*
* @returns VBox status code.
* @param pVCpu Pointer to the VMCPU.
*/
{
LogFlow(("HMFlushTLB\n"));
return VINF_SUCCESS;
}
#ifdef IN_RING0
/**
* Dummy RTMpOnSpecific handler since RTMpPokeCpu couldn't be used.
*
*/
{
return;
}
/**
* Wrapper for RTMpPokeCpu to deal with VERR_NOT_SUPPORTED.
*/
{
/* Not implemented on some platforms (Darwin, Linux kernel < 2.6.19); fall
back to a less efficient implementation (broadcast). */
if (rc == VERR_NOT_SUPPORTED)
{
/* synchronous. */
}
else
{
if (rc == VINF_SUCCESS)
else
/** @todo If more than one CPU is going to be poked, we could optimize this
* operation by poking them first and wait afterwards. Would require
* recording who to poke and their current cWorldSwitchExits values,
* that's something not suitable for stack... So, pVCpu->hm.s.something
* then. */
/* Spin until the VCPU has switched back (poking is async). */
ASMNopPause();
if (rc == VINF_SUCCESS)
else
}
}
#endif /* IN_RING0 */
#ifndef IN_RC
/**
* Poke an EMT so it can perform the appropriate TLB shootdowns.
*
* @param pVCpu The handle of the virtual CPU to poke.
* @param fAccountFlushStat Whether to account the call to
* StatTlbShootdownFlush or StatTlbShootdown.
*/
{
{
if (fAccountFlushStat)
else
#ifdef IN_RING0
if (idHostCpu != NIL_RTCPUID)
#else
#endif
}
else
}
/**
* Invalidates a guest page on all VCPUs.
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
* @param GCVirt Page to invalidate
*/
{
{
/* Nothing to do if a TLB flush is already pending; the VCPU should
have already been poked if it were active. */
continue;
else
{
}
}
return VINF_SUCCESS;
}
/**
* Flush the TLBs of all VCPUs
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
*/
{
{
/* Nothing to do if a TLB flush is already pending; the VCPU should
have already been poked if it were active. */
{
}
}
return VINF_SUCCESS;
}
#endif /* !IN_RC */
/**
* Checks if nested paging is enabled
*
* @returns boolean
* @param pVM Pointer to the VM.
*/
{
}
/**
*
* @returns shadow paging mode
* @param pVM Pointer to the VM.
*/
{
return PGMMODE_NESTED;
return PGMMODE_EPT;
}
/**
* Invalidates a guest page by physical address
*
* NOTE: Assumes the current instruction references this physical page though a virtual address!!
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
* @param GCPhys Page to invalidate
*/
{
if (!HMIsNestedPagingActive(pVM))
return VINF_SUCCESS;
#ifdef IN_RING0
{
{
{
/** @todo r=ramshankar: Intel does not support flushing by guest physical
* address either. See comment in VMXR0InvalidatePhysPage(). Fix this. */
}
else
{
}
}
return VINF_SUCCESS;
}
/* AMD-V doesn't support invalidation with guest physical addresses; see
comment in SVMR0InvalidatePhysPage. */
#else
#endif
return VINF_SUCCESS;
}
/**
* Checks if an interrupt event is currently pending.
*
* @returns Interrupt event pending state.
* @param pVM Pointer to the VM.
*/
{
}