VirtualBox

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

Last change on this file since 5605 was 5384, checked in by vboxsync, 17 years ago

LOCK BTR and LOCK OR (for Solaris guests).

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