VirtualBox

source: vbox/trunk/include/VBox/vmapi.h@ 26239

Last change on this file since 26239 was 25838, checked in by vboxsync, 15 years ago

Address todos (changes the protocol for CPU ejection) and make it possible to load a ACPI DSDT from an external AML file

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.5 KB
Line 
1/** @file
2 * VM - The Virtual Machine, API. (VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___VBox_vmapi_h
31#define ___VBox_vmapi_h
32
33#include <VBox/cdefs.h>
34#include <VBox/types.h>
35#include <VBox/stam.h>
36#include <VBox/cfgm.h>
37
38#include <iprt/stdarg.h>
39
40RT_C_DECLS_BEGIN
41
42/** @defgroup grp_vmm_apis VM All Contexts API
43 * @ingroup grp_vm
44 * @{ */
45
46/** @def VM_RC_ADDR
47 * Converts a current context address of data within the VM structure to the equivalent
48 * raw-mode address.
49 *
50 * @returns raw-mode virtual address.
51 * @param pVM Pointer to the VM.
52 * @param pvInVM CC Pointer within the VM.
53 */
54#ifdef IN_RING3
55# define VM_RC_ADDR(pVM, pvInVM) ( (RTRCPTR)((RTRCUINTPTR)pVM->pVMRC + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMR3)) )
56#elif defined(IN_RING0)
57# define VM_RC_ADDR(pVM, pvInVM) ( (RTRCPTR)((RTRCUINTPTR)pVM->pVMRC + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMR0)) )
58#else
59# define VM_RC_ADDR(pVM, pvInVM) ( (RTRCPTR)(pvInVM) )
60#endif
61
62/** @def VM_R3_ADDR
63 * Converts a current context address of data within the VM structure to the equivalent
64 * ring-3 host address.
65 *
66 * @returns host virtual address.
67 * @param pVM Pointer to the VM.
68 * @param pvInVM CC pointer within the VM.
69 */
70#ifdef IN_RC
71# define VM_R3_ADDR(pVM, pvInVM) ( (RTR3PTR)((RTR3UINTPTR)pVM->pVMR3 + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMRC)) )
72#elif defined(IN_RING0)
73# define VM_R3_ADDR(pVM, pvInVM) ( (RTR3PTR)((RTR3UINTPTR)pVM->pVMR3 + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMR0)) )
74#else
75# define VM_R3_ADDR(pVM, pvInVM) ( (RTR3PTR)(pvInVM) )
76#endif
77
78
79/** @def VM_R0_ADDR
80 * Converts a current context address of data within the VM structure to the equivalent
81 * ring-0 host address.
82 *
83 * @returns host virtual address.
84 * @param pVM Pointer to the VM.
85 * @param pvInVM CC pointer within the VM.
86 */
87#ifdef IN_RC
88# define VM_R0_ADDR(pVM, pvInVM) ( (RTR0PTR)((RTR0UINTPTR)pVM->pVMR0 + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMRC)) )
89#elif defined(IN_RING3)
90# define VM_R0_ADDR(pVM, pvInVM) ( (RTR0PTR)((RTR0UINTPTR)pVM->pVMR0 + (uint32_t)((uintptr_t)(pvInVM) - (uintptr_t)pVM->pVMR3)) )
91#else
92# define VM_R0_ADDR(pVM, pvInVM) ( (RTR0PTR)(pvInVM) )
93#endif
94
95
96
97/**
98 * VM error callback function.
99 *
100 * @param pVM The VM handle. Can be NULL if an error occurred before
101 * successfully creating a VM.
102 * @param pvUser The user argument.
103 * @param rc VBox status code.
104 * @param RT_SRC_POS_DECL The source position arguments. See RT_SRC_POS and RT_SRC_POS_ARGS.
105 * @param pszFormat Error message format string.
106 * @param args Error message arguments.
107 */
108typedef DECLCALLBACK(void) FNVMATERROR(PVM pVM, void *pvUser, int rc, RT_SRC_POS_DECL, const char *pszError, va_list args);
109/** Pointer to a VM error callback. */
110typedef FNVMATERROR *PFNVMATERROR;
111
112VMMDECL(int) VMSetError(PVM pVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...);
113VMMDECL(int) VMSetErrorV(PVM pVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list args);
114
115/** @def VM_SET_ERROR
116 * Macro for setting a simple VM error message.
117 * Don't use '%' in the message!
118 *
119 * @returns rc. Meaning you can do:
120 * @code
121 * return VM_SET_ERROR(pVM, VERR_OF_YOUR_CHOICE, "descriptive message");
122 * @endcode
123 * @param pVM VM handle.
124 * @param rc VBox status code.
125 * @param pszMessage Error message string.
126 * @thread Any
127 */
128#define VM_SET_ERROR(pVM, rc, pszMessage) (VMSetError(pVM, rc, RT_SRC_POS, pszMessage))
129
130
131/**
132 * VM runtime error callback function.
133 *
134 * See VMSetRuntimeError for the detailed description of parameters.
135 *
136 * @param pVM The VM handle.
137 * @param pvUser The user argument.
138 * @param fFlags The error flags.
139 * @param pszErrorId Error ID string.
140 * @param pszFormat Error message format string.
141 * @param va Error message arguments.
142 */
143typedef DECLCALLBACK(void) FNVMATRUNTIMEERROR(PVM pVM, void *pvUser, uint32_t fFlags, const char *pszErrorId,
144 const char *pszFormat, va_list va);
145/** Pointer to a VM runtime error callback. */
146typedef FNVMATRUNTIMEERROR *PFNVMATRUNTIMEERROR;
147
148VMMDECL(int) VMSetRuntimeError(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...);
149VMMDECL(int) VMSetRuntimeErrorV(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list args);
150
151/** @name VMSetRuntimeError fFlags
152 * When no flags are given the VM will continue running and it's up to the front
153 * end to take action on the error condition.
154 *
155 * @{ */
156/** The error is fatal.
157 * The VM is not in a state where it can be saved and will enter a state
158 * where it can no longer execute code. The caller <b>must</b> propagate status
159 * codes. */
160#define VMSETRTERR_FLAGS_FATAL RT_BIT_32(0)
161/** Suspend the VM after, or if possible before, raising the error on EMT. The
162 * caller <b>must</b> propagate status codes. */
163#define VMSETRTERR_FLAGS_SUSPEND RT_BIT_32(1)
164/** Don't wait for the EMT to handle the request.
165 * Only valid when on a worker thread and there is a high risk of a dead
166 * lock. Be careful not to flood the user with errors. */
167#define VMSETRTERR_FLAGS_NO_WAIT RT_BIT_32(2)
168/** @} */
169
170/**
171 * VM state callback function.
172 *
173 * You are not allowed to call any function which changes the VM state from a
174 * state callback, except VMR3Destroy().
175 *
176 * @param pVM The VM handle.
177 * @param enmState The new state.
178 * @param enmOldState The old state.
179 * @param pvUser The user argument.
180 */
181typedef DECLCALLBACK(void) FNVMATSTATE(PVM pVM, VMSTATE enmState, VMSTATE enmOldState, void *pvUser);
182/** Pointer to a VM state callback. */
183typedef FNVMATSTATE *PFNVMATSTATE;
184
185VMMDECL(const char *) VMGetStateName(VMSTATE enmState);
186
187
188/**
189 * Request type.
190 */
191typedef enum VMREQTYPE
192{
193 /** Invalid request. */
194 VMREQTYPE_INVALID = 0,
195 /** VM: Internal. */
196 VMREQTYPE_INTERNAL,
197 /** Maximum request type (exclusive). Used for validation. */
198 VMREQTYPE_MAX
199} VMREQTYPE;
200
201/**
202 * Request state.
203 */
204typedef enum VMREQSTATE
205{
206 /** The state is invalid. */
207 VMREQSTATE_INVALID = 0,
208 /** The request have been allocated and is in the process of being filed. */
209 VMREQSTATE_ALLOCATED,
210 /** The request is queued by the requester. */
211 VMREQSTATE_QUEUED,
212 /** The request is begin processed. */
213 VMREQSTATE_PROCESSING,
214 /** The request is completed, the requester is begin notified. */
215 VMREQSTATE_COMPLETED,
216 /** The request packet is in the free chain. (The requester */
217 VMREQSTATE_FREE
218} VMREQSTATE;
219
220/**
221 * Request flags.
222 */
223typedef enum VMREQFLAGS
224{
225 /** The request returns a VBox status code. */
226 VMREQFLAGS_VBOX_STATUS = 0,
227 /** The request is a void request and have no status code. */
228 VMREQFLAGS_VOID = 1,
229 /** Return type mask. */
230 VMREQFLAGS_RETURN_MASK = 1,
231 /** Caller does not wait on the packet, EMT will free it. */
232 VMREQFLAGS_NO_WAIT = 2,
233 /** Poke the destination EMT(s) if executing guest code. Use with care. */
234 VMREQFLAGS_POKE = 4
235} VMREQFLAGS;
236
237
238/**
239 * VM Request packet.
240 *
241 * This is used to request an action in the EMT. Usually the requester is
242 * another thread, but EMT can also end up being the requester in which case
243 * it's carried out synchronously.
244 */
245typedef struct VMREQ
246{
247 /** Pointer to the next request in the chain. */
248 struct VMREQ * volatile pNext;
249 /** Pointer to ring-3 VM structure which this request belongs to. */
250 PUVM pUVM;
251 /** Request state. */
252 volatile VMREQSTATE enmState;
253 /** VBox status code for the completed request. */
254 volatile int iStatus;
255 /** Requester event sem.
256 * The request can use this event semaphore to wait/poll for completion
257 * of the request.
258 */
259 RTSEMEVENT EventSem;
260 /** Set if the event semaphore is clear. */
261 volatile bool fEventSemClear;
262 /** Flags, VMR3REQ_FLAGS_*. */
263 unsigned fFlags;
264 /** Request type. */
265 VMREQTYPE enmType;
266 /** Request destination. */
267 VMCPUID idDstCpu;
268 /** Request specific data. */
269 union VMREQ_U
270 {
271 /** VMREQTYPE_INTERNAL. */
272 struct
273 {
274 /** Pointer to the function to be called. */
275 PFNRT pfn;
276 /** Number of arguments. */
277 unsigned cArgs;
278 /** Array of arguments. */
279 uintptr_t aArgs[64];
280 } Internal;
281 } u;
282} VMREQ;
283/** Pointer to a VM request packet. */
284typedef VMREQ *PVMREQ;
285
286/** @} */
287
288
289#ifndef IN_RC
290/** @defgroup grp_vmm_apis_hc VM Host Context API
291 * @ingroup grp_vm
292 * @{ */
293
294/** @} */
295#endif
296
297
298#ifdef IN_RING3
299/** @defgroup grp_vmm_apis_r3 VM Host Context Ring 3 API
300 * This interface is a _draft_!
301 * @ingroup grp_vm
302 * @{ */
303
304/**
305 * Completion notification codes.
306 */
307typedef enum VMINITCOMPLETED
308{
309 /** The Ring3 init is completed. */
310 VMINITCOMPLETED_RING3 = 1,
311 /** The Ring0 init is completed. */
312 VMINITCOMPLETED_RING0,
313 /** The GC init is completed. */
314 VMINITCOMPLETED_GC
315} VMINITCOMPLETED;
316
317
318VMMR3DECL(int) VMR3Create(uint32_t cCpus, PFNVMATERROR pfnVMAtError, void *pvUserVM, PFNCFGMCONSTRUCTOR pfnCFGMConstructor, void *pvUserCFGM, PVM *ppVM);
319VMMR3DECL(int) VMR3PowerOn(PVM pVM);
320VMMR3DECL(int) VMR3Suspend(PVM pVM);
321VMMR3DECL(int) VMR3Resume(PVM pVM);
322VMMR3DECL(int) VMR3Reset(PVM pVM);
323
324/**
325 * Progress callback.
326 * This will report the completion percentage of an operation.
327 *
328 * @returns VINF_SUCCESS.
329 * @returns Error code to cancel the operation with.
330 * @param pVM The VM handle.
331 * @param uPercent Completetion precentage (0-100).
332 * @param pvUser User specified argument.
333 */
334typedef DECLCALLBACK(int) FNVMPROGRESS(PVM pVM, unsigned uPercent, void *pvUser);
335/** Pointer to a FNVMPROGRESS function. */
336typedef FNVMPROGRESS *PFNVMPROGRESS;
337
338VMMR3DECL(int) VMR3Save(PVM pVM, const char *pszFilename, bool fContinueAfterwards, PFNVMPROGRESS pfnProgress, void *pvUser, bool *pfSuspended);
339VMMR3DECL(int) VMR3Teleport(PVM pVM, uint32_t cMsDowntime, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser, PFNVMPROGRESS pfnProgress, void *pvProgressUser, bool *pfSuspended);
340VMMR3DECL(int) VMR3LoadFromFile(PVM pVM, const char *pszFilename, PFNVMPROGRESS pfnProgress, void *pvUser);
341VMMR3DECL(int) VMR3LoadFromStream(PVM pVM, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser,
342 PFNVMPROGRESS pfnProgress, void *pvProgressUser);
343VMMR3DECL(int) VMR3PowerOff(PVM pVM);
344VMMR3DECL(int) VMR3Destroy(PVM pVM);
345VMMR3DECL(void) VMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
346VMMR3DECL(PVM) VMR3EnumVMs(PVM pVMPrev);
347
348/**
349 * VM destruction callback.
350 * @param pVM The VM which is about to be destroyed.
351 * @param pvUser The user parameter specified at registration.
352 */
353typedef DECLCALLBACK(void) FNVMATDTOR(PVM pVM, void *pvUser);
354/** Pointer to a VM destruction callback. */
355typedef FNVMATDTOR *PFNVMATDTOR;
356
357VMMR3DECL(int) VMR3AtDtorRegister(PFNVMATDTOR pfnAtDtor, void *pvUser);
358VMMR3DECL(int) VMR3AtDtorDeregister(PFNVMATDTOR pfnAtDtor);
359VMMR3DECL(int) VMR3AtStateRegister(PVM pVM, PFNVMATSTATE pfnAtState, void *pvUser);
360VMMR3DECL(int) VMR3AtStateDeregister(PVM pVM, PFNVMATSTATE pfnAtState, void *pvUser);
361VMMR3DECL(VMSTATE) VMR3GetState(PVM pVM);
362VMMR3DECL(const char *) VMR3GetStateName(VMSTATE enmState);
363VMMR3DECL(bool) VMR3TeleportedAndNotFullyResumedYet(PVM pVM);
364VMMR3DECL(int) VMR3AtErrorRegister(PVM pVM, PFNVMATERROR pfnAtError, void *pvUser);
365VMMR3DECL(int) VMR3AtErrorRegisterU(PUVM pVM, PFNVMATERROR pfnAtError, void *pvUser);
366VMMR3DECL(int) VMR3AtErrorDeregister(PVM pVM, PFNVMATERROR pfnAtError, void *pvUser);
367VMMR3DECL(void) VMR3SetErrorWorker(PVM pVM);
368VMMR3DECL(uint32_t) VMR3GetErrorCount(PVM pVM);
369VMMR3DECL(int) VMR3AtRuntimeErrorRegister(PVM pVM, PFNVMATRUNTIMEERROR pfnAtRuntimeError, void *pvUser);
370VMMR3DECL(int) VMR3AtRuntimeErrorDeregister(PVM pVM, PFNVMATRUNTIMEERROR pfnAtRuntimeError, void *pvUser);
371VMMR3DECL(int) VMR3SetRuntimeErrorWorker(PVM pVM);
372VMMR3DECL(uint32_t) VMR3GetRuntimeErrorCount(PVM pVM);
373VMMR3DECL(int) VMR3ReqCall(PVM pVM, VMCPUID idDstCpu, PVMREQ *ppReq, RTMSINTERVAL cMillies, uint32_t fFlags, PFNRT pfnFunction, unsigned cArgs, ...);
374VMMR3DECL(int) VMR3ReqCallU(PUVM pUVM, VMCPUID idDstCpu, PVMREQ *ppReq, RTMSINTERVAL cMillies, uint32_t fFlags, PFNRT pfnFunction, unsigned cArgs, ...);
375VMMR3DECL(int) VMR3ReqCallVU(PUVM pUVM, VMCPUID idDstCpu, PVMREQ *ppReq, RTMSINTERVAL cMillies, uint32_t fFlags, PFNRT pfnFunction, unsigned cArgs, va_list Args);
376VMMR3DECL(int) VMR3ReqCallWait(PVM pVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
377VMMR3DECL(int) VMR3ReqCallWaitU(PUVM pUVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
378VMMR3DECL(int) VMR3ReqCallNoWait(PVM pVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
379VMMR3DECL(int) VMR3ReqCallNoWaitU(PUVM pUVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
380VMMR3DECL(int) VMR3ReqCallVoidWait(PVM pVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
381VMMR3DECL(int) VMR3ReqCallVoidWaitU(PUVM pUVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
382VMMR3DECL(int) VMR3ReqCallVoidNoWait(PVM pVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
383VMMR3DECL(int) VMR3ReqCallVoidNoWaitU(PUVM pUVM, VMCPUID idDstCpu, PFNRT pfnFunction, unsigned cArgs, ...);
384VMMR3DECL(int) VMR3ReqAlloc(PVM pVM, PVMREQ *ppReq, VMREQTYPE enmType, VMCPUID idDstCpu);
385VMMR3DECL(int) VMR3ReqAllocU(PUVM pUVM, PVMREQ *ppReq, VMREQTYPE enmType, VMCPUID idDstCpu);
386VMMR3DECL(int) VMR3ReqFree(PVMREQ pReq);
387VMMR3DECL(int) VMR3ReqQueue(PVMREQ pReq, RTMSINTERVAL cMillies);
388VMMR3DECL(int) VMR3ReqWait(PVMREQ pReq, RTMSINTERVAL cMillies);
389VMMR3DECL(int) VMR3ReqProcessU(PUVM pUVM, VMCPUID idDstCpu);
390VMMR3DECL(void) VMR3NotifyGlobalFFU(PUVM pUVM, uint32_t fFlags);
391VMMR3DECL(void) VMR3NotifyCpuFFU(PUVMCPU pUVMCpu, uint32_t fFlags);
392/** @name Flags for VMR3NotifyCpuFFU and VMR3NotifyGlobalFFU.
393 * @{ */
394/** Whether we've done REM or not. */
395#define VMNOTIFYFF_FLAGS_DONE_REM RT_BIT_32(0)
396/** Whether we should poke the CPU if it's executing guest code. */
397#define VMNOTIFYFF_FLAGS_POKE RT_BIT_32(1)
398/** @} */
399
400VMMR3DECL(int) VMR3WaitHalted(PVM pVM, PVMCPU pVCpu, bool fIgnoreInterrupts);
401VMMR3DECL(int) VMR3WaitU(PUVMCPU pUVMCpu);
402VMMR3_INT_DECL(int) VMR3AsyncPdmNotificationWaitU(PUVMCPU pUVCpu);
403VMMR3_INT_DECL(void) VMR3AsyncPdmNotificationWakeupU(PUVM pUVM);
404VMMR3DECL(RTCPUID) VMR3GetVMCPUId(PVM pVM);
405VMMR3DECL(RTTHREAD) VMR3GetVMCPUThread(PVM pVM);
406VMMR3DECL(RTTHREAD) VMR3GetVMCPUThreadU(PUVM pUVM);
407VMMR3DECL(RTNATIVETHREAD) VMR3GetVMCPUNativeThread(PVM pVM);
408VMMR3DECL(RTNATIVETHREAD) VMR3GetVMCPUNativeThreadU(PUVM pUVM);
409VMMR3DECL(int) VMR3GetCpuCoreAndPackageIdFromCpuId(PVM pVM, VMCPUID idCpu, uint32_t *pidCpuCore, uint32_t *pidCpuPackage);
410VMMR3DECL(int) VMR3HotUnplugCpu(PVM pVM, VMCPUID idCpu);
411VMMR3DECL(int) VMR3HotPlugCpu(PVM pVM, VMCPUID idCpu);
412
413/** @} */
414#endif /* IN_RING3 */
415
416
417#ifdef IN_RC
418/** @defgroup grp_vmm_apis_gc VM Guest Context APIs
419 * @ingroup grp_vm
420 * @{ */
421
422/** @} */
423#endif
424
425RT_C_DECLS_END
426
427/** @} */
428
429#endif
430
431
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