VirtualBox

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

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

The new MMIO2 code.
WARNING! This changes the pci mapping protocol for MMIO2 so it's working the same way as I/O ports and normal MMIO memory. External users of the interface will have to update their mapping routines.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.3 KB
Line 
1/* $Id: tstVMStructSize.cpp 7635 2008-03-28 17:15:38Z 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 (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(VBOXTSS, 136);
109 CHECK_SIZE(X86FXSTATE, 512);
110 CHECK_SIZE(RTUUID, 16);
111 CHECK_SIZE(X86PTE, 4);
112 CHECK_SIZE(X86PD, PAGE_SIZE);
113 CHECK_SIZE(X86PDE, 4);
114 CHECK_SIZE(X86PT, PAGE_SIZE);
115 CHECK_SIZE(X86PTEPAE, 8);
116 CHECK_SIZE(X86PTPAE, PAGE_SIZE);
117 CHECK_SIZE(X86PDEPAE, 8);
118 CHECK_SIZE(X86PDPAE, PAGE_SIZE);
119 CHECK_SIZE(X86PDPE, 8);
120 CHECK_SIZE(X86PDPTR, PAGE_SIZE);
121 CHECK_SIZE(X86PML4E, 8);
122 CHECK_SIZE(X86PML4, PAGE_SIZE);
123
124 CHECK_PADDING_VM(cfgm);
125 CHECK_PADDING_VM(cpum);
126 CHECK_PADDING_VM(dbgf);
127 CHECK_PADDING_VM(em);
128 CHECK_PADDING_VM(iom);
129 CHECK_PADDING_VM(mm);
130 CHECK_PADDING_VM(pdm);
131 CHECK_PADDING_VM(pgm);
132 CHECK_PADDING_VM(selm);
133 CHECK_PADDING_VM(tm);
134 CHECK_PADDING_VM(trpm);
135 CHECK_PADDING_VM(vm);
136 CHECK_PADDING_VM(vmm);
137 CHECK_PADDING_VM(ssm);
138 CHECK_PADDING_VM(rem);
139 CHECK_PADDING_VM(hwaccm);
140 CHECK_PADDING_VM(patm);
141 CHECK_PADDING_VM(csam);
142 CHECK_MEMBER_ALIGNMENT(VM, selm.s.Tss, 16);
143 PRINT_OFFSET(VM, selm.s.Tss);
144 PVM pVM;
145 if ((RT_OFFSETOF(VM, selm.s.Tss) & PAGE_OFFSET_MASK) > PAGE_SIZE - sizeof(pVM->selm.s.Tss))
146 {
147 printf("SELM:Tss is crossing a page!\n");
148 rc++;
149 }
150 PRINT_OFFSET(VM, selm.s.TssTrap08);
151 if ((RT_OFFSETOF(VM, selm.s.TssTrap08) & PAGE_OFFSET_MASK) > PAGE_SIZE - sizeof(pVM->selm.s.TssTrap08))
152 {
153 printf("SELM:TssTrap08 is crossing a page!\n");
154 rc++;
155 }
156 CHECK_MEMBER_ALIGNMENT(VM, trpm.s.aIdt, 16);
157 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Host, 32);
158 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Guest, 32);
159 CHECK_MEMBER_ALIGNMENT(VM, cpum.s.Hyper, 32);
160 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.CritSectVMLock, 8);
161 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.CallHostR0JmpBuf, 8);
162 CHECK_MEMBER_ALIGNMENT(VM, vmm.s.StatRunGC, 8);
163 CHECK_MEMBER_ALIGNMENT(VM, StatTotalQemuToGC, 8);
164 CHECK_MEMBER_ALIGNMENT(VM, rem.s.StatsInQEMU, 8);
165 CHECK_MEMBER_ALIGNMENT(VM, rem.s.Env, 32);
166
167 /* cpumctx */
168 CHECK_MEMBER_ALIGNMENT(CPUMCTX, fpu, 32);
169 CHECK_MEMBER_ALIGNMENT(CPUMCTX, edi, 32);
170 CHECK_MEMBER_ALIGNMENT(CPUMCTX, idtr, 4);
171 CHECK_MEMBER_ALIGNMENT(CPUMCTX, SysEnter, 8);
172 CHECK_SIZE_ALIGNMENT(CPUMCTX, 32);
173 CHECK_CPUMCTXCORE(eax);
174 CHECK_CPUMCTXCORE(ebx);
175 CHECK_CPUMCTXCORE(ecx);
176 CHECK_CPUMCTXCORE(edx);
177 CHECK_CPUMCTXCORE(ebp);
178 CHECK_CPUMCTXCORE(esp);
179 CHECK_CPUMCTXCORE(edi);
180 CHECK_CPUMCTXCORE(esi);
181 CHECK_CPUMCTXCORE(eip);
182 CHECK_CPUMCTXCORE(eflags);
183 CHECK_CPUMCTXCORE(cs);
184 CHECK_CPUMCTXCORE(ds);
185 CHECK_CPUMCTXCORE(es);
186 CHECK_CPUMCTXCORE(fs);
187 CHECK_CPUMCTXCORE(gs);
188 CHECK_CPUMCTXCORE(ss);
189
190#if HC_ARCH_BITS == 32
191 /* CPUMHOSTCTX - lss pair */
192 if (RT_OFFSETOF(CPUMHOSTCTX, esp) + 4 != RT_OFFSETOF(CPUMHOSTCTX, ss))
193 {
194 printf("error: CPUMHOSTCTX lss has been split up!\n");
195 rc++;
196 }
197#endif
198
199 /* pdm */
200 CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 16);
201 CHECK_PADDING(PDMDEVINS, Internal);
202 CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 16);
203 CHECK_PADDING(PDMUSBINS, Internal);
204 CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16);
205 CHECK_PADDING(PDMDRVINS, Internal);
206 CHECK_PADDING2(PDMCRITSECT);
207 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, idx, sizeof(uint16_t));
208 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, pvPageHC, sizeof(RTHCPTR));
209 CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, GCPhys, sizeof(RTGCPHYS));
210 CHECK_SIZE(PGMPAGE, 16);
211 CHECK_MEMBER_ALIGNMENT(PGMRAMRANGE, aPages, 16);
212 CHECK_MEMBER_ALIGNMENT(PGMMMIO2RANGE, RamRange, 16);
213
214 /* misc */
215 CHECK_MEMBER_ALIGNMENT(REM, aGCPtrInvalidatedPages, 8);
216 CHECK_PADDING3(EM, u.FatalLongJump, u.achPaddingFatalLongJump);
217 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalRegister, u.padding);
218 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalDeregister, u.padding);
219 CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalModify, u.padding);
220 CHECK_SIZE_ALIGNMENT(VMMR0JMPBUF, 8);
221 CHECK_SIZE_ALIGNMENT(PATCHINFO, 8);
222#if 0
223 PRINT_OFFSET(VM, fForcedActions);
224 PRINT_OFFSET(VM, StatQemuToGC);
225 PRINT_OFFSET(VM, StatGCToQemu);
226#endif
227
228
229
230 /*
231 * Compare HC and GC.
232 */
233 printf("tstVMStructSize: Comparing HC and GC...\n");
234#include "tstVMStructGC.h"
235
236 /*
237 * Report result.
238 */
239 if (rc)
240 printf("tstVMStructSize: FAILURE - %d errors\n", rc);
241 else
242 printf("tstVMStructSize: SUCCESS\n");
243 return rc;
244}
245
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