VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp@ 1480

Last change on this file since 1480 was 1480, checked in by vboxsync, 18 years ago

No longer require contiguous memory for the VM structure.
Did long overdue IOCtl cleanup wrt R3/R0 pointers.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.4 KB
Line 
1/* $Id: tstVMStructSize.cpp 1480 2007-03-14 18:27:47Z vboxsync $ */
2/** @file
3 * tstVMStructSize - testcase for check structure sizes/alignment
4 * and to verify that HC and GC uses the same
5 * representation of the structures.
6 */
7
8/*
9 * Copyright (C) 2006 InnoTek Systemberatung GmbH
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License as published by the Free Software Foundation,
15 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
16 * distribution. VirtualBox OSE is distributed in the hope that it will
17 * be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * If you received this file as part of a commercial VirtualBox
20 * distribution, then only the terms of your commercial VirtualBox
21 * license agreement apply instead of the previous paragraph.
22 */
23
24/*******************************************************************************
25* Header Files *
26*******************************************************************************/
27#include <VBox/cfgm.h>
28#include <VBox/cpum.h>
29#include <VBox/mm.h>
30#include <VBox/pgm.h>
31#include <VBox/selm.h>
32#include <VBox/trpm.h>
33#include <VBox/vmm.h>
34#include <VBox/stam.h>
35#include "PDMInternal.h"
36#include <VBox/pdm.h>
37#include "CFGMInternal.h"
38#include "CPUMInternal.h"
39#include "MMInternal.h"
40#include "PGMInternal.h"
41#include "SELMInternal.h"
42#include "TRPMInternal.h"
43#include "TMInternal.h"
44#include "IOMInternal.h"
45#include "REMInternal.h"
46#include "SSMInternal.h"
47#include "HWACCMInternal.h"
48#include "PATMInternal.h"
49#include "VMMInternal.h"
50#include "DBGFInternal.h"
51#include "STAMInternal.h"
52#include "VMInternal.h"
53#include "CSAMInternal.h"
54#include "EMInternal.h"
55#include "REMInternal.h"
56#include <VBox/vm.h>
57#include <VBox/param.h>
58#include <VBox/x86.h>
59
60#include "tstHelp.h"
61#include <stdio.h>
62
63
64
65int main()
66{
67 int rc = 0;
68 printf("tstVMStructSize: TESTING\n");
69
70 printf("struct VM: %d bytes\n", (int)sizeof(VM));
71
72#define CHECK_PADDING_VM(member) \
73 do \
74 { \
75 CHECK_PADDING(VM, member); \
76 CHECK_MEMBER_ALIGNMENT(VM, member, 32); \
77 } while (0)
78
79
80#define CHECK_CPUMCTXCORE(member) \
81 do { \
82 if (RT_OFFSETOF(CPUMCTX, member) - RT_OFFSETOF(CPUMCTX, edi) != RT_OFFSETOF(CPUMCTXCORE, member)) \
83 { \
84 printf("CPUMCTX/CORE:: %s!\n", #member); \
85 rc++; \
86 } \
87 } while (0)
88
89#define PRINT_OFFSET(strct, member) \
90 do \
91 { \
92 printf("%s::%s offset %#x (%d) sizeof %d\n", #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \
93 } while (0)
94
95
96
97 CHECK_SIZE(uint128_t, 128/8);
98 CHECK_SIZE(int128_t, 128/8);
99 CHECK_SIZE(uint64_t, 64/8);
100 CHECK_SIZE(int64_t, 64/8);
101 CHECK_SIZE(uint32_t, 32/8);
102 CHECK_SIZE(int32_t, 32/8);
103 CHECK_SIZE(uint16_t, 16/8);
104 CHECK_SIZE(int16_t, 16/8);
105 CHECK_SIZE(uint8_t, 8/8);
106 CHECK_SIZE(int8_t, 8/8);
107
108 CHECK_SIZE(VBOXDESC, 8);
109 CHECK_SIZE(VBOXIDTE, 8);
110 CHECK_SIZE(VBOXIDTR, 6);
111 CHECK_SIZE(VBOXGDTR, 6);
112 CHECK_SIZE(VBOXPTE, 4);
113 CHECK_SIZE(VBOXPDE, 4);
114 CHECK_SIZE(VBOXTSS, 104);
115 CHECK_SIZE(X86FXSTATE, 512);
116 CHECK_SIZE(RTUUID, 16);
117 CHECK_SIZE(X86PTE, 4);
118 CHECK_SIZE(X86PD, PAGE_SIZE);
119 CHECK_SIZE(X86PDE, 4);
120 CHECK_SIZE(X86PT, PAGE_SIZE);
121 CHECK_SIZE(X86PTEPAE, 8);
122 CHECK_SIZE(X86PTPAE, PAGE_SIZE);
123 CHECK_SIZE(X86PDEPAE, 8);
124 CHECK_SIZE(X86PDPAE, PAGE_SIZE);
125 CHECK_SIZE(X86PDPE, 8);
126 CHECK_SIZE(X86PDPTR, PAGE_SIZE);
127 CHECK_SIZE(X86PML4E, 8);
128 CHECK_SIZE(X86PML4, PAGE_SIZE);
129
130 CHECK_PADDING_VM(cfgm);
131 CHECK_PADDING_VM(cpum);
132 CHECK_PADDING_VM(dbgf);
133 CHECK_PADDING_VM(em);
134 CHECK_PADDING_VM(iom);
135 CHECK_PADDING_VM(mm);
136 CHECK_PADDING_VM(pdm);
137 CHECK_PADDING_VM(pgm);
138 CHECK_PADDING_VM(selm);
139 CHECK_PADDING_VM(stam);
140 CHECK_PADDING_VM(tm);
141 CHECK_PADDING_VM(trpm);
142 CHECK_PADDING_VM(vm);
143 CHECK_PADDING_VM(vmm);
144 CHECK_PADDING_VM(ssm);
145 CHECK_PADDING_VM(rem);
146 CHECK_PADDING_VM(hwaccm);
147 CHECK_PADDING_VM(patm);
148 CHECK_PADDING_VM(csam);
149 CHECK_MEMBER_ALIGNMENT(VM, selm.s.Tss, 16);
150 PRINT_OFFSET(VM, selm.s.Tss);
151 PVM pVM;
152 if ((RT_OFFSETOF(VM, selm.s.Tss) & PAGE_OFFSET_MASK) > PAGE_SIZE - sizeof(pVM->selm.s.Tss))
153 {
154 printf("SELM:Tss is crossing a page!\n");
155 rc++;
156 }
157 PRINT_OFFSET(VM, selm.s.TssTrap08);
158 if ((RT_OFFSETOF(VM, selm.s.TssTrap08) & PAGE_OFFSET_MASK) > PAGE_SIZE - sizeof(pVM->selm.s.TssTrap08))
159 {
160 printf("SELM:TssTrap08 is crossing a page!\n");
161 rc++;
162 }
163 CHECK_MEMBER_ALIGNMENT(VM, trpm.s.aIdt, 16);
164 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Host, 32);
165 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Guest, 32);
166 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Hyper, 32);
167 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.CritSectVMLock, 8);
168 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.CallHostR0JmpBuf, 8);
169 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.StatRunGC, 8);
170 CHECK_MEMBER_ALIGNMENT(VM, StatTotalQemuToGC, 8);
171 CHECK_MEMBER_ALIGNMENT(VM, rem.s.StatsInQEMU, 8);
172 CHECK_MEMBER_ALIGNMENT(VM, rem.s.Env, 32);
173
174 /* cpumctx */
175 CHECK_MEMBER_ALIGNMENT(CPUMCTX, fpu, 32);
176 CHECK_MEMBER_ALIGNMENT(CPUMCTX, edi, 32);
177 CHECK_MEMBER_ALIGNMENT(CPUMCTX, idtr, 4);
178 CHECK_MEMBER_ALIGNMENT(CPUMCTX, SysEnter, 8);
179 CHECK_SIZE_ALIGNMENT(CPUMCTX, 32);
180 CHECK_CPUMCTXCORE(eax);
181 CHECK_CPUMCTXCORE(ebx);
182 CHECK_CPUMCTXCORE(ecx);
183 CHECK_CPUMCTXCORE(edx);
184 CHECK_CPUMCTXCORE(ebp);
185 CHECK_CPUMCTXCORE(esp);
186 CHECK_CPUMCTXCORE(edi);
187 CHECK_CPUMCTXCORE(esi);
188 CHECK_CPUMCTXCORE(eip);
189 CHECK_CPUMCTXCORE(eflags);
190 CHECK_CPUMCTXCORE(cs);
191 CHECK_CPUMCTXCORE(ds);
192 CHECK_CPUMCTXCORE(es);
193 CHECK_CPUMCTXCORE(fs);
194 CHECK_CPUMCTXCORE(gs);
195 CHECK_CPUMCTXCORE(ss);
196
197#if HC_ARCH_BITS == 32
198 /* CPUMHOSTCTX - lss pair */
199 if (RT_OFFSETOF(CPUMHOSTCTX, esp) + 4 != RT_OFFSETOF(CPUMHOSTCTX, ss))
200 {
201 printf("error: CPUMHOSTCTX lss has been split up!\n");
202 rc++;
203 }
204#endif
205
206 /* pdm */
207 CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 16);
208 CHECK_PADDING(PDMDEVINS, Internal);
209 CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16);
210 CHECK_PADDING(PDMDRVINS, Internal);
211 CHECK_PADDING2(PDMCRITSECT);
212 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, idx, sizeof(uint16_t));
213 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, pvPageHC, sizeof(RTHCPTR));
214 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, GCPhys, sizeof(RTGCPHYS));
215
216 /* misc */
217 CHECK_MEMBER_ALIGNMENT(REM, aGCPtrInvalidatedPages, 8);
218 CHECK_PADDING3(EM, u.FatalLongJump, u.achPaddingFatalLongJump);
219 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalRegister, u.padding);
220 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalDeregister, u.padding);
221 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalModify, u.padding);
222 CHECK_SIZE_ALIGNMENT(VMMR0JMPBUF, 8);
223 CHECK_SIZE_ALIGNMENT(PATCHINFO, 8);
224#if 0
225 PRINT_OFFSET(VM, fForcedActions);
226 PRINT_OFFSET(VM, StatQemuToGC);
227 PRINT_OFFSET(VM, StatGCToQemu);
228#endif
229
230
231
232 /*
233 * Compare HC and GC.
234 */
235 printf("tstVMStructSize: Comparing HC and GC...\n");
236#include "tstVMStructGC.h"
237
238 /*
239 * Report result.
240 */
241 if (rc)
242 printf("tstVMStructSize: FAILURE - %d errors\n", rc);
243 else
244 printf("tstVMStructSize: SUCCESS\n");
245 return rc;
246}
247
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