VirtualBox

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

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

Implemented PGMR3PhysRegisterRam (not used). Enforced alignment of aPages in PGMRAMRANGES. Added pszDesc to PGMRAMRANGES (only set by the new code).

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette