VirtualBox

source: vbox/trunk/src/VBox/VMM/SSMInternal.h@ 25659

Last change on this file since 25659 was 24804, checked in by vboxsync, 15 years ago

SSM: Added the pass to the statistics (so it's possible to watch progress).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.6 KB
Line 
1/* $Id: SSMInternal.h 24804 2009-11-19 18:15:25Z vboxsync $ */
2/** @file
3 * SSM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#ifndef ___SSMInternal_h
23#define ___SSMInternal_h
24
25#include <VBox/cdefs.h>
26#include <VBox/types.h>
27#include <VBox/ssm.h>
28#include <iprt/critsect.h>
29
30RT_C_DECLS_BEGIN
31
32/** @defgroup grp_ssm_int Internals
33 * @ingroup grp_ssm
34 * @internal
35 * @{
36 */
37
38
39/**
40 * Data unit callback type.
41 */
42typedef enum SSMUNITTYPE
43{
44 /** PDM Device . */
45 SSMUNITTYPE_DEV = 1,
46 /** PDM Driver. */
47 SSMUNITTYPE_DRV,
48 /** VM Internal. */
49 SSMUNITTYPE_INTERNAL,
50 /** External Wrapper. */
51 SSMUNITTYPE_EXTERNAL
52} SSMUNITTYPE;
53
54/** Pointer to a data unit descriptor. */
55typedef struct SSMUNIT *PSSMUNIT;
56
57/**
58 * Data unit descriptor.
59 */
60typedef struct SSMUNIT
61{
62 /** Pointer ot the next one in the list. */
63 PSSMUNIT pNext;
64
65 /** Called in this save/load operation.
66 * The flag is used to determin whether there is need for a call to
67 * done or not. */
68 bool fCalled;
69 /** Finished its live part.
70 * This is used to handle VERR_SSM_VOTE_FOR_GIVING_UP. */
71 bool fDoneLive;
72 /** Callback interface type. */
73 SSMUNITTYPE enmType;
74 /** Type specific data. */
75 union
76 {
77 /** SSMUNITTYPE_DEV. */
78 struct
79 {
80 /** Prepare live save. */
81 PFNSSMDEVLIVEPREP pfnLivePrep;
82 /** Execute live save. */
83 PFNSSMDEVLIVEEXEC pfnLiveExec;
84 /** Vote live save complete. */
85 PFNSSMDEVLIVEVOTE pfnLiveVote;
86 /** Prepare save. */
87 PFNSSMDEVSAVEPREP pfnSavePrep;
88 /** Execute save. */
89 PFNSSMDEVSAVEEXEC pfnSaveExec;
90 /** Done save. */
91 PFNSSMDEVSAVEDONE pfnSaveDone;
92 /** Prepare load. */
93 PFNSSMDEVLOADPREP pfnLoadPrep;
94 /** Execute load. */
95 PFNSSMDEVLOADEXEC pfnLoadExec;
96 /** Done load. */
97 PFNSSMDEVLOADDONE pfnLoadDone;
98 /** Device instance. */
99 PPDMDEVINS pDevIns;
100 } Dev;
101
102 /** SSMUNITTYPE_DRV. */
103 struct
104 {
105 /** Prepare live save. */
106 PFNSSMDRVLIVEPREP pfnLivePrep;
107 /** Execute live save. */
108 PFNSSMDRVLIVEEXEC pfnLiveExec;
109 /** Vote live save complete. */
110 PFNSSMDRVLIVEVOTE pfnLiveVote;
111 /** Prepare save. */
112 PFNSSMDRVSAVEPREP pfnSavePrep;
113 /** Execute save. */
114 PFNSSMDRVSAVEEXEC pfnSaveExec;
115 /** Done save. */
116 PFNSSMDRVSAVEDONE pfnSaveDone;
117 /** Prepare load. */
118 PFNSSMDRVLOADPREP pfnLoadPrep;
119 /** Execute load. */
120 PFNSSMDRVLOADEXEC pfnLoadExec;
121 /** Done load. */
122 PFNSSMDRVLOADDONE pfnLoadDone;
123 /** Driver instance. */
124 PPDMDRVINS pDrvIns;
125 } Drv;
126
127 /** SSMUNITTYPE_INTERNAL. */
128 struct
129 {
130 /** Prepare live save. */
131 PFNSSMINTLIVEPREP pfnLivePrep;
132 /** Execute live save. */
133 PFNSSMINTLIVEEXEC pfnLiveExec;
134 /** Vote live save complete. */
135 PFNSSMINTLIVEVOTE pfnLiveVote;
136 /** Prepare save. */
137 PFNSSMINTSAVEPREP pfnSavePrep;
138 /** Execute save. */
139 PFNSSMINTSAVEEXEC pfnSaveExec;
140 /** Done save. */
141 PFNSSMINTSAVEDONE pfnSaveDone;
142 /** Prepare load. */
143 PFNSSMINTLOADPREP pfnLoadPrep;
144 /** Execute load. */
145 PFNSSMINTLOADEXEC pfnLoadExec;
146 /** Done load. */
147 PFNSSMINTLOADDONE pfnLoadDone;
148 } Internal;
149
150 /** SSMUNITTYPE_EXTERNAL. */
151 struct
152 {
153 /** Prepare live save. */
154 PFNSSMEXTLIVEPREP pfnLivePrep;
155 /** Execute live save. */
156 PFNSSMEXTLIVEEXEC pfnLiveExec;
157 /** Vote live save complete. */
158 PFNSSMEXTLIVEVOTE pfnLiveVote;
159 /** Prepare save. */
160 PFNSSMEXTSAVEPREP pfnSavePrep;
161 /** Execute save. */
162 PFNSSMEXTSAVEEXEC pfnSaveExec;
163 /** Done save. */
164 PFNSSMEXTSAVEDONE pfnSaveDone;
165 /** Prepare load. */
166 PFNSSMEXTLOADPREP pfnLoadPrep;
167 /** Execute load. */
168 PFNSSMEXTLOADEXEC pfnLoadExec;
169 /** Done load. */
170 PFNSSMEXTLOADDONE pfnLoadDone;
171 /** User data. */
172 void *pvUser;
173 } External;
174
175 struct
176 {
177 /** Prepare live save. */
178 PFNRT pfnLivePrep;
179 /** Execute live save. */
180 PFNRT pfnLiveExec;
181 /** Vote live save complete. */
182 PFNRT pfnLiveVote;
183 /** Prepare save. */
184 PFNRT pfnSavePrep;
185 /** Execute save. */
186 PFNRT pfnSaveExec;
187 /** Done save. */
188 PFNRT pfnSaveDone;
189 /** Prepare load. */
190 PFNRT pfnLoadPrep;
191 /** Execute load. */
192 PFNRT pfnLoadExec;
193 /** Done load. */
194 PFNRT pfnLoadDone;
195 /** User data. */
196 void *pvKey;
197 } Common;
198 } u;
199 /** Data layout version. */
200 uint32_t u32Version;
201 /** Instance number. */
202 uint32_t u32Instance;
203 /** The offset of the final data unit.
204 * This is used for constructing the directory. */
205 RTFOFF offStream;
206 /** The guessed size of the data unit - used only for progress indication. */
207 size_t cbGuess;
208 /** Name size. (bytes) */
209 size_t cchName;
210 /** Name of this unit. (extends beyond the defined size) */
211 char szName[1];
212} SSMUNIT;
213
214AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Dev.pfnLivePrep);
215AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Dev.pfnLiveExec);
216AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Dev.pfnLiveVote);
217AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Dev.pfnSavePrep);
218AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Dev.pfnSaveExec);
219AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Dev.pfnSaveDone);
220AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Dev.pfnLoadPrep);
221AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Dev.pfnLoadExec);
222AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Dev.pfnLoadDone);
223AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.Dev.pDevIns);
224
225AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Drv.pfnLivePrep);
226AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Drv.pfnLiveExec);
227AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Drv.pfnLiveVote);
228AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Drv.pfnSavePrep);
229AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Drv.pfnSaveExec);
230AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Drv.pfnSaveDone);
231AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Drv.pfnLoadPrep);
232AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Drv.pfnLoadExec);
233AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Drv.pfnLoadDone);
234AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.Drv.pDrvIns);
235
236AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Internal.pfnLivePrep);
237AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Internal.pfnLiveExec);
238AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Internal.pfnLiveVote);
239AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Internal.pfnSavePrep);
240AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Internal.pfnSaveExec);
241AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Internal.pfnSaveDone);
242AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Internal.pfnLoadPrep);
243AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Internal.pfnLoadExec);
244AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Internal.pfnLoadDone);
245
246AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.External.pfnLivePrep);
247AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.External.pfnLiveExec);
248AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.External.pfnLiveVote);
249AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.External.pfnSavePrep);
250AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.External.pfnSaveExec);
251AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.External.pfnSaveDone);
252AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.External.pfnLoadPrep);
253AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.External.pfnLoadExec);
254AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.External.pfnLoadDone);
255AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.External.pvUser);
256
257
258/**
259 * SSM VM Instance data.
260 * Changes to this must checked against the padding of the cfgm union in VM!
261 *
262 * @todo Move this to UVM.
263 */
264typedef struct SSM
265{
266 /** Critical section for serializing cancellation (pSSM). */
267 RTCRITSECT CancelCritSect;
268 /** The handle of the current save or load operation.
269 * This is used by SSMR3Cancel. */
270 PSSMHANDLE volatile pSSM;
271
272 /** FIFO of data entity descriptors. */
273 R3PTRTYPE(PSSMUNIT) pHead;
274 /** The number of register units. */
275 uint32_t cUnits;
276 /** For lazy init. */
277 bool fInitialized;
278 /** Current pass (for STAM). */
279 uint32_t uPass;
280 uint32_t u32Alignment;
281} SSM;
282/** Pointer to SSM VM instance data. */
283typedef SSM *PSSM;
284
285
286
287/** @} */
288
289RT_C_DECLS_END
290
291#endif /* !___SSMInternal_h */
292
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