VirtualBox

source: vbox/trunk/include/VBox/em.h@ 34373

Last change on this file since 34373 was 34326, checked in by vboxsync, 14 years ago

VMM: Removed the XXXInitCPU and XXXTermCPU methods since all but the HWACCM ones where stubs and the XXXTermCPU bits was not called in all expected paths. The HWACCMR3InitCPU was hooked up as a VMINITCOMPLETED_RING3 hook, essentially leaving it's position in the order of things unchanged, while the HWACCMR3TermCPU call was made static without changing its position at the end of HWACCMR3Term.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
Line 
1/** @file
2 * EM - Execution Monitor. (VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2007 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_em_h
27#define ___VBox_em_h
28
29#include <VBox/cdefs.h>
30#include <VBox/types.h>
31#include <VBox/trpm.h>
32#include <VBox/dis.h>
33
34RT_C_DECLS_BEGIN
35
36/** @defgroup grp_em The Execution Monitor / Manager API
37 * @{
38 */
39
40/** Enable to allow V86 code to run in raw mode. */
41#define VBOX_RAW_V86
42
43/**
44 * The Execution Manager State.
45 */
46typedef enum EMSTATE
47{
48 /** Not yet started. */
49 EMSTATE_NONE = 1,
50 /** Raw-mode execution. */
51 EMSTATE_RAW,
52 /** Hardware accelerated raw-mode execution. */
53 EMSTATE_HWACC,
54 /** PARAV function. */
55 EMSTATE_PARAV,
56 /** Recompiled mode execution. */
57 EMSTATE_REM,
58 /** Execution is halted. (waiting for interrupt) */
59 EMSTATE_HALTED,
60 /** Application processor execution is halted. (waiting for startup IPI (SIPI)) */
61 EMSTATE_WAIT_SIPI,
62 /** Execution is suspended. */
63 EMSTATE_SUSPENDED,
64 /** The VM is terminating. */
65 EMSTATE_TERMINATING,
66 /** Guest debug event from raw-mode is being processed. */
67 EMSTATE_DEBUG_GUEST_RAW,
68 /** Guest debug event from hardware accelerated mode is being processed. */
69 EMSTATE_DEBUG_GUEST_HWACC,
70 /** Guest debug event from recompiled-mode is being processed. */
71 EMSTATE_DEBUG_GUEST_REM,
72 /** Hypervisor debug event being processed. */
73 EMSTATE_DEBUG_HYPER,
74 /** The VM has encountered a fatal error. (And everyone is panicing....) */
75 EMSTATE_GURU_MEDITATION,
76 /** Just a hack to ensure that we get a 32-bit integer. */
77 EMSTATE_MAKE_32BIT_HACK = 0x7fffffff
78} EMSTATE;
79
80
81/**
82 * EMInterpretInstructionCPUEx execution modes.
83 */
84typedef enum
85{
86 /** Only supervisor code (CPL=0). */
87 EMCODETYPE_SUPERVISOR,
88 /** User-level code only. */
89 EMCODETYPE_USER,
90 /** Supervisor and user-level code (use with great care!). */
91 EMCODETYPE_ALL,
92 /** Just a hack to ensure that we get a 32-bit integer. */
93 EMCODETYPE_32BIT_HACK = 0x7fffffff
94} EMCODETYPE;
95
96VMMDECL(EMSTATE) EMGetState(PVMCPU pVCpu);
97VMMDECL(void) EMSetState(PVMCPU pVCpu, EMSTATE enmNewState);
98
99/** @name Callback handlers for instruction emulation functions.
100 * These are placed here because IOM wants to use them as well.
101 * @{
102 */
103typedef DECLCALLBACK(uint32_t) FNEMULATEPARAM2UINT32(void *pvParam1, uint64_t val2);
104typedef FNEMULATEPARAM2UINT32 *PFNEMULATEPARAM2UINT32;
105typedef DECLCALLBACK(uint32_t) FNEMULATEPARAM2(void *pvParam1, size_t val2);
106typedef FNEMULATEPARAM2 *PFNEMULATEPARAM2;
107typedef DECLCALLBACK(uint32_t) FNEMULATEPARAM3(void *pvParam1, uint64_t val2, size_t val3);
108typedef FNEMULATEPARAM3 *PFNEMULATEPARAM3;
109typedef DECLCALLBACK(int) FNEMULATELOCKPARAM2(void *pvParam1, uint64_t val2, RTGCUINTREG32 *pf);
110typedef FNEMULATELOCKPARAM2 *PFNEMULATELOCKPARAM2;
111typedef DECLCALLBACK(int) FNEMULATELOCKPARAM3(void *pvParam1, uint64_t val2, size_t cb, RTGCUINTREG32 *pf);
112typedef FNEMULATELOCKPARAM3 *PFNEMULATELOCKPARAM3;
113/** @} */
114
115
116/**
117 * Checks if raw ring-3 execute mode is enabled.
118 *
119 * @returns true if enabled.
120 * @returns false if disabled.
121 * @param pVM The VM to operate on.
122 */
123#define EMIsRawRing3Enabled(pVM) ((pVM)->fRawR3Enabled)
124
125/**
126 * Checks if raw ring-0 execute mode is enabled.
127 *
128 * @returns true if enabled.
129 * @returns false if disabled.
130 * @param pVM The VM to operate on.
131 */
132#define EMIsRawRing0Enabled(pVM) ((pVM)->fRawR0Enabled)
133
134VMMDECL(void) EMSetInhibitInterruptsPC(PVMCPU pVCpu, RTGCUINTPTR PC);
135VMMDECL(RTGCUINTPTR) EMGetInhibitInterruptsPC(PVMCPU pVCpu);
136VMMDECL(int) EMInterpretDisasOne(PVM pVM, PVMCPU pVCpu, PCCPUMCTXCORE pCtxCore, PDISCPUSTATE pCpu, unsigned *pcbInstr);
137VMMDECL(int) EMInterpretDisasOneEx(PVM pVM, PVMCPU pVCpu, RTGCUINTPTR GCPtrInstr, PCCPUMCTXCORE pCtxCore,
138 PDISCPUSTATE pDISState, unsigned *pcbInstr);
139VMMDECL(VBOXSTRICTRC) EMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize);
140VMMDECL(VBOXSTRICTRC) EMInterpretInstructionCPU(PVM pVM, PVMCPU pVCpu, PDISCPUSTATE pDISState, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, EMCODETYPE enmCodeType, uint32_t *pcbSize);
141VMMDECL(int) EMInterpretCpuId(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
142VMMDECL(int) EMInterpretRdtsc(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
143VMMDECL(int) EMInterpretRdpmc(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
144VMMDECL(int) EMInterpretRdtscp(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
145VMMDECL(VBOXSTRICTRC) EMInterpretInvlpg(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pAddrGC);
146VMMDECL(int) EMInterpretIret(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
147VMMDECL(VBOXSTRICTRC) EMInterpretMWait(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
148VMMDECL(int) EMInterpretMonitor(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
149VMMDECL(int) EMInterpretDRxWrite(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegDrx, uint32_t SrcRegGen);
150VMMDECL(int) EMInterpretDRxRead(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegDrx);
151VMMDECL(int) EMInterpretCRxWrite(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegCrx, uint32_t SrcRegGen);
152VMMDECL(int) EMInterpretCRxRead(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegCrx);
153VMMDECL(int) EMInterpretLMSW(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint16_t u16Data);
154VMMDECL(int) EMInterpretCLTS(PVM pVM, PVMCPU pVCpu);
155VMMDECL(VBOXSTRICTRC) EMInterpretPortIO(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, PDISCPUSTATE pCpu, uint32_t cbOp);
156VMMDECL(int) EMInterpretRdmsr(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
157VMMDECL(int) EMInterpretWrmsr(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
158VMMDECL(bool) EMShouldContinueAfterHalt(PVMCPU pVCpu, PCPUMCTX pCtx);
159
160/** @name Assembly routines
161 * @{ */
162VMMDECL(uint32_t) EMEmulateCmp(uint32_t u32Param1, uint64_t u64Param2, size_t cb);
163VMMDECL(uint32_t) EMEmulateAnd(void *pvParam1, uint64_t u64Param2, size_t cb);
164VMMDECL(uint32_t) EMEmulateInc(void *pvParam1, size_t cb);
165VMMDECL(uint32_t) EMEmulateDec(void *pvParam1, size_t cb);
166VMMDECL(uint32_t) EMEmulateOr(void *pvParam1, uint64_t u64Param2, size_t cb);
167VMMDECL(int) EMEmulateLockOr(void *pvParam1, uint64_t u64Param2, size_t cbSize, RTGCUINTREG32 *pf);
168VMMDECL(uint32_t) EMEmulateXor(void *pvParam1, uint64_t u64Param2, size_t cb);
169VMMDECL(int) EMEmulateLockXor(void *pvParam1, uint64_t u64Param2, size_t cbSize, RTGCUINTREG32 *pf);
170VMMDECL(uint32_t) EMEmulateAdd(void *pvParam1, uint64_t u64Param2, size_t cb);
171VMMDECL(int) EMEmulateLockAnd(void *pvParam1, uint64_t u64Param2, size_t cbSize, RTGCUINTREG32 *pf);
172VMMDECL(uint32_t) EMEmulateSub(void *pvParam1, uint64_t u64Param2, size_t cb);
173VMMDECL(uint32_t) EMEmulateAdcWithCarrySet(void *pvParam1, uint64_t u64Param2, size_t cb);
174VMMDECL(uint32_t) EMEmulateBtr(void *pvParam1, uint64_t u64Param2);
175VMMDECL(int) EMEmulateLockBtr(void *pvParam1, uint64_t u64Param2, RTGCUINTREG32 *pf);
176VMMDECL(uint32_t) EMEmulateBts(void *pvParam1, uint64_t u64Param2);
177VMMDECL(uint32_t) EMEmulateBtc(void *pvParam1, uint64_t u64Param2);
178VMMDECL(uint32_t) EMEmulateCmpXchg(void *pvParam1, uint64_t *pu32Param2, uint64_t u32Param3, size_t cbSize);
179VMMDECL(uint32_t) EMEmulateLockCmpXchg(void *pvParam1, uint64_t *pu64Param2, uint64_t u64Param3, size_t cbSize);
180VMMDECL(uint32_t) EMEmulateCmpXchg8b(void *pu32Param1, uint32_t *pEAX, uint32_t *pEDX, uint32_t uEBX, uint32_t uECX);
181VMMDECL(uint32_t) EMEmulateLockCmpXchg8b(void *pu32Param1, uint32_t *pEAX, uint32_t *pEDX, uint32_t uEBX, uint32_t uECX);
182VMMDECL(uint32_t) EMEmulateXAdd(void *pvParam1, void *pvParam2, size_t cbOp);
183VMMDECL(uint32_t) EMEmulateLockXAdd(void *pvParam1, void *pvParam2, size_t cbOp);
184/** @} */
185
186/** @name REM locking routines
187 * @{ */
188VMMDECL(void) EMRemUnlock(PVM pVM);
189VMMDECL(void) EMRemLock(PVM pVM);
190VMMDECL(bool) EMRemIsLockOwner(PVM pVM);
191VMMDECL(int) EMTryEnterRemLock(PVM pVM);
192/** @} */
193
194#ifdef IN_RING3
195/** @defgroup grp_em_r3 The EM Host Context Ring-3 API
196 * @ingroup grp_em
197 * @{
198 */
199VMMR3DECL(int) EMR3Init(PVM pVM);
200VMMR3DECL(void) EMR3Relocate(PVM pVM);
201VMMR3DECL(void) EMR3ResetCpu(PVMCPU pVCpu);
202VMMR3DECL(void) EMR3Reset(PVM pVM);
203VMMR3DECL(int) EMR3Term(PVM pVM);
204VMMR3DECL(DECLNORETURN(void)) EMR3FatalError(PVMCPU pVCpu, int rc);
205VMMR3DECL(int) EMR3ExecuteVM(PVM pVM, PVMCPU pVCpu);
206VMMR3DECL(int) EMR3CheckRawForcedActions(PVM pVM, PVMCPU pVCpu);
207VMMR3DECL(int) EMR3Interpret(PVM pVM);
208
209/**
210 * Command argument for EMR3RawSetMode().
211 *
212 * It's possible to extend this interface to change several
213 * execution modes at once should the need arise.
214 */
215typedef enum EMRAWMODE
216{
217 /** No raw execution. */
218 EMRAW_NONE = 0,
219 /** Enable Only ring-3 raw execution. */
220 EMRAW_RING3_ENABLE,
221 /** Only ring-3 raw execution. */
222 EMRAW_RING3_DISABLE,
223 /** Enable raw ring-0 execution. */
224 EMRAW_RING0_ENABLE,
225 /** Disable raw ring-0 execution. */
226 EMRAW_RING0_DISABLE,
227 EMRAW_END
228} EMRAWMODE;
229
230VMMR3DECL(int) EMR3RawSetMode(PVM pVM, EMRAWMODE enmMode);
231/** @} */
232#endif /* IN_RING3 */
233
234
235#ifdef IN_RC
236/** @defgroup grp_em_gc The EM Guest Context API
237 * @ingroup grp_em
238 * @{
239 */
240VMMRCDECL(int) EMGCTrap(PVM pVM, unsigned uTrap, PCPUMCTXCORE pRegFrame);
241/** @} */
242#endif /* IN_RC */
243
244/** @} */
245
246RT_C_DECLS_END
247
248#endif
249
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette