VirtualBox

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

Last change on this file since 3786 was 3632, checked in by vboxsync, 17 years ago

VBox_hdr_h -> _VBox_hdr_h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.2 KB
Line 
1/** @file
2 * EM - Execution Monitor.
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
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 as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef ___VBox_em_h
22#define ___VBox_em_h
23
24#include <VBox/cdefs.h>
25#include <VBox/types.h>
26#include <VBox/trpm.h>
27#include <VBox/cpum.h>
28#include <VBox/dis.h>
29
30__BEGIN_DECLS
31
32/** @defgroup grp_em The Execution Monitor API
33 * @{
34 */
35
36/** Enable to allow V86 code to run in raw mode. */
37#define VBOX_RAW_V86
38
39/**
40 * The Execution Manager State.
41 */
42typedef enum EMSTATE
43{
44 /** Not yet started. */
45 EMSTATE_NONE = 1,
46 /** Raw-mode execution. */
47 EMSTATE_RAW,
48 /** Hardware accelerated raw-mode execution. */
49 EMSTATE_HWACC,
50 /** Recompiled mode execution. */
51 EMSTATE_REM,
52 /** Execution is halted. (waiting for interrupt) */
53 EMSTATE_HALTED,
54 /** Execution is suspended. */
55 EMSTATE_SUSPENDED,
56 /** The VM is terminating. */
57 EMSTATE_TERMINATING,
58 /** Guest debug event from raw-mode is being processed. */
59 EMSTATE_DEBUG_GUEST_RAW,
60 /** Guest debug event from hardware accelerated mode is being processed. */
61 EMSTATE_DEBUG_GUEST_HWACC,
62 /** Guest debug event from recompiled-mode is being processed. */
63 EMSTATE_DEBUG_GUEST_REM,
64 /** Hypervisor debug event being processed. */
65 EMSTATE_DEBUG_HYPER,
66 /** The VM has encountered a fatal error. (And everyone is panicing....) */
67 EMSTATE_GURU_MEDITATION,
68 /** Just a hack to ensure that we get a 32-bit integer. */
69 EMSTATE_MAKE_32BIT_HACK = 0x7fffffff
70} EMSTATE;
71
72
73/**
74 * Get the current execution manager status.
75 *
76 * @returns Current status.
77 */
78EMDECL(EMSTATE) EMGetState(PVM pVM);
79
80/**
81 * Checks if raw ring-3 execute mode is enabled.
82 *
83 * @returns true if enabled.
84 * @returns false if disabled.
85 * @param pVM The VM to operate on.
86 */
87#define EMIsRawRing3Enabled(pVM) ((pVM)->fRawR3Enabled)
88
89/**
90 * Checks if raw ring-0 execute mode is enabled.
91 *
92 * @returns true if enabled.
93 * @returns false if disabled.
94 * @param pVM The VM to operate on.
95 */
96#define EMIsRawRing0Enabled(pVM) ((pVM)->fRawR0Enabled)
97
98/**
99 * Sets the PC for which interrupts should be inhibited.
100 *
101 * @param pVM The VM handle.
102 * @param PC The PC.
103 */
104EMDECL(void) EMSetInhibitInterruptsPC(PVM pVM, RTGCUINTPTR PC);
105
106/**
107 * Gets the PC for which interrupts should be inhibited.
108 *
109 * There are a few instructions which inhibits or delays interrupts
110 * for the instruction following them. These instructions are:
111 * - STI
112 * - MOV SS, r/m16
113 * - POP SS
114 *
115 * @returns The PC for which interrupts should be inhibited.
116 * @param pVM VM handle.
117 *
118 */
119EMDECL(RTGCUINTPTR) EMGetInhibitInterruptsPC(PVM pVM);
120
121/**
122 * Disassembles one instruction.
123 *
124 * @param pVM The VM handle.
125 * @param pCtxCore The context core (used for both the mode and instruction).
126 * @param pCpu Where to return the parsed instruction info.
127 * @param pcbInstr Where to return the instruction size. (optional)
128 */
129EMDECL(int) EMInterpretDisasOne(PVM pVM, PCCPUMCTXCORE pCtxCore, PDISCPUSTATE pCpu, unsigned *pcbInstr);
130
131/**
132 * Disassembles one instruction.
133 *
134 * This is used by internally by the interpreter and by trap/access handlers.
135 *
136 * @param pVM The VM handle.
137 * @param GCPtrInstr The flat address of the instruction.
138 * @param pCtxCore The context core (used to determin the cpu mode).
139 * @param pCpu Where to return the parsed instruction info.
140 * @param pcbInstr Where to return the instruction size. (optional)
141 */
142EMDECL(int) EMInterpretDisasOneEx(PVM pVM, RTGCUINTPTR GCPtrInstr, PCCPUMCTXCORE pCtxCore,
143 PDISCPUSTATE pCpu, unsigned *pcbInstr);
144
145/**
146 * Interprets the current instruction.
147 *
148 * @returns VBox status code.
149 * @retval VINF_* Scheduling instructions.
150 * @retval VERR_EM_INTERPRETER Something we can't cope with.
151 * @retval VERR_* Fatal errors.
152 *
153 * @param pVM The VM handle.
154 * @param pRegFrame The register frame.
155 * Updates the EIP if an instruction was executed successfully.
156 * @param pvFault The fault address (CR2).
157 * @param pcbSize Size of the write (if applicable).
158 *
159 * @remark Invalid opcode exceptions have a higher priority than GP (see Intel
160 * Architecture System Developers Manual, Vol 3, 5.5) so we don't need
161 * to worry about e.g. invalid modrm combinations (!)
162 */
163EMDECL(int) EMInterpretInstruction(PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize);
164
165/**
166 * Interprets the current instruction using the supplied DISCPUSTATE structure.
167 *
168 * EIP is *NOT* updated!
169 *
170 * @returns VBox status code.
171 * @retval VINF_* Scheduling instructions. When these are returned, it
172 * starts to get a bit tricky to know whether code was
173 * executed or not... We'll address this when it becomes a problem.
174 * @retval VERR_EM_INTERPRETER Something we can't cope with.
175 * @retval VERR_* Fatal errors.
176 *
177 * @param pVM The VM handle.
178 * @param pCpu The disassembler cpu state for the instruction to be interpreted.
179 * @param pRegFrame The register frame. EIP is *NOT* changed!
180 * @param pvFault The fault address (CR2).
181 * @param pcbSize Size of the write (if applicable).
182 *
183 * @remark Invalid opcode exceptions have a higher priority than GP (see Intel
184 * Architecture System Developers Manual, Vol 3, 5.5) so we don't need
185 * to worry about e.g. invalid modrm combinations (!)
186 */
187EMDECL(int) EMInterpretInstructionCPU(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize);
188
189/**
190 * Interpret CPUID given the parameters in the CPU context
191 *
192 * @returns VBox status code.
193 * @param pVM The VM handle.
194 * @param pRegFrame The register frame.
195 *
196 */
197EMDECL(int) EMInterpretCpuId(PVM pVM, PCPUMCTXCORE pRegFrame);
198
199/**
200 * Interpret RDTSC
201 *
202 * @returns VBox status code.
203 * @param pVM The VM handle.
204 * @param pRegFrame The register frame.
205 *
206 */
207EMDECL(int) EMInterpretRdtsc(PVM pVM, PCPUMCTXCORE pRegFrame);
208
209/**
210 * Interpret INVLPG
211 *
212 * @returns VBox status code.
213 * @param pVM The VM handle.
214 * @param pRegFrame The register frame.
215 * @param pAddrGC Operand address
216 *
217 */
218EMDECL(int) EMInterpretInvlpg(PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pAddrGC);
219
220/**
221 * Interpret IRET (currently only to V86 code)
222 *
223 * @returns VBox status code.
224 * @param pVM The VM handle.
225 * @param pRegFrame The register frame.
226 *
227 */
228EMDECL(int) EMInterpretIret(PVM pVM, PCPUMCTXCORE pRegFrame);
229
230/**
231 * Interpret DRx write
232 *
233 * @returns VBox status code.
234 * @param pVM The VM handle.
235 * @param pRegFrame The register frame.
236 * @param DestRegDRx DRx register index (USE_REG_DR*)
237 * @param SrcRegGen General purpose register index (USE_REG_E**))
238 *
239 */
240EMDECL(int) EMInterpretDRxWrite(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t DestRegDrx, uint32_t SrcRegGen);
241
242/**
243 * Interpret DRx read
244 *
245 * @returns VBox status code.
246 * @param pVM The VM handle.
247 * @param pRegFrame The register frame.
248 * @param DestRegGen General purpose register index (USE_REG_E**))
249 * @param SrcRegDRx DRx register index (USE_REG_DR*)
250 *
251 */
252EMDECL(int) EMInterpretDRxRead(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegDrx);
253
254/**
255 * Interpret CRx write
256 *
257 * @returns VBox status code.
258 * @param pVM The VM handle.
259 * @param pRegFrame The register frame.
260 * @param DestRegCRx DRx register index (USE_REG_CR*)
261 * @param SrcRegGen General purpose register index (USE_REG_E**))
262 *
263 */
264EMDECL(int) EMInterpretCRxWrite(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t DestRegCrx, uint32_t SrcRegGen);
265
266/**
267 * Interpret CRx read
268 *
269 * @returns VBox status code.
270 * @param pVM The VM handle.
271 * @param pRegFrame The register frame.
272 * @param DestRegGen General purpose register index (USE_REG_E**))
273 * @param SrcRegCRx CRx register index (USE_REG_CR*)
274 *
275 */
276EMDECL(int) EMInterpretCRxRead(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegCrx);
277
278/**
279 * Interpret LMSW
280 *
281 * @returns VBox status code.
282 * @param pVM The VM handle.
283 * @param u16Data LMSW source data.
284 */
285EMDECL(int) EMInterpretLMSW(PVM pVM, uint16_t u16Data);
286
287/**
288 * Interpret CLTS
289 *
290 * @returns VBox status code.
291 * @param pVM The VM handle.
292 *
293 */
294EMDECL(int) EMInterpretCLTS(PVM pVM);
295
296/**
297 * Interpret a port I/O instruction.
298 *
299 * @returns VBox status code suitable for scheduling.
300 * @param pVM The VM handle.
301 * @param pCtxCore The context core. This will be updated on successful return.
302 * @param pCpu The instruction to interpret.
303 * @param cbOp The size of the instruction.
304 * @remark This may raise exceptions.
305 */
306EMDECL(int) EMInterpretPortIO(PVM pVM, PCPUMCTXCORE pCtxCore, PDISCPUSTATE pCpu, uint32_t cbOp);
307
308EMDECL(uint32_t) EMEmulateCmp(uint32_t u32Param1, uint32_t u32Param2, size_t cb);
309EMDECL(uint32_t) EMEmulateAnd(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
310EMDECL(uint32_t) EMEmulateInc(uint32_t *pu32Param1, size_t cb);
311EMDECL(uint32_t) EMEmulateDec(uint32_t *pu32Param1, size_t cb);
312EMDECL(uint32_t) EMEmulateOr(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
313EMDECL(uint32_t) EMEmulateXor(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
314EMDECL(uint32_t) EMEmulateAdd(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
315EMDECL(uint32_t) EMEmulateSub(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
316EMDECL(uint32_t) EMEmulateAdcWithCarrySet(uint32_t *pu32Param1, uint32_t u32Param2, size_t cb);
317EMDECL(uint32_t) EMEmulateBtr(uint32_t *pu32Param1, uint32_t u32Param2);
318EMDECL(uint32_t) EMEmulateBts(uint32_t *pu32Param1, uint32_t u32Param2);
319EMDECL(uint32_t) EMEmulateBtc(uint32_t *pu32Param1, uint32_t u32Param2);
320
321#ifdef IN_RING3
322/** @defgroup grp_em_r3 The EM Host Context Ring-3 API
323 * @ingroup grp_em
324 * @{
325 */
326
327/**
328 * Initializes the EM.
329 *
330 * @returns VBox status code.
331 * @param pVM The VM to operate on.
332 */
333EMR3DECL(int) EMR3Init(PVM pVM);
334
335/**
336 * Applies relocations to data and code managed by this
337 * component. This function will be called at init and
338 * whenever the VMM need to relocate it self inside the GC.
339 *
340 * @param pVM The VM.
341 */
342EMR3DECL(void) EMR3Relocate(PVM pVM);
343
344/**
345 * Reset notification.
346 *
347 * @param pVM
348 */
349EMR3DECL(void) EMR3Reset(PVM pVM);
350
351/**
352 * Terminates the EM.
353 *
354 * Termination means cleaning up and freeing all resources,
355 * the VM it self is at this point powered off or suspended.
356 *
357 * @returns VBox status code.
358 * @param pVM The VM to operate on.
359 */
360EMR3DECL(int) EMR3Term(PVM pVM);
361
362
363/**
364 * Command argument for EMR3RawSetMode().
365 *
366 * It's possible to extend this interface to change several
367 * execution modes at once should the need arise.
368 */
369typedef enum EMRAWMODE
370{
371 /** No raw execution. */
372 EMRAW_NONE = 0,
373 /** Enable Only ring-3 raw execution. */
374 EMRAW_RING3_ENABLE,
375 /** Only ring-3 raw execution. */
376 EMRAW_RING3_DISABLE,
377 /** Enable raw ring-0 execution. */
378 EMRAW_RING0_ENABLE,
379 /** Disable raw ring-0 execution. */
380 EMRAW_RING0_DISABLE,
381 EMRAW_END
382} EMRAWMODE;
383
384/**
385 * Enables or disables a set of raw-mode execution modes.
386 *
387 * @returns VINF_SUCCESS on success.
388 * @returns VINF_RESCHEDULE if a rescheduling might be required.
389 * @returns VERR_INVALID_PARAMETER on an invalid enmMode value.
390 *
391 * @param pVM The VM to operate on.
392 * @param enmMode The execution mode change.
393 * @thread The emulation thread.
394 */
395EMR3DECL(int) EMR3RawSetMode(PVM pVM, EMRAWMODE enmMode);
396
397/**
398 * Raise a fatal error.
399 *
400 * Safely terminate the VM with full state report and stuff. This function
401 * will naturally never return.
402 *
403 * @param pVM VM handle.
404 * @param rc VBox status code.
405 */
406EMR3DECL(void) EMR3FatalError(PVM pVM, int rc);
407
408/**
409 * Execute VM
410 *
411 * This function is the main loop of the VM. The emulation thread
412 * calls this function when the VM has been successfully constructed
413 * and we're ready for executing the VM.
414 *
415 * Returning from this function means that the VM is turned off or
416 * suspended (state already saved) and deconstruction in next in line.
417 *
418 * @returns VBox status code.
419 * @param pVM The VM to operate on.
420 */
421EMR3DECL(int) EMR3ExecuteVM(PVM pVM);
422
423/**
424 * Check for pending raw actions
425 *
426 * @returns VBox status code.
427 * @param pVM The VM to operate on.
428 */
429EMR3DECL(int) EMR3CheckRawForcedActions(PVM pVM);
430
431/**
432 * Interpret instructions.
433 * This works directly on the Guest CPUM context.
434 * The interpretation will try execute at least one instruction. It will
435 * stop when a we're better off in a raw or recompiler mode.
436 *
437 * @returns Todo - status describing what to do next?
438 * @param pVM The VM to operate on.
439 */
440EMR3DECL(int) EMR3Interpret(PVM pVM);
441
442/** @} */
443#endif
444
445
446#ifdef IN_GC
447/** @defgroup grp_em_gc The EM Guest Context API
448 * @ingroup grp_em
449 * @{
450 */
451
452/**
453 * Decide what to do with a trap.
454 *
455 * @returns Next VMM state.
456 * @returns Might not return at all?
457 * @param pVM The VM to operate on.
458 * @param uTrap The trap number.
459 * @param pRegFrame Register frame to operate on.
460 */
461EMGCDECL(int) EMGCTrap(PVM pVM, unsigned uTrap, PCPUMCTXCORE pRegFrame);
462
463EMGCDECL(uint32_t) EMGCEmulateLockCmpXchg(RTGCPTR pu32Param1, uint32_t *pu32Param2, uint32_t u32Param3, size_t cbSize);
464EMGCDECL(uint32_t) EMGCEmulateCmpXchg(RTGCPTR pu32Param1, uint32_t *pu32Param2, uint32_t u32Param3, size_t cbSize);
465
466/** @} */
467#endif
468
469/** @} */
470
471__END_DECLS
472
473#endif
474
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