alignmentchecks.h revision c7814cf6e1240a519cbec0441e033d0e2470ed00
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/* $Id$ */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/** @file
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * IPRT - Internal header for hacking alignment checks on x86 and AMD64.
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/*
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * Copyright (C) 2009-2010 Oracle Corporation
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync *
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * available from http://www.virtualbox.org. This file is free software;
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * you can redistribute it and/or modify it under the terms of the GNU
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * General Public License (GPL) as published by the Free Software
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync *
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * The contents of this file may alternatively be used under the terms
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * of the Common Development and Distribution License Version 1.0
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * VirtualBox OSE distribution, in which case the provisions of the
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * CDDL are applicable instead of those of the GPL.
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync *
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * You may elect to license modified versions of this file under the
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * terms and conditions of either the GPL or the CDDL or both.
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#ifndef ___internal_alignmentchecks_h
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#define ___internal_alignmentchecks_h
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/** @def IPRT_WITH_ALIGNMENT_CHECKS
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * Enables or disables the alignment check feature and related hacks. */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#ifndef IPRT_WITH_ALIGNMENT_CHECKS
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync# if ( defined(DEBUG) && !defined(IN_GUEST) ) || defined(DOXYGEN_RUNNING)
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync# define IPRT_WITH_ALIGNMENT_CHECKS 1
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync# endif
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#endif
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/** @def IPRT_ALIGNMENT_CHECKS_DISABLE
70aa086e9e9d2f85d2e997d0e69169018a001e54vboxsync * Disables alignment checks.
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync * Typically used before calling problematic library functions.
70aa086e9e9d2f85d2e997d0e69169018a001e54vboxsync */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync/** @def IPRT_ALIGNMENT_CHECKS_ENABLE
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync * (re-)Enables alignment checks if they are supposed to be active.
9b19f1c26bfea41cfad5fd97aaf5797a7507fb5cvboxsync * This is used to counter IPRT_ALIGNMENT_CHECKS_DISABLE as well as enabling
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync * them for the first time.
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync */
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync#if defined(IPRT_WITH_ALIGNMENT_CHECKS) \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync && ( defined(RT_ARCH_AMD64) \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync || defined(RT_ARCH_X86) )
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync# include <iprt/asm-amd64-x86.h>
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsyncRT_C_DECLS_BEGIN
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsyncextern RTDATADECL(bool) g_fRTAlignmentChecks;
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsyncRT_C_DECLS_END
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync
9b19f1c26bfea41cfad5fd97aaf5797a7507fb5cvboxsync# define IPRT_ALIGNMENT_CHECKS_DISABLE() \
9b19f1c26bfea41cfad5fd97aaf5797a7507fb5cvboxsync do { if (g_fRTAlignmentChecks) ASMSetFlags(ASMGetFlags() & ~RT_BIT_32(18)); } while (0)
9b19f1c26bfea41cfad5fd97aaf5797a7507fb5cvboxsync
9b19f1c26bfea41cfad5fd97aaf5797a7507fb5cvboxsync# define IPRT_ALIGNMENT_CHECKS_ENABLE() \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync do { if (g_fRTAlignmentChecks) ASMSetFlags(ASMGetFlags() | RT_BIT_32(18)); } while (0)
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#else
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync# define IPRT_ALIGNMENT_CHECKS_DISABLE() do {} while (0)
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync# define IPRT_ALIGNMENT_CHECKS_ENABLE() do {} while (0)
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#endif
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#endif
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync