sanity.h revision a81732c207fa7354bdd79a4cc8ccdd815a0ad6cd
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* $Id$ */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @file
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * IPRT - Setup Sanity Checks, C and C++.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
157093a77f2752732368338110cb50fa6cd7717fvboxsync/*
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Copyright (C) 2007 Sun Microsystems, Inc.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * available from http://www.virtualbox.org. This file is free software;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * you can redistribute it and/or modify it under the terms of the GNU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * General Public License (GPL) as published by the Free Software
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * The contents of this file may alternatively be used under the terms
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * of the Common Development and Distribution License Version 1.0
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution, in which case the provisions of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CDDL are applicable instead of those of the GPL.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * You may elect to license modified versions of this file under the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * terms and conditions of either the GPL or the CDDL or both.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * additional information or have any questions.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <iprt/cdefs.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <iprt/types.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <iprt/assert.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Check that the IN_[RING3|RING0|GC] and [|R3_|R0_|GC_]ARCH_BITS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * match up correctly.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * IPRT assumes r0 and r3 to has the same bit count.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if defined(IN_RING3) && ARCH_BITS != R3_ARCH_BITS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# error "defined(IN_RING3) && ARCH_BITS != R3_ARCH_BITS"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if defined(IN_RING0) && ARCH_BITS != R0_ARCH_BITS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# error "defined(IN_RING0) && ARCH_BITS != R0_ARCH_BITS"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if defined(IN_RC) && ARCH_BITS != 32
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# error "defined(IN_RC) && ARCH_BITS != 32"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if (defined(IN_RING0) || defined(IN_RING3)) && HC_ARCH_BITS != ARCH_BITS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# error "(defined(IN_RING0) || defined(IN_RING3)) && HC_ARCH_BITS != ARCH_BITS"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if defined(IN_RC) && GC_ARCH_BITS != 64 && GC_ARCH_BITS != ARCH_BITS
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# error "defined(IN_RC) && GC_ARCH_BITS != ARCH_BITS"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
196f5d54f710d2479d74f17c81a49562cc74f9a1vboxsync/*
196f5d54f710d2479d74f17c81a49562cc74f9a1vboxsync * Check basic host (hc/r0/r3) types.
7ce6e7e8fb0eddb176361a49f53fa1bd15eaab4evboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if HC_ARCH_BITS == 64
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
beb683ae4828ae01a388a124997a2517fbe78190vboxsyncAssertCompileSize(RTHCPTR, 8);
beb683ae4828ae01a388a124997a2517fbe78190vboxsyncAssertCompileSize(RTHCINT, 4);
ae20b83f0c94402a3e3ac021c3d4e5f827e4905cvboxsyncAssertCompileSize(RTHCUINT, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCUINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTHCINTREG, 8);*/
ae20b83f0c94402a3e3ac021c3d4e5f827e4905cvboxsyncAssertCompileSize(RTHCUINTREG, 8);
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncAssertCompileSize(RTR0PTR, 8);
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsync/*AssertCompileSize(RTR0INT, 4);*/
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsync/*AssertCompileSize(RTR0UINT, 4);*/
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsyncAssertCompileSize(RTR0INTPTR, 8);
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsyncAssertCompileSize(RTR0UINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR3PTR, 8);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR3INT, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR3UINT, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR3INTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR3UINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTUINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# if defined(IN_RING3) || defined(IN_RING0)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTCCINTREG, 8);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTCCUINTREG, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#else
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCINT, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCUINT, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTHCINTPTR, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCUINTPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR0PTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR0INT, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR0UINT, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR0INTPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR0UINTPTR, 4);
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync/*AssertCompileSize(RTR3PTR, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTR3INT, 4);*/
dd689a9d08909a7c3670e62e8b058783e0805cbcvboxsync/*AssertCompileSize(RTR3UINT, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR3INTPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTR3UINTPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# if GC_ARCH_BITS == 64
673c4af47215ff0f21f244462a3dfd63f8b522cdvboxsyncAssertCompileSize(RTUINTPTR, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# else
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTUINTPTR, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# if defined(IN_RING3) || defined(IN_RING0)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTCCINTREG, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTCCUINTREG, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTHCPHYS, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Check basic guest context types.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if GC_ARCH_BITS == 64
f0c75bc994ebd95d398f55685e0130dc876bb053vboxsync
a8b31f6b3abd04475d4abcb5292aa22131b5130fvboxsyncAssertCompileSize(RTGCINT, 8);
a8b31f6b3abd04475d4abcb5292aa22131b5130fvboxsyncAssertCompileSize(RTGCUINT, 8);
f0c75bc994ebd95d398f55685e0130dc876bb053vboxsyncAssertCompileSize(RTGCINTPTR, 8);
a8b31f6b3abd04475d4abcb5292aa22131b5130fvboxsyncAssertCompileSize(RTGCUINTPTR, 8);
f0c75bc994ebd95d398f55685e0130dc876bb053vboxsync/*AssertCompileSize(RTGCINTREG, 8);*/
a8b31f6b3abd04475d4abcb5292aa22131b5130fvboxsyncAssertCompileSize(RTGCUINTREG, 8);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# ifdef IN_RC
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*AssertCompileSize(RTCCINTREG, 8);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* Hack alert: there is no such thing as a GC context when GC_ARCH_BITS == 64; it's still 32 bits */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTCCUINTREG, 4);
c8968199d271abe749c08bcea0512f7239250cdcvboxsync# endif
03e8e21575a0d6ace51c528e7a6fcc35ce69cae7vboxsync
03e8e21575a0d6ace51c528e7a6fcc35ce69cae7vboxsync#else
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsync
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsyncAssertCompileSize(RTGCINT, 4);
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsyncAssertCompileSize(RTGCUINT, 4);
89f5aff9eff63826c9b171cc7fdb9dc1513fa09dvboxsyncAssertCompileSize(RTGCINTPTR, 4);
a0352d06ef77cf45a08eb08b4d65d570b7b294cbvboxsyncAssertCompileSize(RTGCUINTPTR, 4);
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsync/*AssertCompileSize(RTGCINTREG, 4);*/
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsyncAssertCompileSize(RTGCUINTREG, 4);
236b2935f217749893b7034e59da3e3568928acevboxsync
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsync# ifdef IN_RC
fa94cbe3cda9a48bb743f0c2b26ec06927878830vboxsync/*AssertCompileSize(RTCCINTREG, 4);*/
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileSize(RTCCUINTREG, 4);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync# endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
a1d83f29ade4c8f9fe95fc75d3fb2642f36081c1vboxsync
AssertCompileSize(RTGCPHYS64, 8);
AssertCompileSize(RTGCPHYS32, 4);
AssertCompileSize(RTGCPHYS, 8);
/*
* Check basic current context types.
*/
#if ARCH_BITS == 64
AssertCompileSize(void *, 8);
AssertCompileSize(intptr_t, 8);
AssertCompileSize(uintptr_t, 8);
AssertCompileSize(size_t, 8);
AssertCompileSize(ssize_t, 8);
#else
AssertCompileSize(void *, 4);
AssertCompileSize(intptr_t, 4);
AssertCompileSize(uintptr_t, 4);
AssertCompileSize(size_t, 4);
AssertCompileSize(ssize_t, 4);
#endif
/*
* Standard sized types.
*/
AssertCompileSize(uint8_t, 1);
AssertCompileSize(uint16_t, 2);
AssertCompileSize(uint32_t, 4);
AssertCompileSize(uint64_t, 8);
#define TEST_CONST_MACRO(c,t) \
AssertCompile(sizeof(c) == sizeof(t) || (sizeof(c) == sizeof(int) && sizeof(t) < sizeof(int)) )
TEST_CONST_MACRO(UINT8_C(1), uint8_t);
TEST_CONST_MACRO(UINT16_C(1), uint16_t);
TEST_CONST_MACRO(UINT32_C(1), uint32_t);
TEST_CONST_MACRO(UINT64_C(1), uint64_t);
TEST_CONST_MACRO(INT8_C(1), int8_t);
TEST_CONST_MACRO(INT8_C(-1), int8_t);
TEST_CONST_MACRO(INT16_C(1), int16_t);
TEST_CONST_MACRO(INT16_C(-1), int16_t);
TEST_CONST_MACRO(INT32_C(1), int32_t);
TEST_CONST_MACRO(INT32_C(-1), int32_t);
TEST_CONST_MACRO(INT64_C(1), int64_t);
TEST_CONST_MACRO(INT64_C(-1), int64_t);
/*
* Our union types.
*/
AssertCompileSize(RTUINT16U, 2);
AssertCompileSize(RTUINT32U, 4);
AssertCompileSize(RTUINT64U, 8);
AssertCompileSize(RTUINT128U, 16);