tstHelp.h revision 03841c1ef497cd0bd02b5bef02c417b001369610
ea0316554d23852601ee840c4a856339501411a4vboxsync/* $Id$ */
ea0316554d23852601ee840c4a856339501411a4vboxsync/** @file
ea0316554d23852601ee840c4a856339501411a4vboxsync * VMM testcase - Helper stuff.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync/*
ea0316554d23852601ee840c4a856339501411a4vboxsync * Copyright (C) 2006-2011 Oracle Corporation
ea0316554d23852601ee840c4a856339501411a4vboxsync *
ea0316554d23852601ee840c4a856339501411a4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
ea0316554d23852601ee840c4a856339501411a4vboxsync * available from http://www.virtualbox.org. This file is free software;
ea0316554d23852601ee840c4a856339501411a4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
ea0316554d23852601ee840c4a856339501411a4vboxsync * General Public License (GPL) as published by the Free Software
ea0316554d23852601ee840c4a856339501411a4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
ea0316554d23852601ee840c4a856339501411a4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
ea0316554d23852601ee840c4a856339501411a4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync#ifndef ___tstHelp_h
ea0316554d23852601ee840c4a856339501411a4vboxsync#define ___tstHelp_h
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync#include <VBox/cdefs.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/cpum.h>
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsyncRT_C_DECLS_BEGIN
ea0316554d23852601ee840c4a856339501411a4vboxsyncvoid tstDumpCtx(PCPUMCTX pCtx, const char *pszComment);
ea0316554d23852601ee840c4a856339501411a4vboxsyncRT_C_DECLS_END
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync/**
ea0316554d23852601ee840c4a856339501411a4vboxsync * Checks the offset of a data member.
ea0316554d23852601ee840c4a856339501411a4vboxsync * @param type Type.
ea0316554d23852601ee840c4a856339501411a4vboxsync * @param off Correct offset.
ea0316554d23852601ee840c4a856339501411a4vboxsync * @param m Member name.
82546d3d9144e70a29430532ac0011ab77b2d5bbvboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync#define CHECK_OFF(type, off, m) \
ea0316554d23852601ee840c4a856339501411a4vboxsync do { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync if (off != RT_OFFSETOF(type, m)) \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync printf("error! %#010x %s Off by %d!! (expected off=%#x)\n", \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync RT_OFFSETOF(type, m), #type "." #m, off - RT_OFFSETOF(type, m), off); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync rc++; \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync /*else */ \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync /*printf("%#08x %s\n", RT_OFFSETOF(type, m), #m);*/ \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } while (0)
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync/**
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync * Checks the size of type.
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync * @param type Type.
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync * @param size Correct size.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync#define CHECK_SIZE(type, size) \
82546d3d9144e70a29430532ac0011ab77b2d5bbvboxsync do { \
ea0316554d23852601ee840c4a856339501411a4vboxsync if (size != sizeof(type)) \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync printf("error! sizeof(%s): %#x (%d) Off by %d!! (expected %#x)\n", \
ea0316554d23852601ee840c4a856339501411a4vboxsync #type, (int)sizeof(type), (int)sizeof(type), (int)(sizeof(type) - size, (int)size)); \
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync rc++; \
ea0316554d23852601ee840c4a856339501411a4vboxsync } \
ea0316554d23852601ee840c4a856339501411a4vboxsync else \
ea0316554d23852601ee840c4a856339501411a4vboxsync printf("info: sizeof(%s): %#x (%d)\n", #type, (int)sizeof(type), (int)sizeof(type)); \
ea0316554d23852601ee840c4a856339501411a4vboxsync } while (0)
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync/**
ea0316554d23852601ee840c4a856339501411a4vboxsync * Checks the alignment of a struct member.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync#define CHECK_MEMBER_ALIGNMENT(strct, member, align) \
ea0316554d23852601ee840c4a856339501411a4vboxsync do \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
ea0316554d23852601ee840c4a856339501411a4vboxsync if (RT_OFFSETOF(strct, member) & ((align) - 1) ) \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
ea0316554d23852601ee840c4a856339501411a4vboxsync printf("error! %s::%s offset=%#x (%u) expected alignment %#x, meaning %#x (%u) off\n", \
ea0316554d23852601ee840c4a856339501411a4vboxsync #strct, #member, \
ea0316554d23852601ee840c4a856339501411a4vboxsync (unsigned)RT_OFFSETOF(strct, member), \
ea0316554d23852601ee840c4a856339501411a4vboxsync (unsigned)RT_OFFSETOF(strct, member), \
ea0316554d23852601ee840c4a856339501411a4vboxsync (unsigned)(align), \
ea0316554d23852601ee840c4a856339501411a4vboxsync (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)), \
ea0316554d23852601ee840c4a856339501411a4vboxsync (unsigned)(((align) - RT_OFFSETOF(strct, member)) & ((align) - 1)) ); \
ea0316554d23852601ee840c4a856339501411a4vboxsync rc++; \
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync } \
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync } while (0)
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync/**
48a5358f2f99d054c9b6a1a0f063c11c9addfe14vboxsync * Checks that the size of a type is aligned correctly.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
ea0316554d23852601ee840c4a856339501411a4vboxsync#define CHECK_SIZE_ALIGNMENT(type, align) \
ea0316554d23852601ee840c4a856339501411a4vboxsync do { \
ea0316554d23852601ee840c4a856339501411a4vboxsync if (RT_ALIGN_Z(sizeof(type), (align)) != sizeof(type)) \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync { \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync printf("error! %s size=%#x (%u), align=%#x %#x (%u) bytes off\n", \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync #type, \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync (unsigned)sizeof(type), \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync (unsigned)sizeof(type), \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync (align), \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type), \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type)); \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync rc++; \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync } \
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync } while (0)
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync/**
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync * Checks that a internal struct padding is big enough.
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync */
f1f55b6ac890efaabca0ff940f58aa8df1dc84c8vboxsync#define CHECK_PADDING(strct, member, align) \
ea0316554d23852601ee840c4a856339501411a4vboxsync do \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
ea0316554d23852601ee840c4a856339501411a4vboxsync strct *p = NULL; NOREF(p); \
ea0316554d23852601ee840c4a856339501411a4vboxsync if (sizeof(p->member.s) > sizeof(p->member.padding)) \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync { \
ea0316554d23852601ee840c4a856339501411a4vboxsync printf("error! padding of %s::%s is too small, padding=%d struct=%d correct=%d\n", #strct, #member, \
ea0316554d23852601ee840c4a856339501411a4vboxsync (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync rc++; \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } \
ea0316554d23852601ee840c4a856339501411a4vboxsync else if (RT_ALIGN_Z(sizeof(p->member.padding), (align)) != sizeof(p->member.padding)) \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync printf("error! padding of %s::%s is misaligned, padding=%d correct=%d\n", #strct, #member, \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync (int)sizeof(p->member.padding), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync rc++; \
ea0316554d23852601ee840c4a856339501411a4vboxsync } \
ea0316554d23852601ee840c4a856339501411a4vboxsync } while (0)
ea0316554d23852601ee840c4a856339501411a4vboxsync
ea0316554d23852601ee840c4a856339501411a4vboxsync/**
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync * Checks that a internal struct padding is big enough.
ea0316554d23852601ee840c4a856339501411a4vboxsync */
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync#define CHECK_PADDING2(strct) \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync do \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync strct *p = NULL; NOREF(p); \
ea0316554d23852601ee840c4a856339501411a4vboxsync if (sizeof(p->s) > sizeof(p->padding)) \
ea0316554d23852601ee840c4a856339501411a4vboxsync { \
ea0316554d23852601ee840c4a856339501411a4vboxsync printf("error! padding of %s is too small, padding=%d struct=%d correct=%d\n", #strct, \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync (int)sizeof(p->padding), (int)sizeof(p->s), (int)RT_ALIGN_Z(sizeof(p->s), 64)); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync rc++; \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } while (0)
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync/**
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync * Checks that a internal struct padding is big enough.
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync */
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync#define CHECK_PADDING3(strct, member, pad_member) \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync do \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync strct *p = NULL; NOREF(p); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync if (sizeof(p->member) > sizeof(p->pad_member)) \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync printf("error! padding of %s::%s is too small, padding=%d struct=%d\n", #strct, #member, \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync (int)sizeof(p->pad_member), (int)sizeof(p->member)); \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync rc++; \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } while (0)
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync/**
b742a29c8c5a06fb5f362e5e6c09cbcaf8087ff6vboxsync * Checks that an expression is true.
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync */
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync#define CHECK_EXPR(expr) \
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync do \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync { \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync if (!(expr)) \
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync { \
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync printf("error! '%s' failed! (line %d)\n", #expr, __LINE__); \
0f1ee7c0c041f17c1c692fc7f09af458a62ceaeevboxsync rc++; \
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync } \
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync } while (0)
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync
0eb8851309a7678e8ccee719ee3eead40651b5d4vboxsync#endif
c9c1b52d5c13d75ba8fc3d86278f2b0c6b3e8c2avboxsync