cdefs.h revision 3343ffab6590a395072be5b8d50b2aee423c7503
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * IPRT - Common C and C++ definitions.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Copyright (C) 2006-2012 Oracle Corporation
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * available from http://www.virtualbox.org. This file is free software;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * you can redistribute it and/or modify it under the terms of the GNU
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @defgroup grp_rt_cdefs IPRT Common Definitions and Macros
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync/** @def RT_C_DECLS_BEGIN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Used to start a block of function declarations which are shared
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * between C and C++ program.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_C_DECLS_END
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Used to end a block of function declarations which are shared
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * between C and C++ program.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Shut up DOXYGEN warnings and guide it properly thru the code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif /* DOXYGEN_RUNNING */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_ARCH_X86
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the X86 architecture.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_ARCH_AMD64
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the AMD64 architecture.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_ARCH_SPARC
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the SPARC V8 architecture (32-bit).
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_ARCH_SPARC64
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the SPARC V9 architecture (64-bit).
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(RT_ARCH_X86) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync && !defined(RT_ARCH_AMD64) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync && !defined(RT_ARCH_SPARC) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync && !defined(RT_ARCH_SPARC64) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# if defined(__amd64__) || defined(__x86_64__) || defined(_M_X64) || defined(__AMD64__)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# elif defined(__i386__) || defined(_M_IX86) || defined(__X86__)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# else /* PORTME: append test for new archs. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Check what predefined macros your compiler uses to indicate architecture."
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* PORTME: append new archs checks. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_X86) && defined(RT_ARCH_AMD64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_X86 and RT_ARCH_AMD64 cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_X86) && defined(RT_ARCH_SPARC)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_X86 and RT_ARCH_SPARC cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_X86) && defined(RT_ARCH_SPARC64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_X86 and RT_ARCH_SPARC64 cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_AMD64) && defined(RT_ARCH_SPARC)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_AMD64 and RT_ARCH_SPARC cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_AMD64) && defined(RT_ARCH_SPARC64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_AMD64 and RT_ARCH_SPARC64 cannot be defined at the same time!"
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#elif defined(RT_ARCH_SPARC) && defined(RT_ARCH_SPARC64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_SPARC and RT_ARCH_SPARC64 cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_ARM) && defined(RT_ARCH_AMD64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_ARM and RT_ARCH_AMD64 cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_ARM and RT_ARCH_X86 cannot be defined at the same time!"
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync#elif defined(RT_ARCH_ARM) && defined(RT_ARCH_SPARC64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_ARM and RT_ARCH_SPARC64 cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_ARM) && defined(RT_ARCH_SPARC)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both RT_ARCH_ARM and RT_ARCH_SPARC cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def __X86__
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the X86 architecture.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @deprecated
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def __AMD64__
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates that we're compiling for the AMD64 architecture.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @deprecated
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if !defined(__X86__) && !defined(__AMD64__) && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Check what predefined macros your compiler uses to indicate architecture."
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Both __X86__ and __AMD64__ cannot be defined at the same time!"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_BIG_ENDIAN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defined if the architecture is big endian. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_LITTLE_ENDIAN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defined if the architecture is little endian. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) || defined(RT_ARCH_ARM)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#elif defined(RT_ARCH_SPARC) || defined(RT_ARCH_SPARC64)
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync#if defined(RT_BIG_ENDIAN) && defined(RT_LITTLE_ENDIAN)
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync# error "Both RT_BIG_ENDIAN and RT_LITTLE_ENDIAN are defined"
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync/** @def IN_RING0
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * Used to indicate that we're compiling code which is running
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * in Ring-0 Host Context.
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync/** @def IN_RING3
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * Used to indicate that we're compiling code which is running
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * in Ring-3 Host Context.
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync/** @def IN_RC
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * Used to indicate that we're compiling code which is running
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * in the Raw-mode Context (implies R0).
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if !defined(IN_RING3) && !defined(IN_RING0) && !defined(IN_RC) && !defined(IN_RC)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "You must define which context the compiled code should run in; IN_RING3, IN_RING0 or IN_RC"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if (defined(IN_RING3) && (defined(IN_RING0) || defined(IN_RC)) ) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync || (defined(IN_RING0) && (defined(IN_RING3) || defined(IN_RC)) ) \
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync || (defined(IN_RC) && (defined(IN_RING3) || defined(IN_RING0)) )
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# error "Only one of the IN_RING3, IN_RING0, IN_RC defines should be defined."
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def ARCH_BITS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defines the bit count of the current context.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_SPARC64)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def HC_ARCH_BITS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defines the host architecture bit count.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(HC_ARCH_BITS) || defined(DOXYGEN_RUNNING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def GC_ARCH_BITS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defines the guest architecture bit count.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if !defined(GC_ARCH_BITS) && !defined(DOXYGEN_RUNNING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def R3_ARCH_BITS
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Defines the host ring-3 architecture bit count.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(R3_ARCH_BITS) || defined(DOXYGEN_RUNNING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def R0_ARCH_BITS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defines the host ring-0 architecture bit count.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(R0_ARCH_BITS) || defined(DOXYGEN_RUNNING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def GC_ARCH_BITS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Defines the guest architecture bit count.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(GC_ARCH_BITS) || defined(DOXYGEN_RUNNING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @name RT_OPSYS_XXX - Operative System Identifiers.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * These are the value that the RT_OPSYS \#define can take. @{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Unknown OS. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** OS Agnostic. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Darwin - aka Mac OS X. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** DragonFly BSD. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** FreeBSD. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Haiku. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Linux. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Minix. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** NetBSD. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Netware. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** NT (native). */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** OpenBSD. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** OS/2. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Plan 9. */
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync/** Solaris. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** UEFI. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Windows. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** The max RT_OPSYS_XXX value (exclusive). */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_OPSYS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Indicates which OS we're targetting. It's a \#define with is
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * assigned one of the RT_OPSYS_XXX defines above.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * So to test if we're on FreeBSD do the following:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * #if RT_OPSYS == RT_OPSYS_FREEBSD
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * some_funky_freebsd_specific_stuff();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Set RT_OPSYS_XXX according to RT_OS_XXX.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Search: #define RT_OPSYS_([A-Z0-9]+) .*
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Replace: # elif defined(RT_OS_\1)\n# define RT_OPSYS RT_OPSYS_\1
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Guess RT_OPSYS based on compiler predefined macros.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# elif defined(__sun__) || defined(__SunOS__) || defined(__sun) || defined(__SunOS)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if RT_OPSYS < RT_OPSYS_UNKNOWN || RT_OPSYS >= RT_OPSYS_MAX
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Do some consistency checks.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Search: #define RT_OPSYS_([A-Z0-9]+) .*
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync * Replace: #if defined(RT_OS_\1) && RT_OPSYS != RT_OPSYS_\1\n# error RT_OPSYS vs RT_OS_\1\n#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_UNKNOWN) && RT_OPSYS != RT_OPSYS_UNKNOWN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_AGNOSTIC) && RT_OPSYS != RT_OPSYS_AGNOSTIC
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_DARWIN) && RT_OPSYS != RT_OPSYS_DARWIN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_DRAGONFLY) && RT_OPSYS != RT_OPSYS_DRAGONFLY
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_FREEBSD) && RT_OPSYS != RT_OPSYS_FREEBSD
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_HAIKU) && RT_OPSYS != RT_OPSYS_HAIKU
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_LINUX) && RT_OPSYS != RT_OPSYS_LINUX
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if defined(RT_OS_MINIX) && RT_OPSYS != RT_OPSYS_MINIX
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if defined(RT_OS_NETBSD) && RT_OPSYS != RT_OPSYS_NETBSD
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if defined(RT_OS_NETWARE) && RT_OPSYS != RT_OPSYS_NETWARE
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if defined(RT_OS_OPENBSD) && RT_OPSYS != RT_OPSYS_OPENBSD
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#if defined(RT_OS_PLAN9) && RT_OPSYS != RT_OPSYS_PLAN9
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_SOLARIS) && RT_OPSYS != RT_OPSYS_SOLARIS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_UEFI) && RT_OPSYS != RT_OPSYS_UEFI
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_WINDOWS) && RT_OPSYS != RT_OPSYS_WINDOWS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Make sure the RT_OS_XXX macro is defined.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Search: #define RT_OPSYS_([A-Z0-9]+) .*
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Replace: #elif RT_OPSYS == RT_OPSYS_\1\n# ifndef RT_OS_\1\n# define RT_OS_\1\n# endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Checks whether the given OpSys uses DOS-style paths or not.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * By DOS-style paths we include drive lettering and UNC paths.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns true / false
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_OpSys The RT_OPSYS_XXX value to check, will be reference
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * multiple times.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def CTXTYPE
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Declare a type differently in GC, R3 and R0.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param GCType The GC type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param R3Type The R3 type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param R0Type The R0 type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @remark For pointers used only in one context use RCPTRTYPE(), R3R0PTRTYPE(), R3PTRTYPE() or R0PTRTYPE().
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @def RCPTRTYPE
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Declare a pointer which is used in the raw mode context but appears in structure(s) used by
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * both HC and RC. The main purpose is to make sure structures have the same
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * size when built for different architectures.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param RCType The RC type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define RCPTRTYPE(RCType) CTXTYPE(RCType, RTRCPTR, RTRCPTR)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @def R3R0PTRTYPE
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Declare a pointer which is used in HC, is explicitly valid in ring 3 and 0,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * but appears in structure(s) used by both HC and GC. The main purpose is to
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * make sure structures have the same size when built for different architectures.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param R3R0Type The R3R0 type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @remarks This used to be called HCPTRTYPE.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define R3R0PTRTYPE(R3R0Type) CTXTYPE(RTHCPTR, R3R0Type, R3R0Type)
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync/** @def R3PTRTYPE
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * Declare a pointer which is used in R3 but appears in structure(s) used by
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * both HC and GC. The main purpose is to make sure structures have the same
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * size when built for different architectures.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param R3Type The R3 type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define R3PTRTYPE(R3Type) CTXTYPE(RTHCUINTPTR, R3Type, RTHCUINTPTR)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @def R0PTRTYPE
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Declare a pointer which is used in R0 but appears in structure(s) used by
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * both HC and GC. The main purpose is to make sure structures have the same
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * size when built for different architectures.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param R0Type The R0 type.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync#define R0PTRTYPE(R0Type) CTXTYPE(RTHCUINTPTR, RTHCUINTPTR, R0Type)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/** @def CTXSUFF
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Adds the suffix of the current context to the passed in
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * identifier name. The suffix is HC or GC.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param var Identifier name.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @deprecated Use CTX_SUFF. Do NOT use this for new code.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/** @def OTHERCTXSUFF
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Adds the suffix of the other context to the passed in
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * identifier name. The suffix is HC or GC.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param var Identifier name.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @deprecated Use CTX_SUFF. Do NOT use this for new code.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/** @def CTXALLSUFF
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Adds the suffix of the current context to the passed in
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * identifier name. The suffix is R3, R0 or GC.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param var Identifier name.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @deprecated Use CTX_SUFF. Do NOT use this for new code.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/** @def CTX_SUFF
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Adds the suffix of the current context to the passed in
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * identifier name. The suffix is R3, R0 or RC.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param var Identifier name.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @remark This will replace CTXALLSUFF and CTXSUFF before long.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def CTX_SUFF_Z
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the suffix of the current context to the passed in
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * identifier name, combining RC and R0 into RZ.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The suffix thus is R3 or RZ.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param var Identifier name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @remark This will replace CTXALLSUFF and CTXSUFF before long.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def CTXMID
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the current context as a middle name of an identifier name
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The middle name is HC or GC.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param first First name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param last Surname.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def OTHERCTXMID
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the other context as a middle name of an identifier name
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The middle name is HC or GC.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param first First name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param last Surname.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @deprecated use CTX_MID or CTX_MID_Z
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def CTXALLMID
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the current context as a middle name of an identifier name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The middle name is R3, R0 or GC.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param first First name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param last Surname.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @deprecated use CTX_MID or CTX_MID_Z
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def CTX_MID
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the current context as a middle name of an identifier name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The middle name is R3, R0 or RC.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param first First name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param last Surname.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def CTX_MID_Z
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Adds the current context as a middle name of an identifier name, combining RC
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * and R0 into RZ.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The middle name thus is either R3 or RZ.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * This is macro should only be used in shared code to avoid a forest of ifdefs.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param first First name.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param last Surname.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @def R3STRING
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * A macro which in GC and R0 will return a dummy string while in R3 it will return
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * the parameter.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This is typically used to wrap description strings in structures shared
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * between R3, R0 and/or GC. The intention is to avoid the \#ifdef IN_RING3 mess.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pR3String The R3 string. Only referenced in R3.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @see R0STRING and GCSTRING
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @def R0STRING
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * A macro which in GC and R3 will return a dummy string while in R0 it will return
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * the parameter.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This is typically used to wrap description strings in structures shared
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * between R3, R0 and/or GC. The intention is to avoid the \#ifdef IN_RING0 mess.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pR0String The R0 string. Only referenced in R0.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @see R3STRING and GCSTRING
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RCSTRING
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * A macro which in R3 and R0 will return a dummy string while in RC it will return
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * the parameter.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * This is typically used to wrap description strings in structures shared
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * between R3, R0 and/or RC. The intention is to avoid the \#ifdef IN_RC mess.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @param pRCString The RC string. Only referenced in RC.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @see R3STRING, R0STRING
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync/** @def RT_NOTHING
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * A macro that expands to nothing.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This is primarily intended as a dummy argument for macros to avoid the
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * undefined behavior passing empty arguments to an macro (ISO C90 and C++98,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * gcc v4.4 warns about it).
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_GCC_EXTENSION
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for shutting up GCC warnings about using language extensions. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_COMPILER_GROKS_64BIT_BITFIELDS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro that is defined if the compiler understands 64-bit bitfields. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if !defined(RT_OS_OS2) || (!defined(__IBMC__) && !defined(__IBMCPP__))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_COMPILER_WITH_80BIT_LONG_DOUBLE
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * Macro that is defined if the compiler implements long double as the
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * IEEE extended precision floating. */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)) && !defined(RT_OS_WINDOWS)
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync/** @def RT_EXCEPTIONS_ENABLED
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * Defined when C++ exceptions are enabled.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync && defined(__cplusplus) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def RT_NO_THROW
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * How to express that a function doesn't throw C++ exceptions
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * and the compiler can thus save itself the bother of trying
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * to catch any of them. Put this between the closing parenthesis
#ifdef RT_EXCEPTIONS_ENABLED
# define RT_NO_THROW
#ifdef RT_EXCEPTIONS_ENABLED
# ifdef _MSC_VER
#if defined(__GNUC__)
# define RT_GCC_SUPPORTS_VISIBILITY_HIDDEN
#ifdef _MSC_VER
#elif defined(__GNUC__) && defined(IN_RING0) && defined(RT_ARCH_X86) /** @todo consider dropping IN_RING0 here. */
# define RTCALL __attribute__((cdecl,regparm(0))) /* regparm(0) deals with -mregparm=x use in the linux kernel. */
# define RTCALL
#if defined(_MSC_VER)
#ifdef __cplusplus
#ifdef _MSC_VER
#if defined(__GNUC__)
#ifdef IN_RING3
#ifdef IN_RC
#ifdef IN_RING0
#ifdef __GNUC__
#ifdef __GNUC__
#ifdef __GNUC__
#ifdef IN_RT_R0
# ifdef IN_RT_STATIC
#ifdef IN_RT_R3
# ifdef IN_RT_STATIC
#ifdef IN_RT_RC
# ifdef IN_RT_STATIC
# ifdef IN_RT_STATIC
# ifdef IN_RT_STATIC
# ifdef IN_RT_STATIC
# define RT_DECL_CLASS
#ifndef RT_WITHOUT_NOCRT_WRAPPERS
#if defined(__GNUC__)
#define RT_CONCAT_HLP(a,b) a##b
#define RT_CONCAT3_HLP(a,b,c) a##b##c
#define RT_CONCAT4_HLP(a,b,c,d) a##b##c##d
* @remark This macro is the preferred alignment macro, it doesn't have any of the pitfalls RT_ALIGN has.
#define RT_ALIGN_T(u, uAlignment, type) ( ((type)(u) + ((uAlignment) - 1)) & ~(type)((uAlignment) - 1) )
#define RT_UOFFSETOF_ADD(type, member, addend) ( (uintptr_t)&( ((type *)(void *)(uintptr_t)(addend))->member) )
#define RT_FROM_MEMBER(pMem, Type, Member) ( (Type *) ((uint8_t *)(void *)(pMem) - RT_UOFFSETOF(Type, Member)) )
#ifdef RT_OS_OS2
resource type define in os2.h. */
#ifdef __GNUC__
# define RT_LO_U8(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint16_t)); (uint8_t)(a); })
#ifdef __GNUC__
# define RT_HI_U8(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint16_t)); (uint8_t)((a) >> 8); })
#ifdef __GNUC__
# define RT_LO_U16(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint32_t)); (uint16_t)(a); })
#ifdef __GNUC__
# define RT_HI_U16(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint32_t)); (uint16_t)((a) >> 16); })
#ifdef __GNUC__
# define RT_LO_U32(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint64_t)); (uint32_t)(a); })
#ifdef __GNUC__
# define RT_HI_U32(a) __extension__ ({ AssertCompile(sizeof((a)) == sizeof(uint64_t)); (uint32_t)((a) >> 32); })
#define RT_BSWAP_U64_C(u64) RT_MAKE_U64(RT_BSWAP_U32_C((u64) >> 32), RT_BSWAP_U32_C((u64) & 0xffffffff))
#define RT_BSWAP_U32_C(u32) RT_MAKE_U32_FROM_U8(RT_BYTE4(u32), RT_BYTE3(u32), RT_BYTE2(u32), RT_BYTE1(u32))
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#ifdef RT_BIG_ENDIAN
#if defined(RT_OS_DARWIN) \
&& !defined(KERNEL) \
&& !defined(RT_NO_BSD_PARAM_H_UNDEFING) \
#define NIL_OFFSET (~0U)
#ifdef __GNUC__
# if !defined(__L4ENV__)
# define RT_BREAKPOINT() __asm__ __volatile__("illtrap 0\n\t") /** @todo Sparc64: this is just a wild guess. */
# define RT_BREAKPOINT() __asm__ __volatile__("unimp 0\n\t") /** @todo Sparc: this is just a wild guess (same as Sparc64, just different name). */
#ifdef _MSC_VER
#ifndef RT_BREAKPOINT
#if defined(RT_ARCH_AMD64)
# ifdef IN_RING3
# ifdef IN_RING3
# if defined(RT_OS_SOLARIS)
/** @todo # define RT_VALID_PTR(ptr) ( (uintptr_t)(ptr) + 0x80004000U >= 0x80004000U + 0x100000000ULL ) - figure this. */
# if defined(RT_OS_SOLARIS)
# ifdef IN_RING3
# ifdef RT_OS_SOLARIS
# ifdef RT_OS_SOLARIS
#define N_(s) (s)
#define _(s) gettext(s)
# ifdef _MSC_VER
# define RT_STRICT
#ifdef RT_NO_STRICT
# define RT_LOCK_NO_STRICT
# define RT_LOCK_NO_STRICT_ORDER
# define RT_LOCK_STRICT
# define RT_LOCK_STRICT_ORDER
# define RT_INLINE_ASM_EXTERNAL 0
#if defined(_MSC_VER)
# define RT_INLINE_ASM_GNU_STYLE 0
* Defined as the major MSC version if the compiler have and uses intrin.h.
#ifdef _MSC_VER
#ifndef RT_INLINE_ASM_USES_INTRIN
# define RT_INLINE_ASM_USES_INTRIN 0
#ifdef __cplusplus
# define DECLEXPORT_CLASS
# define DECLIMPORT_CLASS
#if defined(_MSC_VER)
#if defined(_MSC_VER)