VirtualBox

source: vbox/trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp@ 64419

Last change on this file since 64419 was 64419, checked in by vboxsync, 8 years ago

DevPci: Mmerged ICH9PCIGLOBALS and PCIGLOBALS.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 13.5 KB
Line 
1/* $Id: tstDeviceStructSize.cpp 64419 2016-10-25 15:35:56Z vboxsync $ */
2/** @file
3 * tstDeviceStructSize - testcase for check structure sizes/alignment
4 * and to verify that HC and RC uses the same
5 * representation of the structures.
6 */
7
8/*
9 * Copyright (C) 2006-2016 Oracle Corporation
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/*********************************************************************************************************************************
22* Header Files *
23*********************************************************************************************************************************/
24#include <VBox/types.h>
25#include <iprt/x86.h>
26
27
28#define VBOX_WITH_HGCM /* grumble */
29#define VBOX_DEVICE_STRUCT_TESTCASE
30#undef LOG_GROUP
31#include "../Bus/DevPciInternal.h"
32#undef LOG_GROUP
33#include "../Graphics/DevVGA.cpp"
34#undef LOG_GROUP
35#include "../Input/DevPS2.cpp"
36#undef LOG_GROUP
37#include "../Input/PS2K.cpp"
38#undef LOG_GROUP
39#include "../Input/PS2M.cpp"
40#ifdef VBOX_WITH_E1000
41# undef LOG_GROUP
42# include "../Network/DevE1000.cpp"
43#endif
44#undef LOG_GROUP
45#include "../Network/DevPCNet.cpp"
46#ifdef VBOX_WITH_VIRTIO
47# undef LOG_GROUP
48# include "../Network/DevVirtioNet.cpp"
49#endif
50#undef LOG_GROUP
51#include "../PC/DevACPI.cpp"
52#undef LOG_GROUP
53#include "../PC/DevPIC.cpp"
54#undef LOG_GROUP
55#include "../PC/DevPit-i8254.cpp"
56#undef LOG_GROUP
57#include "../PC/DevRTC.cpp"
58# undef LOG_GROUP
59#ifdef VBOX_WITH_NEW_APIC
60# include "../../VMM/VMMR3/APIC.cpp"
61#else
62# include "../PC/DevAPIC.cpp"
63#endif
64#undef LOG_GROUP
65#ifdef VBOX_WITH_NEW_IOAPIC
66# include "../PC/DevIoApic.cpp"
67#else
68# include "../PC/DevIoApic_Old.cpp"
69#endif
70#undef LOG_GROUP
71#include "../PC/DevHPET.cpp"
72#undef LOG_GROUP
73#include "../PC/DevLPC.cpp"
74#undef LOG_GROUP
75#include "../EFI/DevSmc.cpp"
76#undef LOG_GROUP
77#include "../Storage/DevATA.cpp"
78#ifdef VBOX_WITH_USB
79# undef LOG_GROUP
80# include "../USB/DevOHCI.cpp"
81# ifdef VBOX_WITH_EHCI_IMPL
82# undef LOG_GROUP
83# include "../USB/DevEHCI.cpp"
84# endif
85# ifdef VBOX_WITH_XHCI_IMPL
86# undef LOG_GROUP
87# include "../USB/DevXHCI.cpp"
88# endif
89#endif
90#undef LOG_GROUP
91#include "../VMMDev/VMMDev.cpp"
92#undef LOG_GROUP
93#include "../Parallel/DevParallel.cpp"
94#undef LOG_GROUP
95#include "../Serial/DevSerial.cpp"
96#ifdef VBOX_WITH_AHCI
97# undef LOG_GROUP
98# include "../Storage/DevAHCI.cpp"
99#endif
100#ifdef VBOX_WITH_BUSLOGIC
101# undef LOG_GROUP
102# include "../Storage/DevBusLogic.cpp"
103#endif
104#ifdef VBOX_WITH_LSILOGIC
105# undef LOG_GROUP
106# include "../Storage/DevLsiLogicSCSI.cpp"
107#endif
108#ifdef VBOX_WITH_NVME_IMPL
109# undef LOG_GROUP
110# include "../Storage/DevNVMe.cpp"
111#endif
112
113#ifdef VBOX_WITH_PCI_PASSTHROUGH_IMPL
114# undef LOG_GROUP
115# include "../Bus/DevPciRaw.cpp"
116#endif
117
118#include <VBox/vmm/pdmaudioifs.h>
119
120# undef LOG_GROUP
121# include "../Audio/DevIchAc97.cpp"
122# undef LOG_GROUP
123# include "../Audio/DevHDA.cpp"
124
125#include <stdio.h>
126
127
128/*********************************************************************************************************************************
129* Defined Constants And Macros *
130*********************************************************************************************************************************/
131/**
132 * Checks the offset of a data member.
133 * @param type Type.
134 * @param off Correct offset.
135 * @param m Member name.
136 */
137#define CHECK_OFF(type, off, m) \
138 do { \
139 if (off != RT_OFFSETOF(type, m)) \
140 { \
141 printf("tstDeviceStructSize: error! %#010x %s Off by %d!! (off=%#x)\n", RT_OFFSETOF(type, m), #type "." #m, off - RT_OFFSETOF(type, m), off); \
142 rc++; \
143 } \
144 else \
145 printf("%#08x (%d) %s\n", RT_OFFSETOF(type, m), RT_OFFSETOF(type, m), #type "." #m); \
146 } while (0)
147
148/**
149 * Checks the size of type.
150 * @param type Type.
151 * @param size Correct size.
152 */
153#define CHECK_SIZE(type, size) \
154 do { \
155 if (size != sizeof(type)) \
156 { \
157 printf("tstDeviceStructSize: error! sizeof(%s): %#x (%d) Off by %d!!\n", #type, (int)sizeof(type), (int)sizeof(type), (int)(sizeof(type) - size)); \
158 rc++; \
159 } \
160 else \
161 printf("tstDeviceStructSize: info: sizeof(%s): %#x (%d)\n", #type, (int)sizeof(type), (int)sizeof(type)); \
162 } while (0)
163
164/**
165 * Checks the alignment of a struct member.
166 */
167#define CHECK_MEMBER_ALIGNMENT(strct, member, align) \
168 do \
169 { \
170 if (RT_OFFSETOF(strct, member) & ((align) - 1) ) \
171 { \
172 printf("tstDeviceStructSize: error! %s::%s offset=%#x (%u) expected alignment %#x, meaning %#x (%u) off\n", \
173 #strct, #member, \
174 (unsigned)RT_OFFSETOF(strct, member), \
175 (unsigned)RT_OFFSETOF(strct, member), \
176 (unsigned)(align), \
177 (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)), \
178 (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)) ); \
179 rc++; \
180 } \
181 } while (0)
182
183/**
184 * Checks that the size of a type is aligned correctly.
185 */
186#define CHECK_SIZE_ALIGNMENT(type, align) \
187 do { \
188 if (RT_ALIGN_Z(sizeof(type), (align)) != sizeof(type)) \
189 { \
190 printf("tstDeviceStructSize: error! %s size=%#x (%u), align=%#x %#x (%u) bytes off\n", \
191 #type, \
192 (unsigned)sizeof(type), \
193 (unsigned)sizeof(type), \
194 (align), \
195 (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type), \
196 (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type)); \
197 rc++; \
198 } \
199 } while (0)
200
201/**
202 * Checks that a internal struct padding is big enough.
203 */
204#define CHECK_PADDING(strct, member, align) \
205 do \
206 { \
207 strct *p = NULL; NOREF(p); \
208 if (sizeof(p->member.s) > sizeof(p->member.padding)) \
209 { \
210 printf("tstDeviceStructSize: error! padding of %s::%s is too small, padding=%d struct=%d correct=%d\n", #strct, #member, \
211 (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
212 rc++; \
213 } \
214 else if (RT_ALIGN_Z(sizeof(p->member.padding), (align)) != sizeof(p->member.padding)) \
215 { \
216 printf("tstDeviceStructSize: error! padding of %s::%s is misaligned, padding=%d correct=%d\n", #strct, #member, \
217 (int)sizeof(p->member.padding), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
218 rc++; \
219 } \
220 } while (0)
221
222/**
223 * Checks that a internal struct padding is big enough.
224 */
225#define CHECK_PADDING2(strct) \
226 do \
227 { \
228 strct *p = NULL; NOREF(p); \
229 if (sizeof(p->s) > sizeof(p->padding)) \
230 { \
231 printf("tstDeviceStructSize: error! padding of %s is too small, padding=%d struct=%d correct=%d\n", #strct, \
232 (int)sizeof(p->padding), (int)sizeof(p->s), (int)RT_ALIGN_Z(sizeof(p->s), 32)); \
233 rc++; \
234 } \
235 } while (0)
236
237/**
238 * Checks that a internal struct padding is big enough.
239 */
240#define CHECK_PADDING3(strct, member, pad_member) \
241 do \
242 { \
243 strct *p = NULL; NOREF(p); \
244 if (sizeof(p->member) > sizeof(p->pad_member)) \
245 { \
246 printf("tstDeviceStructSize: error! padding of %s::%s is too small, padding=%d struct=%d\n", #strct, #member, \
247 (int)sizeof(p->pad_member), (int)sizeof(p->member)); \
248 rc++; \
249 } \
250 } while (0)
251
252/**
253 * Prints the offset of a struct member.
254 */
255#define PRINT_OFFSET(strct, member) \
256 do \
257 { \
258 printf("tstDeviceStructSize: info: %s::%s offset %d sizeof %d\n", #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \
259 } while (0)
260
261
262int main()
263{
264 int rc = 0;
265 printf("tstDeviceStructSize: TESTING\n");
266
267 /* Assert sanity */
268 CHECK_SIZE(uint128_t, 128/8);
269 CHECK_SIZE(int128_t, 128/8);
270 CHECK_SIZE(uint64_t, 64/8);
271 CHECK_SIZE(int64_t, 64/8);
272 CHECK_SIZE(uint32_t, 32/8);
273 CHECK_SIZE(int32_t, 32/8);
274 CHECK_SIZE(uint16_t, 16/8);
275 CHECK_SIZE(int16_t, 16/8);
276 CHECK_SIZE(uint8_t, 8/8);
277 CHECK_SIZE(int8_t, 8/8);
278
279 /* Basic alignment checks. */
280 CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 64);
281 CHECK_MEMBER_ALIGNMENT(PDMPCIDEV, Int.s, 16);
282 CHECK_MEMBER_ALIGNMENT(PDMPCIDEV, Int.s.aIORegions, 16);
283
284 /*
285 * Misc alignment checks (keep this somewhat alphabetical).
286 */
287 CHECK_MEMBER_ALIGNMENT(AHCI, lock, 8);
288 CHECK_MEMBER_ALIGNMENT(AHCIPort, StatDMA, 8);
289#ifdef VBOX_WITH_NEW_APIC
290 CHECK_MEMBER_ALIGNMENT(APICDEV, pDevInsR0, 8);
291 CHECK_MEMBER_ALIGNMENT(APICDEV, pCritSectR0, 8);
292 CHECK_MEMBER_ALIGNMENT(APICDEV, pDevInsRC, 8);
293 CHECK_MEMBER_ALIGNMENT(APICDEV, pCritSectRC, 8);
294#else
295# ifdef VBOX_WITH_STATISTICS
296 CHECK_MEMBER_ALIGNMENT(APICDeviceInfo, StatMMIOReadGC, 8);
297# endif
298#endif
299 CHECK_MEMBER_ALIGNMENT(ATADevState, cTotalSectors, 8);
300 CHECK_MEMBER_ALIGNMENT(ATADevState, StatATADMA, 8);
301 CHECK_MEMBER_ALIGNMENT(ATADevState, StatReads, 8);
302 CHECK_MEMBER_ALIGNMENT(ATACONTROLLER, lock, 8);
303 CHECK_MEMBER_ALIGNMENT(ATACONTROLLER, StatAsyncOps, 8);
304 CHECK_MEMBER_ALIGNMENT(BUSLOGIC, CritSectIntr, 8);
305#ifdef VBOX_WITH_STATISTICS
306 CHECK_MEMBER_ALIGNMENT(DEVPIC, StatSetIrqGC, 8);
307#endif
308#ifdef VBOX_WITH_E1000
309 CHECK_MEMBER_ALIGNMENT(E1KSTATE, cs, 8);
310 CHECK_MEMBER_ALIGNMENT(E1KSTATE, csRx, 8);
311 CHECK_MEMBER_ALIGNMENT(E1KSTATE, StatReceiveBytes, 8);
312#endif
313#ifdef VBOX_WITH_VIRTIO
314 CHECK_MEMBER_ALIGNMENT(VNETSTATE, StatReceiveBytes, 8);
315#endif
316 //CHECK_MEMBER_ALIGNMENT(E1KSTATE, csTx, 8);
317#ifdef VBOX_WITH_USB
318# ifdef VBOX_WITH_EHCI_IMPL
319 CHECK_MEMBER_ALIGNMENT(EHCI, RootHub, 8);
320# ifdef VBOX_WITH_STATISTICS
321 CHECK_MEMBER_ALIGNMENT(EHCI, StatCanceledIsocUrbs, 8);
322# endif
323# endif
324# ifdef VBOX_WITH_XHCI_IMPL
325 CHECK_MEMBER_ALIGNMENT(XHCI, pWorkerThread, 8);
326 CHECK_MEMBER_ALIGNMENT(XHCI, IBase, 8);
327 CHECK_MEMBER_ALIGNMENT(XHCI, MMIOBase, 8);
328 CHECK_MEMBER_ALIGNMENT(XHCI, RootHub2, 8);
329 CHECK_MEMBER_ALIGNMENT(XHCI, RootHub3, 8);
330 CHECK_MEMBER_ALIGNMENT(XHCI, cmdr_dqp, 8);
331# ifdef VBOX_WITH_STATISTICS
332 CHECK_MEMBER_ALIGNMENT(XHCI, StatCanceledIsocUrbs, 8);
333 CHECK_MEMBER_ALIGNMENT(XHCI, StatIntrsCleared, 8);
334# endif
335# endif
336#endif
337 CHECK_MEMBER_ALIGNMENT(E1KSTATE, StatReceiveBytes, 8);
338#ifdef VBOX_WITH_NEW_IOAPIC
339 CHECK_MEMBER_ALIGNMENT(IOAPIC, au64RedirTable, 8);
340# ifdef VBOX_WITH_STATISTICS
341 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMmioReadRZ, 8);
342# endif
343#else
344# ifdef VBOX_WITH_STATISTICS
345 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
346 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
347# endif
348#endif
349 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, GCPhysMMIOBase, 8);
350 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, aMessage, 8);
351 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, ReplyPostQueueCritSect, 8);
352 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, ReplyFreeQueueCritSect, 8);
353 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, uReplyFreeQueueNextEntryFreeWrite, 8);
354 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, VBoxSCSI, 8);
355#ifdef VBOX_WITH_USB
356 CHECK_MEMBER_ALIGNMENT(OHCI, RootHub, 8);
357# ifdef VBOX_WITH_STATISTICS
358 CHECK_MEMBER_ALIGNMENT(OHCI, StatCanceledIsocUrbs, 8);
359# endif
360#endif
361 CHECK_MEMBER_ALIGNMENT(DEVPCIBUS, apDevices, 64);
362 CHECK_MEMBER_ALIGNMENT(DEVPCIROOT, auPciApicIrqLevels, 16);
363 CHECK_MEMBER_ALIGNMENT(DEVPCIROOT, Piix3.auPciLegacyIrqLevels, 16);
364 CHECK_MEMBER_ALIGNMENT(PCNETSTATE, u64LastPoll, 8);
365 CHECK_MEMBER_ALIGNMENT(PCNETSTATE, CritSect, 8);
366 CHECK_MEMBER_ALIGNMENT(PCNETSTATE, StatReceiveBytes, 8);
367#ifdef VBOX_WITH_STATISTICS
368 CHECK_MEMBER_ALIGNMENT(PCNETSTATE, StatMMIOReadRZ, 8);
369#endif
370 CHECK_MEMBER_ALIGNMENT(PITSTATE, StatPITIrq, 8);
371 CHECK_MEMBER_ALIGNMENT(SerialState, CritSect, 8);
372#ifdef VBOX_WITH_VMSVGA
373 CHECK_SIZE(VMSVGAState, RT_ALIGN_Z(sizeof(VMSVGAState), 8));
374 CHECK_MEMBER_ALIGNMENT(VGASTATE, svga, 8);
375 CHECK_MEMBER_ALIGNMENT(VGASTATE, svga.u64HostWindowId, 8);
376#endif
377 CHECK_MEMBER_ALIGNMENT(VGASTATE, cMonitors, 8);
378 CHECK_MEMBER_ALIGNMENT(VGASTATE, GCPhysVRAM, 8);
379 CHECK_MEMBER_ALIGNMENT(VGASTATE, Dev, 8);
380 CHECK_MEMBER_ALIGNMENT(VGASTATE, CritSect, 8);
381 CHECK_MEMBER_ALIGNMENT(VGASTATE, StatRZMemoryRead, 8);
382 CHECK_MEMBER_ALIGNMENT(VGASTATE, CritSectIRQ, 8);
383 CHECK_MEMBER_ALIGNMENT(VMMDevState, CritSect, 8);
384#ifdef VBOX_WITH_VIRTIO
385 CHECK_MEMBER_ALIGNMENT(VPCISTATE, cs, 8);
386 CHECK_MEMBER_ALIGNMENT(VPCISTATE, led, 4);
387 CHECK_MEMBER_ALIGNMENT(VPCISTATE, Queues, 8);
388#endif
389#ifdef VBOX_WITH_PCI_PASSTHROUGH_IMPL
390 CHECK_MEMBER_ALIGNMENT(PCIRAWSENDREQ, u.aGetRegionInfo.u64RegionSize, 8);
391#endif
392
393#ifdef VBOX_WITH_RAW_MODE
394 /*
395 * Compare HC and RC.
396 */
397 printf("tstDeviceStructSize: Comparing HC and RC...\n");
398# include "tstDeviceStructSizeRC.h"
399#endif
400
401 /*
402 * Report result.
403 */
404 if (rc)
405 printf("tstDeviceStructSize: FAILURE - %d errors\n", rc);
406 else
407 printf("tstDeviceStructSize: SUCCESS\n");
408 return rc;
409}
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