cpum.h revision 873db999b6c8aa54ad92544e8a82d7cee26f87bf
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @file
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CPUM - CPU Monitor(/ Manager).
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
a5f17f2682f4e8ed08ffca84a036028533ea8f16vboxsync * Copyright (C) 2006-2012 Oracle Corporation
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * available from http://www.virtualbox.org. This file is free software;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * you can redistribute it and/or modify it under the terms of the GNU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * General Public License (GPL) as published by the Free Software
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * The contents of this file may alternatively be used under the terms
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * of the Common Development and Distribution License Version 1.0
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution, in which case the provisions of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CDDL are applicable instead of those of the GPL.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * You may elect to license modified versions of this file under the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * terms and conditions of either the GPL or the CDDL or both.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifndef ___VBox_vmm_cpum_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define ___VBox_vmm_cpum_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
2d97f8baccdd684bc0a8a15eb86bbe9ff2b85374vboxsync#include <iprt/x86.h>
2d97f8baccdd684bc0a8a15eb86bbe9ff2b85374vboxsync#include <VBox/types.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <VBox/vmm/cpumctx.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncRT_C_DECLS_BEGIN
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @defgroup grp_cpum The CPU Monitor / Manager API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CPUID feature to set or clear.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef enum CPUMCPUIDFEATURE
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_INVALID = 0,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The APIC feature bit. (Std+Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_APIC,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The sysenter/sysexit feature bit. (Std) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_SEP,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The SYSCALL/SYSEXIT feature bit (64 bits mode only for Intel CPUs). (Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_SYSCALL,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The PAE feature bit. (Std+Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_PAE,
24986763e9e9e6633a4a54479be945d577fdfd34vboxsync /** The NX feature bit. (Ext) */
24986763e9e9e6633a4a54479be945d577fdfd34vboxsync CPUMCPUIDFEATURE_NX,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The LAHF/SAHF feature bit (64 bits mode only). (Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_LAHF,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The LONG MODE feature bit. (Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_LONG_MODE,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The PAT feature bit. (Std+Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_PAT,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The x2APIC feature bit. (Std) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_X2APIC,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The RDTSCP feature bit. (Ext) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_RDTSCP,
99fc25fde31ac60ee18ac48eab7027dea4272a0bvboxsync /** The Hypervisor Present bit. (Std) */
99fc25fde31ac60ee18ac48eab7027dea4272a0bvboxsync CPUMCPUIDFEATURE_HVP,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** 32bit hackishness. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUIDFEATURE_32BIT_HACK = 0x7fffffff
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} CPUMCPUIDFEATURE;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CPU Vendor.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef enum CPUMCPUVENDOR
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_INVALID = 0,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_INTEL,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_AMD,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_VIA,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_UNKNOWN,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_SYNTHETIC,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** 32bit hackishness. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync CPUMCPUVENDOR_32BIT_HACK = 0x7fffffff
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} CPUMCPUVENDOR;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @name Guest Register Getters.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{ */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMGetGuestGDTR(PVMCPU pVCpu, PVBOXGDTR pGDTR);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCPTR) CPUMGetGuestIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestTR(PVMCPU pVCpu, PCPUMSELREGHID pHidden);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestLDTR(PVMCPU pVCpu);
d9e8985b936caa8e72f58c48045478fc2776dc5evboxsyncVMMDECL(RTSEL) CPUMGetGuestLdtrEx(PVMCPU pVCpu, uint64_t *pGCPtrBase, uint32_t *pcbLimit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestCR0(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestCR2(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestCR3(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestCR4(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestCR8(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMGetGuestCRx(PVMCPU pVCpu, unsigned iReg, uint64_t *pValue);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEFlags(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEIP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestRIP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEAX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEBX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestECX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEDX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestESI(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEDI(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestESP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestEBP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestCS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestDS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestES(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestFS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestGS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetGuestSS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR0(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR1(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR2(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR3(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR6(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestDR7(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMGetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t *pValue);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMGetGuestCpuId(PVMCPU pVCpu, uint32_t iLeaf, uint32_t *pEax, uint32_t *pEbx, uint32_t *pEcx, uint32_t *pEdx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestCpuIdStdMax(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestCpuIdExtMax(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetGuestCpuIdCentaurMax(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetGuestEFER(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMQueryGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t uValue);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(CPUMCPUVENDOR) CPUMGetGuestCpuVendor(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(CPUMCPUVENDOR) CPUMGetHostCpuVendor(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @name Guest Register Setters.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{ */
eb30b3bfcb8b0e55f5498ba7a84e55a536debcd7vboxsyncVMMDECL(int) CPUMSetGuestGDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
eb30b3bfcb8b0e55f5498ba7a84e55a536debcd7vboxsyncVMMDECL(int) CPUMSetGuestIDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestTR(PVMCPU pVCpu, uint16_t tr);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestLDTR(PVMCPU pVCpu, uint16_t ldtr);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestCR0(PVMCPU pVCpu, uint64_t cr0);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestCR2(PVMCPU pVCpu, uint64_t cr2);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestCR3(PVMCPU pVCpu, uint64_t cr3);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestCR4(PVMCPU pVCpu, uint64_t cr4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR0(PVMCPU pVCpu, uint64_t uDr0);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR1(PVMCPU pVCpu, uint64_t uDr1);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR2(PVMCPU pVCpu, uint64_t uDr2);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR3(PVMCPU pVCpu, uint64_t uDr3);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR6(PVMCPU pVCpu, uint64_t uDr6);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDR7(PVMCPU pVCpu, uint64_t uDr7);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t Value);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEFlags(PVMCPU pVCpu, uint32_t eflags);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEIP(PVMCPU pVCpu, uint32_t eip);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEAX(PVMCPU pVCpu, uint32_t eax);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEBX(PVMCPU pVCpu, uint32_t ebx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestECX(PVMCPU pVCpu, uint32_t ecx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEDX(PVMCPU pVCpu, uint32_t edx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestESI(PVMCPU pVCpu, uint32_t esi);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEDI(PVMCPU pVCpu, uint32_t edi);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestESP(PVMCPU pVCpu, uint32_t esp);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestEBP(PVMCPU pVCpu, uint32_t ebp);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestCS(PVMCPU pVCpu, uint16_t cs);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestDS(PVMCPU pVCpu, uint16_t ds);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestES(PVMCPU pVCpu, uint16_t es);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestFS(PVMCPU pVCpu, uint16_t fs);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestGS(PVMCPU pVCpu, uint16_t gs);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetGuestSS(PVMCPU pVCpu, uint16_t ss);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetGuestEFER(PVMCPU pVCpu, uint64_t val);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMClearGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMGetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetGuestCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
559419830ee63b8481ade36d8994f235932aae49vboxsyncVMM_INT_DECL(void) CPUMGuestLazyLoadHiddenCsAndSs(PVMCPU pVCpu);
559419830ee63b8481ade36d8994f235932aae49vboxsyncVMM_INT_DECL(void) CPUMGuestLazyLoadHiddenSelectorReg(PVMCPU pVCpu, PCPUMSELREG pSReg);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @name Misc Guest Predicate Functions.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{ */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestIn16BitCode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestIn32BitCode(PVMCPU pVCpu);
559419830ee63b8481ade36d8994f235932aae49vboxsyncVMMDECL(bool) CPUMIsGuestIn64BitCode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestNXEnabled(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestPageSizeExtEnabled(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestPagingEnabled(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestR0WriteProtEnabled(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestInRealMode(PVMCPU pVCpu);
e69378448f919940b0b999796d40a23df2a7aa39vboxsyncVMMDECL(bool) CPUMIsGuestInRealOrV86Mode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestInProtectedMode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestInPagedProtectedMode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestInLongMode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestInPAEMode(PVMCPU pVCpu);
26f38400c03761b1934b05fa93a64188e88e9904vboxsyncVMM_INT_DECL(bool) CPUMIsGuestInRawMode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifndef VBOX_WITHOUT_UNNAMED_UNIONS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Tests if the guest is running in real mode or not.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @returns true if in real mode, otherwise false.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pCtx Current CPU context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncDECLINLINE(bool) CPUMIsGuestInRealModeEx(PCPUMCTX pCtx)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return !(pCtx->cr0 & X86_CR0_PE);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync}
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
e69378448f919940b0b999796d40a23df2a7aa39vboxsync/**
e69378448f919940b0b999796d40a23df2a7aa39vboxsync * Tests if the guest is running in real or virtual 8086 mode.
e69378448f919940b0b999796d40a23df2a7aa39vboxsync *
e69378448f919940b0b999796d40a23df2a7aa39vboxsync * @returns @c true if it is, @c false if not.
e69378448f919940b0b999796d40a23df2a7aa39vboxsync * @param pCtx Current CPU context
e69378448f919940b0b999796d40a23df2a7aa39vboxsync */
56fa1b550cbdeec7ef620d566155a388c04ca796vboxsyncDECLINLINE(bool) CPUMIsGuestInRealOrV86ModeEx(PCPUMCTX pCtx)
e69378448f919940b0b999796d40a23df2a7aa39vboxsync{
e69378448f919940b0b999796d40a23df2a7aa39vboxsync return !(pCtx->cr0 & X86_CR0_PE)
acf97addaaed7b946d412cfcff46547ba7cb33bfvboxsync || pCtx->eflags.Bits.u1VM; /* Cannot be set in long mode. Intel spec 2.3.1 "System Flags and Fields in IA-32e Mode". */
e69378448f919940b0b999796d40a23df2a7aa39vboxsync}
e69378448f919940b0b999796d40a23df2a7aa39vboxsync
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync/**
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync * Tests if the guest is running in virtual 8086 mode.
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync *
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync * @returns @c true if it is, @c false if not.
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync * @param pCtx Current CPU context
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync */
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsyncDECLINLINE(bool) CPUMIsGuestInV86ModeEx(PCPUMCTX pCtx)
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync{
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync return (pCtx->eflags.Bits.u1VM == 1);
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync}
b40ca073ac6b445a7a49aa6b15fca3c2a26f97a9vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Tests if the guest is running in paged protected or not.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @returns true if in paged protected mode, otherwise false.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pVM The VM handle.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncDECLINLINE(bool) CPUMIsGuestInPagedProtectedModeEx(PCPUMCTX pCtx)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return (pCtx->cr0 & (X86_CR0_PE | X86_CR0_PG)) == (X86_CR0_PE | X86_CR0_PG);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync}
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Tests if the guest is running in long mode or not.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @returns true if in long mode, otherwise false.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pCtx Current CPU context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncDECLINLINE(bool) CPUMIsGuestInLongModeEx(PCPUMCTX pCtx)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return (pCtx->msrEFER & MSR_K6_EFER_LMA) == MSR_K6_EFER_LMA;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync}
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
559419830ee63b8481ade36d8994f235932aae49vboxsyncVMM_INT_DECL(bool) CPUMIsGuestIn64BitCodeSlow(PCPUMCTX pCtx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Tests if the guest is running in 64 bits mode or not.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @returns true if in 64 bits protected mode, otherwise false.
559419830ee63b8481ade36d8994f235932aae49vboxsync * @param pVCpu The current virtual CPU.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pCtx Current CPU context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
559419830ee63b8481ade36d8994f235932aae49vboxsyncDECLINLINE(bool) CPUMIsGuestIn64BitCodeEx(PCPUMCTX pCtx)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync if (!(pCtx->msrEFER & MSR_K6_EFER_LMA))
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return false;
26f38400c03761b1934b05fa93a64188e88e9904vboxsync if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(NULL, &pCtx->cs))
559419830ee63b8481ade36d8994f235932aae49vboxsync return CPUMIsGuestIn64BitCodeSlow(pCtx);
37fb67be7d1d328213aeda3f56ab5aacd37416d1vboxsync return pCtx->cs.Attr.n.u1Long;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync}
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync * Tests if the guest has paging enabled or not.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync * @returns true if paging is enabled, otherwise false.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pCtx Current CPU context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsyncDECLINLINE(bool) CPUMIsGuestPagingEnabledEx(PCPUMCTX pCtx)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync return !!(pCtx->cr0 & X86_CR0_PG);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync}
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync/**
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync * Tests if the guest is running in PAE mode or not.
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync *
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync * @returns true if in PAE mode, otherwise false.
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync * @param pCtx Current CPU context
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync */
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsyncDECLINLINE(bool) CPUMIsGuestInPAEModeEx(PCPUMCTX pCtx)
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync{
873db999b6c8aa54ad92544e8a82d7cee26f87bfvboxsync /* Intel mentions EFER.LMA and EFER.LME in different parts of their spec. We shall use EFER.LMA rather
873db999b6c8aa54ad92544e8a82d7cee26f87bfvboxsync than EFER.LME as it reflects if the CPU has entered paging with EFER.LME set. */
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync return ( (pCtx->cr4 & X86_CR4_PAE)
886d0ed1f0aa2e75c92140ca240345679d617e4cvboxsync && CPUMIsGuestPagingEnabledEx(pCtx)
873db999b6c8aa54ad92544e8a82d7cee26f87bfvboxsync && !(pCtx->msrEFER & MSR_K6_EFER_LMA));
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync}
f3fd5f0cfee6865de86bef793a549083d37edd4fvboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif /* VBOX_WITHOUT_UNNAMED_UNIONS */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @name Hypervisor Register Getters.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{ */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperCS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperDS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperES(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperFS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperGS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperSS(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if 0 /* these are not correct. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperCR0(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperCR2(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperCR4(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** This register is only saved on fatal traps. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEAX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEBX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** This register is only saved on fatal traps. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperECX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** This register is only saved on fatal traps. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEDX(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperESI(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEDI(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEBP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperESP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEFlags(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperEIP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint64_t) CPUMGetHyperRIP(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperGDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTSEL) CPUMGetHyperLDTR(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMGetHyperCtx(PVMCPU pVCpu, PCPUMCTX pCtx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @name Hypervisor Register Setters.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{ */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperGDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperLDTR(PVMCPU pVCpu, RTSEL SelLDTR);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperIDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperCR3(PVMCPU pVCpu, uint32_t cr3);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperTR(PVMCPU pVCpu, RTSEL SelTR);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperCS(PVMCPU pVCpu, RTSEL SelCS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDS(PVMCPU pVCpu, RTSEL SelDS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperES(PVMCPU pVCpu, RTSEL SelDS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperFS(PVMCPU pVCpu, RTSEL SelDS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperGS(PVMCPU pVCpu, RTSEL SelDS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperSS(PVMCPU pVCpu, RTSEL SelSS);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperESP(PVMCPU pVCpu, uint32_t u32ESP);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMSetHyperEFlags(PVMCPU pVCpu, uint32_t Efl);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperEIP(PVMCPU pVCpu, uint32_t u32EIP);
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncVMM_INT_DECL(void) CPUMSetHyperState(PVMCPU pVCpu, uint32_t u32EIP, uint32_t u32ESP, uint32_t u32EAX, uint32_t u32EDX);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR0(PVMCPU pVCpu, RTGCUINTREG uDr0);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR1(PVMCPU pVCpu, RTGCUINTREG uDr1);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR2(PVMCPU pVCpu, RTGCUINTREG uDr2);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR3(PVMCPU pVCpu, RTGCUINTREG uDr3);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR6(PVMCPU pVCpu, RTGCUINTREG uDr6);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperDR7(PVMCPU pVCpu, RTGCUINTREG uDr7);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetHyperCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
45b7b06f3c4ef53f499c355505010a2b050802f4vboxsyncVMMDECL(int) CPUMRecalcHyperDRx(PVMCPU pVCpu, uint8_t iGstReg, bool fForceHyper);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMPushHyper(PVMCPU pVCpu, uint32_t u32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(int) CPUMQueryHyperCtxPtr(PVMCPU pVCpu, PCPUMCTX *ppCtx);
1524bfd2c9963f605135f70fc15ddb018a1e9178vboxsyncVMMDECL(PCPUMCTX) CPUMGetHyperCtxPtr(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(PCCPUMCTXCORE) CPUMGetHyperCtxCore(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(PCPUMCTX) CPUMQueryGuestCtxPtr(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(PCCPUMCTXCORE) CPUMGetGuestCtxCore(PVMCPU pVCpu);
682342827b0e80c493c820603508e79e76c42658vboxsyncVMM_INT_DECL(int) CPUMRawEnter(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
682342827b0e80c493c820603508e79e76c42658vboxsyncVMM_INT_DECL(int) CPUMRawLeave(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, int rc);
8cb8cf7eeafbf2ad5b23866ca19f257bd3aaf9e7vboxsyncVMMDECL(uint32_t) CPUMRawGetEFlags(PVMCPU pVCpu);
8cb8cf7eeafbf2ad5b23866ca19f257bd3aaf9e7vboxsyncVMMDECL(void) CPUMRawSetEFlags(PVMCPU pVCpu, uint32_t fEfl);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
53799e1f1f6601cd3d6be95ff1aa8d3648712618vboxsync/** @name Changed flags.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * These flags are used to keep track of which important register that
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * have been changed since last they were reset. The only one allowed
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * to clear them is REM!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_FPU_REM RT_BIT(0)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_CR0 RT_BIT(1)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_CR4 RT_BIT(2)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_GLOBAL_TLB_FLUSH RT_BIT(3)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_CR3 RT_BIT(4)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_GDTR RT_BIT(5)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_IDTR RT_BIT(6)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_LDTR RT_BIT(7)
53799e1f1f6601cd3d6be95ff1aa8d3648712618vboxsync#define CPUM_CHANGED_TR RT_BIT(8) /**@< Currently unused. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_SYSENTER_MSR RT_BIT(9)
53799e1f1f6601cd3d6be95ff1aa8d3648712618vboxsync#define CPUM_CHANGED_HIDDEN_SEL_REGS RT_BIT(10) /**@< Currently unused. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define CPUM_CHANGED_CPUID RT_BIT(11)
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync#define CPUM_CHANGED_ALL ( CPUM_CHANGED_FPU_REM \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_CR0 \
53799e1f1f6601cd3d6be95ff1aa8d3648712618vboxsync | CPUM_CHANGED_CR4 \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_GLOBAL_TLB_FLUSH \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_CR3 \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_GDTR \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_IDTR \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_LDTR \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_TR \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_SYSENTER_MSR \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_HIDDEN_SEL_REGS \
db946a685afcb5cfb59b1342a2fc637fc0c04c50vboxsync | CPUM_CHANGED_CPUID )
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMSetChangedFlags(PVMCPU pVCpu, uint32_t fChangedFlags);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(uint32_t) CPUMR3RemEnter(PVMCPU pVCpu, uint32_t *puCpl);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(void) CPUMR3RemLeave(PVMCPU pVCpu, bool fNoOutOfSyncSels);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMSupportsFXSR(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsHostUsingSysEnter(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsHostUsingSysCall(PVM pVM);
79883babb0e5b9c7397c304d576bfc29282542afvboxsyncVMMDECL(bool) CPUMIsGuestFPUStateActive(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMDeactivateGuestFPUState(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsGuestDebugStateActive(PVMCPU pVCpu);
22646c9d8a83d8fd3f164563f0141636fcc5a71bvboxsyncVMMDECL(bool) CPUMIsGuestDebugStateActivePending(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(void) CPUMDeactivateGuestDebugState(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMIsHyperDebugStateActive(PVMCPU pVCpu);
22646c9d8a83d8fd3f164563f0141636fcc5a71bvboxsyncVMMDECL(bool) CPUMIsHyperDebugStateActivePending(PVMCPU pVCpu);
7a896688c49bde3fa1490e7ebb321ac51b6ad29dvboxsyncVMMDECL(uint32_t) CPUMGetGuestCPL(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(CPUMMODE) CPUMGetGuestMode(PVMCPU pVCpu);
681380880d4131019871e8f22cb3349b757168cavboxsyncVMMDECL(uint32_t) CPUMGetGuestCodeBits(PVMCPU pVCpu);
681380880d4131019871e8f22cb3349b757168cavboxsyncVMMDECL(DISCPUMODE) CPUMGetGuestDisMode(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef IN_RING3
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @defgroup grp_cpum_r3 The CPU Monitor(/Manager) API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @ingroup grp_cpum
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(int) CPUMR3Init(PVM pVM);
e8f5203e447f6c0729dae4e9b2c30fae30b9d774vboxsyncVMMR3DECL(int) CPUMR3InitCompleted(PVM pVM);
067777fa032e4ab5cbda22e890f4032c3543e11dvboxsyncVMMR3DECL(void) CPUMR3LogCpuIds(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(void) CPUMR3Relocate(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(int) CPUMR3Term(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(void) CPUMR3Reset(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(void) CPUMR3ResetCpu(PVMCPU pVCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMDECL(bool) CPUMR3IsStateRestorePending(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(void) CPUMR3SetHWVirtEx(PVM pVM, bool fHWVirtExEnabled);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(int) CPUMR3SetCR4Feature(PVM pVM, RTHCUINTREG fOr, RTHCUINTREG fAnd);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdStdRCPtr(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdExtRCPtr(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdCentaurRCPtr(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdDefRCPtr(PVM pVM);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif /* IN_RING3 */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef IN_RC
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @defgroup grp_cpum_gc The CPU Monitor(/Manager) API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @ingroup grp_cpum
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Calls a guest trap/interrupt handler directly
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Assumes a trap stack frame has already been setup on the guest's stack!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This function does not return!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pRegFrame Original trap/interrupt context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param selCS Code selector of handler
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pHandler GC virtual address of handler
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param eflags Callee's EFLAGS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param selSS Stack selector for handler
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pEsp Stack address for handler
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncDECLASM(void) CPUMGCCallGuestTrapHandler(PCPUMCTXCORE pRegFrame, uint32_t selCS, RTRCPTR pHandler,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t eflags, uint32_t selSS, RTRCPTR pEsp);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Call guest V86 code directly.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This function does not return!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pRegFrame Original trap/interrupt context
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncDECLASM(void) CPUMGCCallV86Code(PCPUMCTXCORE pRegFrame);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
c3ad07071523338d76960d8da7678860aea8b03dvboxsyncVMMDECL(int) CPUMHandleLazyFPU(PVMCPU pVCpu);
7ce6e7e8fb0eddb176361a49f53fa1bd15eaab4evboxsyncVMMDECL(uint32_t) CPUMRCGetGuestCPL(PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
7ce6e7e8fb0eddb176361a49f53fa1bd15eaab4evboxsync#ifdef VBOX_WITH_RAW_RING1
7847c123aebebc6d3d5c1406619cfba1ab6457c1vboxsyncVMMDECL(void) CPUMRCRecheckRawState(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
7ce6e7e8fb0eddb176361a49f53fa1bd15eaab4evboxsync#endif
7ce6e7e8fb0eddb176361a49f53fa1bd15eaab4evboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif /* IN_RC */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef IN_RING0
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @defgroup grp_cpum_r0 The CPU Monitor(/Manager) API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @ingroup grp_cpum
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(int) CPUMR0ModuleInit(void);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(int) CPUMR0ModuleTerm(void);
07150389a9b621b6ca075140dc22e3acc067ad96vboxsyncVMMR0_INT_DECL(int) CPUMR0InitVM(PVM pVM);
c3ad07071523338d76960d8da7678860aea8b03dvboxsyncVMMR0_INT_DECL(int) CPUMR0Trap07Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(int) CPUMR0LoadGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(int) CPUMR0SaveGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(int) CPUMR0SaveHostDebugState(PVM pVM, PVMCPU pVCpu);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(PVMCPU pVCpu, bool fDr6);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuest(PVMCPU pVCpu, bool fDr6);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsync
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(void) CPUMR0LoadGuestDebugState(PVMCPU pVCpu, bool fDr6);
47e2ddf908aebbc4adbc758d46a6266a4c9c5051vboxsyncVMMR0_INT_DECL(void) CPUMR0LoadHyperDebugState(PVMCPU pVCpu, bool fDr6);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncVMMR0_INT_DECL(void) CPUMR0SetLApic(PVMCPU pVCpu, RTCPUID idHostCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif /* IN_RING0 */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncRT_C_DECLS_END
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync