VirtualBox

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

Last change on this file since 94249 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 12.3 KB
Line 
1/* $Id: SSMInternal.h 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * SSM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2022 Oracle Corporation
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
18#ifndef VMM_INCLUDED_SRC_include_SSMInternal_h
19#define VMM_INCLUDED_SRC_include_SSMInternal_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include <VBox/cdefs.h>
25#include <VBox/types.h>
26#include <VBox/vmm/ssm.h>
27#include <iprt/critsect.h>
28
29RT_C_DECLS_BEGIN
30
31/** @defgroup grp_ssm_int Internals
32 * @ingroup grp_ssm
33 * @internal
34 * @{
35 */
36
37
38/**
39 * Data unit callback type.
40 */
41typedef enum SSMUNITTYPE
42{
43 /** PDM Device . */
44 SSMUNITTYPE_DEV = 1,
45 /** PDM Driver. */
46 SSMUNITTYPE_DRV,
47 /** PDM USB device. */
48 SSMUNITTYPE_USB,
49 /** VM Internal. */
50 SSMUNITTYPE_INTERNAL,
51 /** External Wrapper. */
52 SSMUNITTYPE_EXTERNAL
53} SSMUNITTYPE;
54
55/** Pointer to a data unit descriptor. */
56typedef struct SSMUNIT *PSSMUNIT;
57
58/**
59 * Data unit descriptor.
60 */
61typedef struct SSMUNIT
62{
63 /** Pointer ot the next one in the list. */
64 PSSMUNIT pNext;
65
66 /** Called in this save/load operation.
67 * The flag is used to determine whether there is need for a call to
68 * done or not. */
69 bool fCalled;
70 /** Finished its live part.
71 * This is used to handle VERR_SSM_VOTE_FOR_GIVING_UP. */
72 bool fDoneLive;
73 /** Callback interface type. */
74 SSMUNITTYPE enmType;
75 /** Type specific data. */
76 union
77 {
78 /** SSMUNITTYPE_DEV. */
79 struct
80 {
81 /** Prepare live save. */
82 PFNSSMDEVLIVEPREP pfnLivePrep;
83 /** Execute live save. */
84 PFNSSMDEVLIVEEXEC pfnLiveExec;
85 /** Vote live save complete. */
86 PFNSSMDEVLIVEVOTE pfnLiveVote;
87 /** Prepare save. */
88 PFNSSMDEVSAVEPREP pfnSavePrep;
89 /** Execute save. */
90 PFNSSMDEVSAVEEXEC pfnSaveExec;
91 /** Done save. */
92 PFNSSMDEVSAVEDONE pfnSaveDone;
93 /** Prepare load. */
94 PFNSSMDEVLOADPREP pfnLoadPrep;
95 /** Execute load. */
96 PFNSSMDEVLOADEXEC pfnLoadExec;
97 /** Done load. */
98 PFNSSMDEVLOADDONE pfnLoadDone;
99 /** Device instance. */
100 PPDMDEVINS pDevIns;
101 } Dev;
102
103 /** SSMUNITTYPE_DRV. */
104 struct
105 {
106 /** Prepare live save. */
107 PFNSSMDRVLIVEPREP pfnLivePrep;
108 /** Execute live save. */
109 PFNSSMDRVLIVEEXEC pfnLiveExec;
110 /** Vote live save complete. */
111 PFNSSMDRVLIVEVOTE pfnLiveVote;
112 /** Prepare save. */
113 PFNSSMDRVSAVEPREP pfnSavePrep;
114 /** Execute save. */
115 PFNSSMDRVSAVEEXEC pfnSaveExec;
116 /** Done save. */
117 PFNSSMDRVSAVEDONE pfnSaveDone;
118 /** Prepare load. */
119 PFNSSMDRVLOADPREP pfnLoadPrep;
120 /** Execute load. */
121 PFNSSMDRVLOADEXEC pfnLoadExec;
122 /** Done load. */
123 PFNSSMDRVLOADDONE pfnLoadDone;
124 /** Driver instance. */
125 PPDMDRVINS pDrvIns;
126 } Drv;
127
128 /** SSMUNITTYPE_USB. */
129 struct
130 {
131 /** Prepare live save. */
132 PFNSSMUSBLIVEPREP pfnLivePrep;
133 /** Execute live save. */
134 PFNSSMUSBLIVEEXEC pfnLiveExec;
135 /** Vote live save complete. */
136 PFNSSMUSBLIVEVOTE pfnLiveVote;
137 /** Prepare save. */
138 PFNSSMUSBSAVEPREP pfnSavePrep;
139 /** Execute save. */
140 PFNSSMUSBSAVEEXEC pfnSaveExec;
141 /** Done save. */
142 PFNSSMUSBSAVEDONE pfnSaveDone;
143 /** Prepare load. */
144 PFNSSMUSBLOADPREP pfnLoadPrep;
145 /** Execute load. */
146 PFNSSMUSBLOADEXEC pfnLoadExec;
147 /** Done load. */
148 PFNSSMUSBLOADDONE pfnLoadDone;
149 /** USB instance. */
150 PPDMUSBINS pUsbIns;
151 } Usb;
152
153 /** SSMUNITTYPE_INTERNAL. */
154 struct
155 {
156 /** Prepare live save. */
157 PFNSSMINTLIVEPREP pfnLivePrep;
158 /** Execute live save. */
159 PFNSSMINTLIVEEXEC pfnLiveExec;
160 /** Vote live save complete. */
161 PFNSSMINTLIVEVOTE pfnLiveVote;
162 /** Prepare save. */
163 PFNSSMINTSAVEPREP pfnSavePrep;
164 /** Execute save. */
165 PFNSSMINTSAVEEXEC pfnSaveExec;
166 /** Done save. */
167 PFNSSMINTSAVEDONE pfnSaveDone;
168 /** Prepare load. */
169 PFNSSMINTLOADPREP pfnLoadPrep;
170 /** Execute load. */
171 PFNSSMINTLOADEXEC pfnLoadExec;
172 /** Done load. */
173 PFNSSMINTLOADDONE pfnLoadDone;
174 } Internal;
175
176 /** SSMUNITTYPE_EXTERNAL. */
177 struct
178 {
179 /** Prepare live save. */
180 PFNSSMEXTLIVEPREP pfnLivePrep;
181 /** Execute live save. */
182 PFNSSMEXTLIVEEXEC pfnLiveExec;
183 /** Vote live save complete. */
184 PFNSSMEXTLIVEVOTE pfnLiveVote;
185 /** Prepare save. */
186 PFNSSMEXTSAVEPREP pfnSavePrep;
187 /** Execute save. */
188 PFNSSMEXTSAVEEXEC pfnSaveExec;
189 /** Done save. */
190 PFNSSMEXTSAVEDONE pfnSaveDone;
191 /** Prepare load. */
192 PFNSSMEXTLOADPREP pfnLoadPrep;
193 /** Execute load. */
194 PFNSSMEXTLOADEXEC pfnLoadExec;
195 /** Done load. */
196 PFNSSMEXTLOADDONE pfnLoadDone;
197 /** User data. */
198 void *pvUser;
199 } External;
200
201 struct
202 {
203 /** Prepare live save. */
204 PFNRT pfnLivePrep;
205 /** Execute live save. */
206 PFNRT pfnLiveExec;
207 /** Vote live save complete. */
208 PFNRT pfnLiveVote;
209 /** Prepare save. */
210 PFNRT pfnSavePrep;
211 /** Execute save. */
212 PFNRT pfnSaveExec;
213 /** Done save. */
214 PFNRT pfnSaveDone;
215 /** Prepare load. */
216 PFNRT pfnLoadPrep;
217 /** Execute load. */
218 PFNRT pfnLoadExec;
219 /** Done load. */
220 PFNRT pfnLoadDone;
221 /** User data. */
222 void *pvKey;
223 } Common;
224 } u;
225 /** Data layout version. */
226 uint32_t u32Version;
227 /** Instance number. */
228 uint32_t u32Instance;
229 /** The offset of the final data unit.
230 * This is used for constructing the directory. */
231 RTFOFF offStream;
232 /** Critical section to be taken before working any of the callbacks. */
233 PPDMCRITSECT pCritSect;
234 /** The guessed size of the data unit - used only for progress indication. */
235 size_t cbGuess;
236 /** Name size. (bytes) */
237 size_t cchName;
238 /** Name of this unit. (extends beyond the defined size) */
239 char szName[1];
240} SSMUNIT;
241
242AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Dev.pfnLivePrep);
243AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Dev.pfnLiveExec);
244AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Dev.pfnLiveVote);
245AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Dev.pfnSavePrep);
246AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Dev.pfnSaveExec);
247AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Dev.pfnSaveDone);
248AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Dev.pfnLoadPrep);
249AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Dev.pfnLoadExec);
250AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Dev.pfnLoadDone);
251AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.Dev.pDevIns);
252
253AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Drv.pfnLivePrep);
254AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Drv.pfnLiveExec);
255AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Drv.pfnLiveVote);
256AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Drv.pfnSavePrep);
257AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Drv.pfnSaveExec);
258AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Drv.pfnSaveDone);
259AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Drv.pfnLoadPrep);
260AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Drv.pfnLoadExec);
261AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Drv.pfnLoadDone);
262AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.Drv.pDrvIns);
263
264AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Usb.pfnLivePrep);
265AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Usb.pfnLiveExec);
266AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Usb.pfnLiveVote);
267AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Usb.pfnSavePrep);
268AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Usb.pfnSaveExec);
269AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Usb.pfnSaveDone);
270AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Usb.pfnLoadPrep);
271AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Usb.pfnLoadExec);
272AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Usb.pfnLoadDone);
273AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.Usb.pUsbIns);
274
275AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.Internal.pfnLivePrep);
276AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.Internal.pfnLiveExec);
277AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.Internal.pfnLiveVote);
278AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.Internal.pfnSavePrep);
279AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.Internal.pfnSaveExec);
280AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.Internal.pfnSaveDone);
281AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.Internal.pfnLoadPrep);
282AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.Internal.pfnLoadExec);
283AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.Internal.pfnLoadDone);
284
285AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLivePrep, u.External.pfnLivePrep);
286AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveExec, u.External.pfnLiveExec);
287AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLiveVote, u.External.pfnLiveVote);
288AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSavePrep, u.External.pfnSavePrep);
289AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveExec, u.External.pfnSaveExec);
290AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnSaveDone, u.External.pfnSaveDone);
291AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadPrep, u.External.pfnLoadPrep);
292AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadExec, u.External.pfnLoadExec);
293AssertCompile2MemberOffsets(SSMUNIT, u.Common.pfnLoadDone, u.External.pfnLoadDone);
294AssertCompile2MemberOffsets(SSMUNIT, u.Common.pvKey, u.External.pvUser);
295
296
297/**
298 * SSM VM Instance data.
299 * Changes to this must checked against the padding of the cfgm union in VM!
300 *
301 * @todo Move this to UVM.
302 */
303typedef struct SSM
304{
305 /** Critical section for serializing cancellation (pSSM). */
306 RTCRITSECT CancelCritSect;
307 /** The handle of the current save or load operation.
308 * This is used by SSMR3Cancel. */
309 PSSMHANDLE volatile pSSM;
310
311 /** FIFO of data entity descriptors. */
312 R3PTRTYPE(PSSMUNIT) pHead;
313 /** The number of register units. */
314 uint32_t cUnits;
315 /** For lazy init. */
316 bool fInitialized;
317 /** Current pass (for STAM). */
318 uint32_t uPass;
319 uint32_t u32Alignment;
320} SSM;
321/** Pointer to SSM VM instance data. */
322typedef SSM *PSSM;
323
324
325
326/** @} */
327
328RT_C_DECLS_END
329
330#endif /* !VMM_INCLUDED_SRC_include_SSMInternal_h */
331
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