tstDeviceStructSize.cpp revision 12bda05d421d110736c4d6127a36e9c438072dad
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/* $Id$ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @file
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * tstDeviceStructSize - testcase for check structure sizes/alignment
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * and to verify that HC and RC uses the same
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * representation of the structures.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Copyright (C) 2006-2012 Oracle Corporation
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/types.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/x86.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
662d52947eeb3fc8fca3b23991a5eee47077f896vboxsync#define VBOX_WITH_HGCM /* grumble */
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync#define VBOX_DEVICE_STRUCT_TESTCASE
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../Bus/DevPCI.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../Bus/DevPciIch9.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../Graphics/DevVGA.cpp"
9496f2d398b49813176939d7a339ae513d5175efvboxsync#undef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "../Input/DevPS2.cpp"
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#undef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "../Input/PS2K.cpp"
efff36b306e370346025647a158689021df2e1d1vboxsync#ifdef VBOX_WITH_E1000
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync# undef LOG_GROUP
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync# include "../Network/DevE1000.cpp"
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#endif
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#undef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "../Network/DevPCNet.cpp"
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#ifdef VBOX_WITH_VIRTIO
efff36b306e370346025647a158689021df2e1d1vboxsync# undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync# include "../Network/DevVirtioNet.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#endif
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
efff36b306e370346025647a158689021df2e1d1vboxsync#include "../PC/DevACPI.cpp"
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#undef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "../PC/DevPIC.cpp"
efff36b306e370346025647a158689021df2e1d1vboxsync#undef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "../PC/DevPit-i8254.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../PC/DevRTC.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../PC/DevAPIC.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync#include "../PC/DevIoApic.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../PC/DevHPET.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../PC/DevLPC.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../PC/DevSMC.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include "../Storage/DevATA.cpp"
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#ifdef VBOX_WITH_USB
0abd77741a608f6c41c8dfcd4781b8b84adf1044vboxsync# undef LOG_GROUP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync# include "../USB/DevOHCI.cpp"
9496f2d398b49813176939d7a339ae513d5175efvboxsync# ifdef VBOX_WITH_EHCI_IMPL
9496f2d398b49813176939d7a339ae513d5175efvboxsync# include "../USB/DevEHCI.cpp"
9496f2d398b49813176939d7a339ae513d5175efvboxsync# endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync#endif
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#undef LOG_GROUP
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#include "../VMMDev/VMMDev.cpp"
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#undef LOG_GROUP
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#include "../Parallel/DevParallel.cpp"
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#undef LOG_GROUP
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#include "../Serial/DevSerial.cpp"
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#ifdef VBOX_WITH_AHCI
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# undef LOG_GROUP
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# include "../Storage/DevAHCI.cpp"
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#endif
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#ifdef VBOX_WITH_BUSLOGIC
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# undef LOG_GROUP
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# include "../Storage/DevBusLogic.cpp"
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_LSILOGIC
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# undef LOG_GROUP
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# include "../Storage/DevLsiLogicSCSI.cpp"
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_PCI_PASSTHROUGH_IMPL
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# undef LOG_GROUP
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# include "../Bus/DevPciRaw.cpp"
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <stdio.h>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/*******************************************************************************
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync* Defined Constants And Macros *
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync*******************************************************************************/
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/**
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Checks the offset of a data member.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @param type Type.
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @param off Correct offset.
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @param m Member name.
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#define CHECK_OFF(type, off, m) \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync do { \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync if (off != RT_OFFSETOF(type, m)) \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync { \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync printf("tstDeviceStructSize: error! %#010x %s Off by %d!! (off=%#x)\n", RT_OFFSETOF(type, m), #type "." #m, off - RT_OFFSETOF(type, m), off); \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync rc++; \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync } \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync /*else */ \
9496f2d398b49813176939d7a339ae513d5175efvboxsync /*printf("%#08x %s\n", RT_OFFSETOF(type, m), #m);*/ \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync } while (0)
9496f2d398b49813176939d7a339ae513d5175efvboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/**
9496f2d398b49813176939d7a339ae513d5175efvboxsync * Checks the size of type.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @param type Type.
9496f2d398b49813176939d7a339ae513d5175efvboxsync * @param size Correct size.
21029597fc4b76d0db0c9542daee201447281781vboxsync */
21029597fc4b76d0db0c9542daee201447281781vboxsync#define CHECK_SIZE(type, size) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync do { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (size != sizeof(type)) \
9496f2d398b49813176939d7a339ae513d5175efvboxsync { \
9496f2d398b49813176939d7a339ae513d5175efvboxsync printf("tstDeviceStructSize: error! sizeof(%s): %#x (%d) Off by %d!!\n", #type, (int)sizeof(type), (int)sizeof(type), (int)(sizeof(type) - size)); \
9496f2d398b49813176939d7a339ae513d5175efvboxsync rc++; \
9496f2d398b49813176939d7a339ae513d5175efvboxsync } \
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync else \
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync printf("tstDeviceStructSize: info: sizeof(%s): %#x (%d)\n", #type, (int)sizeof(type), (int)sizeof(type)); \
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync } while (0)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync/**
9496f2d398b49813176939d7a339ae513d5175efvboxsync * Checks the alignment of a struct member.
9496f2d398b49813176939d7a339ae513d5175efvboxsync */
9496f2d398b49813176939d7a339ae513d5175efvboxsync#define CHECK_MEMBER_ALIGNMENT(strct, member, align) \
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync do \
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync { \
9496f2d398b49813176939d7a339ae513d5175efvboxsync if (RT_OFFSETOF(strct, member) & ((align) - 1) ) \
9496f2d398b49813176939d7a339ae513d5175efvboxsync { \
9496f2d398b49813176939d7a339ae513d5175efvboxsync printf("tstDeviceStructSize: error! %s::%s offset=%#x (%u) expected alignment %x, meaning %#x (%u) off\n", \
9496f2d398b49813176939d7a339ae513d5175efvboxsync #strct, #member, \
9496f2d398b49813176939d7a339ae513d5175efvboxsync (unsigned)RT_OFFSETOF(strct, member), \
9496f2d398b49813176939d7a339ae513d5175efvboxsync (unsigned)RT_OFFSETOF(strct, member), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)(align), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)), \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)) ); \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync rc++; \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } \
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync } while (0)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/**
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Checks that the size of a type is aligned correctly.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#define CHECK_SIZE_ALIGNMENT(type, align) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync do { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (RT_ALIGN_Z(sizeof(type), (align)) != sizeof(type)) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync printf("tstDeviceStructSize: error! %s size=%#x (%u), align=%#x %#x (%u) bytes off\n", \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync #type, \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)sizeof(type), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)sizeof(type), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (align), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type), \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type)); \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc++; \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync } \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync } while (0)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/**
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Checks that a internal struct padding is big enough.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#define CHECK_PADDING(strct, member, align) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync do \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync strct *p = NULL; NOREF(p); \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (sizeof(p->member.s) > sizeof(p->member.padding)) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync printf("tstDeviceStructSize: error! padding of %s::%s is too small, padding=%d struct=%d correct=%d\n", #strct, #member, \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc++; \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync } \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync else if (RT_ALIGN_Z(sizeof(p->member.padding), (align)) != sizeof(p->member.padding)) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync printf("tstDeviceStructSize: error! padding of %s::%s is misaligned, padding=%d correct=%d\n", #strct, #member, \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (int)sizeof(p->member.padding), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync rc++; \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } while (0)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync/**
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Checks that a internal struct padding is big enough.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync#define CHECK_PADDING2(strct) \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync do \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync { \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync strct *p = NULL; NOREF(p); \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (sizeof(p->s) > sizeof(p->padding)) \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync { \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync printf("tstDeviceStructSize: error! padding of %s is too small, padding=%d struct=%d correct=%d\n", #strct, \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync (int)sizeof(p->padding), (int)sizeof(p->s), (int)RT_ALIGN_Z(sizeof(p->s), 32)); \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync rc++; \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } while (0)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync/**
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Checks that a internal struct padding is big enough.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync#define CHECK_PADDING3(strct, member, pad_member) \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync do \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync { \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync strct *p = NULL; NOREF(p); \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (sizeof(p->member) > sizeof(p->pad_member)) \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync { \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync printf("tstDeviceStructSize: error! padding of %s::%s is too small, padding=%d struct=%d\n", #strct, #member, \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync (int)sizeof(p->pad_member), (int)sizeof(p->member)); \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync rc++; \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync } while (0)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync/**
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Prints the offset of a struct member.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync#define PRINT_OFFSET(strct, member) \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync do \
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync { \
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync printf("tstDeviceStructSize: info: %s::%s offset %d sizeof %d\n", #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync } while (0)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsyncint main()
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync{
9496f2d398b49813176939d7a339ae513d5175efvboxsync int rc = 0;
9496f2d398b49813176939d7a339ae513d5175efvboxsync printf("tstDeviceStructSize: TESTING\n");
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync /* Assert sanity */
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync CHECK_SIZE(uint128_t, 128/8);
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync CHECK_SIZE(int128_t, 128/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_SIZE(uint64_t, 64/8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_SIZE(int64_t, 64/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_SIZE(uint32_t, 32/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_SIZE(int32_t, 32/8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_SIZE(uint16_t, 16/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_SIZE(int16_t, 16/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_SIZE(uint8_t, 8/8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_SIZE(int8_t, 8/8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync /* Basic alignment checks. */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 64);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCIDEVICE, Int.s, 16);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(PCIDEVICE, Int.s.aIORegions, 16);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync /*
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync * Misc alignment checks (keep this somewhat alphabetical).
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync */
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(AHCI, lock, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(AHCIPort, StatDMA, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync#ifdef VBOX_WITH_STATISTICS
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(APICDeviceInfo, StatMMIOReadGC, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync#endif
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(ATADevState, cTotalSectors, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(ATADevState, StatATADMA, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(ATADevState, StatReads, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(ATACONTROLLER, lock, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(ATACONTROLLER, StatAsyncOps, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(BUSLOGIC, CritSectIntr, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(PARALLELPORT, CritSect, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync#ifdef VBOX_WITH_STATISTICS
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync CHECK_MEMBER_ALIGNMENT(DEVPIC, StatSetIrqGC, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync#ifdef VBOX_WITH_E1000
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(E1KSTATE, cs, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(E1KSTATE, csRx, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(E1KSTATE, StatReceiveBytes, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_VIRTIO
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VNETSTATE, StatReceiveBytes, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync //CHECK_MEMBER_ALIGNMENT(E1KSTATE, csTx, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_USB
ffbe6daf773e38167f3cabaf1f063d84ecd063e9vboxsync# ifdef VBOX_WITH_EHCI_IMPL
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(EHCI, RootHub, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# ifdef VBOX_WITH_STATISTICS
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(EHCI, StatCanceledIsocUrbs, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(E1KSTATE, StatReceiveBytes, 8);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync#ifdef VBOX_WITH_STATISTICS
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(KBDState, CritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PS2K, KbdCritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, ReplyPostQueueCritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, ReplyFreeQueueCritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_USB
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(OHCI, RootHub, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# ifdef VBOX_WITH_STATISTICS
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(OHCI, StatCanceledIsocUrbs, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync# endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCIBUS, devices, 16);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCIBUS, devices, 16);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCIGLOBALS, pci_irq_levels, 16);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCNetState, u64LastPoll, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(PCNetState, CritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCNetState, StatReceiveBytes, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync#ifdef VBOX_WITH_STATISTICS
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(PCNetState, StatMMIOReadRZ, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(PITState, StatPITIrq, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(SerialState, CritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VGASTATE, Dev, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(VGASTATE, lock, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VGASTATE, StatRZMemoryRead, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VMMDevState, CritSect, 8);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_VIRTIO
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VPCISTATE, cs, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync CHECK_MEMBER_ALIGNMENT(VPCISTATE, led, 4);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(VPCISTATE, Queues, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync#endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync#ifdef VBOX_WITH_PCI_PASSTHROUGH_IMPL
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync CHECK_MEMBER_ALIGNMENT(PCIRAWSENDREQ, u.aGetRegionInfo.u64RegionSize, 8);
9496f2d398b49813176939d7a339ae513d5175efvboxsync#endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef VBOX_WITH_RAW_MODE
9496f2d398b49813176939d7a339ae513d5175efvboxsync /*
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * Compare HC and RC.
9496f2d398b49813176939d7a339ae513d5175efvboxsync */
9496f2d398b49813176939d7a339ae513d5175efvboxsync printf("tstDeviceStructSize: Comparing HC and RC...\n");
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync# include "tstDeviceStructSizeRC.h"
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync#endif
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync /*
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync * Report result.
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync */
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync if (rc)
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync printf("tstDeviceStructSize: FAILURE - %d errors\n", rc);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync else
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync printf("tstDeviceStructSize: SUCCESS\n");
9496f2d398b49813176939d7a339ae513d5175efvboxsync return rc;
9496f2d398b49813176939d7a339ae513d5175efvboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync