VirtualBox

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

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

Finally splitting up pdm.h. Working on integrating USB into PDM (USBProxy needs CFGM stuff).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.5 KB
Line 
1/* $Id: tstVMStructSize.cpp 3852 2007-07-25 19:09:09Z 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-2007 innotek 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, 136);
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(PDMUSBINS, achInstanceData, 16);
210 CHECK_PADDING(PDMUSBINS, Internal);
211 CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16);
212 CHECK_PADDING(PDMDRVINS, Internal);
213 CHECK_PADDING2(PDMCRITSECT);
214 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, idx, sizeof(uint16_t));
215 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, pvPageHC, sizeof(RTHCPTR));
216 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, GCPhys, sizeof(RTGCPHYS));
217
218 /* misc */
219 CHECK_MEMBER_ALIGNMENT(REM, aGCPtrInvalidatedPages, 8);
220 CHECK_PADDING3(EM, u.FatalLongJump, u.achPaddingFatalLongJump);
221 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalRegister, u.padding);
222 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalDeregister, u.padding);
223 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalModify, u.padding);
224 CHECK_SIZE_ALIGNMENT(VMMR0JMPBUF, 8);
225 CHECK_SIZE_ALIGNMENT(PATCHINFO, 8);
226#if 0
227 PRINT_OFFSET(VM, fForcedActions);
228 PRINT_OFFSET(VM, StatQemuToGC);
229 PRINT_OFFSET(VM, StatGCToQemu);
230#endif
231
232
233
234 /*
235 * Compare HC and GC.
236 */
237 printf("tstVMStructSize: Comparing HC and GC...\n");
238#include "tstVMStructGC.h"
239
240 /*
241 * Report result.
242 */
243 if (rc)
244 printf("tstVMStructSize: FAILURE - %d errors\n", rc);
245 else
246 printf("tstVMStructSize: SUCCESS\n");
247 return rc;
248}
249
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