CPUMAllRegs.cpp revision 677833bc953b6cb418c701facbdcf4aa18d6c44e
0N/A * CPUM - CPU Monitor(/Manager) - Gets and Sets. 2362N/A * Copyright (C) 2006 InnoTek Systemberatung GmbH 2362N/A * This file is part of VirtualBox Open Source Edition (OSE), as 0N/A * you can redistribute it and/or modify it under the terms of the GNU 0N/A * General Public License as published by the Free Software Foundation, 0N/A * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE 0N/A * distribution. VirtualBox OSE is distributed in the hope that it will 0N/A * be useful, but WITHOUT ANY WARRANTY of any kind. 0N/A * If you received this file as part of a commercial VirtualBox 0N/A * distribution, then only the terms of your commercial VirtualBox 0N/A * license agreement apply instead of the previous paragraph. 2362N/A/******************************************************************************* 0N/A*******************************************************************************/ 3570N/A/** Disable stack frame pointer generation here. */ * Sets or resets an alternative hypervisor context core. * This is called when we get a hypervisor trap set switch the context * core with the trap frame on the stack. It is called again to reset * back to the default context core when resuming hypervisor execution. * @param pVM The VM handle. * @param pCtxCore Pointer to the alternative context core or NULL * to go back to the default context core. * Gets the pointer to the internal CPUMCTXCORE structure for the hypervisor. * This is only for reading in order to save a few calls. * @param pVM Handle to the virtual machine. * Queries the pointer to the internal CPUMCTX structure for the hypervisor. * @returns VBox status code. * @param pVM Handle to the virtual machine. * @param ppCtx Receives the hyper CPUMCTX pointer when successful. * @deprecated This will *not* (and has never) given the right picture of the * hypervisor register state. With CPUMHyperSetCtxCore() this is * getting much worse. So, use the individual functions for getting * and esp. setting the hypervisor registers. /** @todo in GC we must load it! */ /** @todo in GC we must load it! */ /** @todo in GC we must load it! */ /** @todo in GC we must load it! */ /** @todo in GC we must load it! */ /** @todo in GC we must load it! */ #
if 0
/* these are not correct. */ * Gets the pointer to the internal CPUMCTXCORE structure. * This is only for reading in order to save a few calls. * @param pVM Handle to the virtual machine. * Sets the guest context core registers. * @param pVM Handle to the virtual machine. * @param pCtxCore The new context core values. /** @todo #1410 requires selectors to be checked. */ * Queries the pointer to the internal CPUMCTX structure * @returns VBox status code. * @param pVM Handle to the virtual machine. * @param ppCtx Receives the CPUMCTX pointer when successful. //@todo: crx should be an array /** @todo drx should be an array */ * @param pVM The VM handle. * @param iLeaf The CPUID leaf to get. * @param pEax Where to store the EAX value. * @param pEbx Where to store the EBX value. * @param pEcx Where to store the ECX value. * @param pEdx Where to store the EDX value. * Gets a pointer to the array of standard CPUID leafs. * CPUMGetGuestCpuIdStdMax() give the size of the array. * @returns Pointer to the standard CPUID leafs (read-only). * @param pVM The VM handle. * @remark Intended for PATM. * Gets a pointer to the array of extended CPUID leafs. * CPUMGetGuestCpuIdExtMax() give the size of the array. * @returns Pointer to the extended CPUID leafs (read-only). * @param pVM The VM handle. * @remark Intended for PATM. * Gets a pointer to the default CPUID leaf. * @returns Pointer to the default CPUID leaf (read-only). * @param pVM The VM handle. * @remark Intended for PATM. * Gets a number of standard CPUID leafs. * @returns Number of leafs. * @param pVM The VM handle. * @remark Intended for PATM. * Gets a number of extended CPUID leafs. * @returns Number of leafs. * @param pVM The VM handle. * @remark Intended for PATM. * Sets a CPUID feature bit. * @param pVM The VM Handle. * @param enmFeature The feature to set. * Set the APIC bit in both feature masks. Log((
"CPUMSetGuestCpuIdFeature: Enabled APIC\n"));
* Clears a CPUID feature bit. * @param pVM The VM Handle. * @param enmFeature The feature to clear. * Set the APIC bit in both feature masks. Log((
"CPUMSetGuestCpuIdFeature: Disabled APIC\n"));
/** @todo drx should be an array */ * Recalculates the hypvervisor DRx register values based on * current guest registers and DBGF breakpoints. * This is called whenever a guest DRx register is modified and when DBGF * sets a hardware breakpoint. In guest context this function will reload * any (hyper) DRx registers which comes out with a different value. * @param pVM The VM handle. * Compare the DR7s first. * We only care about the enabled flags. The GE and LE flags are always * set and we don't care if the guest doesn't set them. GD is virtualized * when we dispatch #DB, we never enable it. * Ok, something is enabled. Recalc each of the breakpoints. /** @todo save host DBx registers. */ /** @todo restore host DBx registers. */ Log2((
"CPUMRecalcHyperDRx: fUseFlags=%#x %RGr %RGr %RGr %RGr %RGr %RGr\n",
* Transforms the guest CPU state to raw-ring mode. * This function will change the any of the cs and ss register with DPL=0 to DPL=1. * @returns VBox status. (recompiler failure) * @param pCtxCore The context core (for trap usage). (
"ring-1 code not supported\n"));
* PATM takes care of IOPL and IF flags for Ring-3 and Ring-2 code as well. * Transforms the guest CPU state from raw-ring mode to correct values. * This function will change any selector registers with DPL=1 to DPL=0. * @param rc Raw mode return code * @param pCtxCore The context core (for trap usage). * Don't leave if we've already left (in GC). * Are we executing in raw ring-1? /* Not quite sure if this is really required, but shouldn't harm (too much anyways). */ /** @todo See what happens if we remove this. */ * Ring-1 selector => Ring-0. * PATM is taking care of the IOPL and IF flags for us. /** @todo See what happens if we remove this. */ * Updates the EFLAGS while we're in raw-mode. * @param pVM The VM handle. * @param pCtxCore The context core. * @param eflags The new EFLAGS value. * Gets the EFLAGS while we're in raw-mode. * @param pVM The VM handle. * @param pCtxCore The context core. * Gets and resets the changed flags (CPUM_CHANGED_*). * Only REM should call this function. * @returns The changed flags. * @param pVM The VM handle. /** @todo change the switcher to use the fChanged flags. */ * Sets the specified changed flags (CPUM_CHANGED_*). * @param pVM The VM handle. * Checks if the CPU supports the FXSAVE and FXRSTOR instruction. * @returns true if supported. * @returns false if not supported. * @param pVM The VM handle. * Checks if the host OS uses the SYSENTER / SYSEXIT instructions. * @returns false if not used. * @param pVM The VM handle. * Checks if the host OS uses the SYSCALL / SYSRET instructions. * @returns false if not used. * @param pVM The VM handle. * Lazily sync in the FPU/XMM state * @returns VBox status code. * @returns VBox status code. * Checks if we activated the FPU/XMM state of the guest OS * @returns true if we did. * @param pVM The VM handle. * Deactivate the FPU/XMM state of the guest OS * @param pVM The VM handle. * Checks if the hidden selector registers are valid * @returns true if they are. * @param pVM The VM handle. * Checks if the hidden selector registers are valid * @param pVM The VM handle. * @param fValid Valid or not