1 /* $Id: tst-1-c1xx-xcpt.cpp 2889 2016-09-07 14:41:02Z bird $ */ 2 3 /* 4 * kWorker testcase. 5 * 6 * This is a testcase sitched together from bits of iprt/cdefs.h, 7 * iprt/assert.h and VBox/vmm/hm_vmx.h. 8 * 9 * It triggers an 0xc0000005 exception (#PF) via RT_BF_ASSERT_COMPILE_CHECKS, 10 * guess this is due to deep preprocessor expansion nesting (around 32 levels). 11 * 12 * This doesn't work if we haven't got the exception handling right, 13 * like the RtlAddFunctionTable and RtlDeleteFunctionTable calls. 14 * 15 */ 16 17 /* glue */ 18 #define UINT32_C(x) x##U 19 #define UINT32_MAX 0xffffffffU 20 21 22 /** @file 23 * IPRT - Common C and C++ definitions. 24 */ 25 26 /* 27 * Copyright (C) 2006-2016 Oracle Corporation 28 * 29 * This file is part of VirtualBox Open Source Edition (OSE), as 30 * available from http://www.virtualbox.org. This file is free software; 31 * you can redistribute it and/or modify it under the terms of the GNU 32 * General Public License (GPL) as published by the Free Software 33 * Foundation, in version 2 as it comes in the "COPYING" file of the 34 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the 35 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 36 * 37 * The contents of this file may alternatively be used under the terms 38 * of the Common Development and Distribution License Version 1.0 39 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the 40 * VirtualBox OSE distribution, in which case the provisions of the 41 * CDDL are applicable instead of those of the GPL. 42 * 43 * You may elect to license modified versions of this file under the 44 * terms and conditions of either the GPL or the CDDL or both. 45 */ 46 47 /** @def RT_EXPAND_2 48 * Helper for RT_EXPAND. */ 49 #define RT_EXPAND_2(a_Expr) a_Expr 50 /** @def RT_EXPAND 51 * Returns the expanded expression. 52 * @param a_Expr The expression to expand. */ 53 #define RT_EXPAND(a_Expr) RT_EXPAND_2(a_Expr) 54 55 56 /** @def RT_UNPACK_CALL 57 * Unpacks the an argument list inside an extra set of parenthesis and turns it 58 * into a call to @a a_Fn. 59 * 60 * @param a_Fn Function/macro to call. 61 * @param a_Args Parameter list in parenthesis. 62 */ 63 #define RT_UNPACK_CALL(a_Fn, a_Args) a_Fn a_Args 64 65 66 /** @def RT_UNPACK_ARGS 67 * Returns the arguments without parenthesis. 68 * 69 * @param ... Parameter list in parenthesis. 70 * @remarks Requires RT_COMPILER_SUPPORTS_VA_ARGS. 71 */ 72 # define RT_UNPACK_ARGS(...) __VA_ARGS__ 73 74 /** @def RT_COUNT_VA_ARGS_HLP 75 * Helper for RT_COUNT_VA_ARGS that picks out the argument count from 76 * RT_COUNT_VA_ARGS_REV_SEQ. */ 77 #define RT_COUNT_VA_ARGS_HLP( \ 78 c69, c68, c67, c66, c65, c64, c63, c62, c61, c60, \ 79 c59, c58, c57, c56, c55, c54, c53, c52, c51, c50, \ 80 c49, c48, c47, c46, c45, c44, c43, c42, c41, c40, \ 81 c39, c38, c37, c36, c35, c34, c33, c32, c31, c30, \ 82 c29, c28, c27, c26, c25, c24, c23, c22, c21, c20, \ 83 c19, c18, c17, c16, c15, c14, c13, c12, c11, c10, \ 84 c9, c8, c7, c6, c5, c4, c3, c2, c1, cArgs, ...) cArgs 85 /** Argument count sequence. */ 86 #define RT_COUNT_VA_ARGS_REV_SEQ \ 87 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, \ 88 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ 89 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ 90 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \ 91 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \ 92 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ 93 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 94 /** This is for zero arguments. At least Visual C++ requires it. */ 95 #define RT_COUNT_VA_ARGS_PREFIX_RT_NOTHING RT_COUNT_VA_ARGS_REV_SEQ 96 /** 97 * Counts the number of arguments given to the variadic macro. 98 * 99 * Max is 69. 100 * 101 * @returns Number of arguments in the ellipsis 102 * @param ... Arguments to count. 103 * @remarks Requires RT_COMPILER_SUPPORTS_VA_ARGS. 104 */ 105 #define RT_COUNT_VA_ARGS(...) \ 106 RT_UNPACK_CALL(RT_COUNT_VA_ARGS_HLP, (RT_COUNT_VA_ARGS_PREFIX_ ## __VA_ARGS__ ## RT_NOTHING, \ 107 RT_COUNT_VA_ARGS_REV_SEQ)) 108 /** @def RT_CONCAT 109 * Concatenate the expanded arguments without any extra spaces in between. 110 * 111 * @param a The first part. 112 * @param b The second part. 113 */ 114 #define RT_CONCAT(a,b) RT_CONCAT_HLP(a,b) 115 /** RT_CONCAT helper, don't use. */ 116 #define RT_CONCAT_HLP(a,b) a##b 117 118 /** @def RT_CONCAT3 119 * Concatenate the expanded arguments without any extra spaces in between. 120 * 121 * @param a The 1st part. 122 * @param b The 2nd part. 123 * @param c The 3rd part. 124 */ 125 #define RT_CONCAT3(a,b,c) RT_CONCAT3_HLP(a,b,c) 126 /** RT_CONCAT3 helper, don't use. */ 127 #define RT_CONCAT3_HLP(a,b,c) a##b##c 128 129 /** Bit field compile time check helper 130 * @internal */ 131 #define RT_BF_CHECK_DO_XOR_MASK(a_uLeft, a_RightPrefix, a_FieldNm) ((a_uLeft) ^ RT_CONCAT3(a_RightPrefix, a_FieldNm, _MASK)) 132 /** Bit field compile time check helper 133 * @internal */ 134 #define RT_BF_CHECK_DO_OR_MASK(a_uLeft, a_RightPrefix, a_FieldNm) ((a_uLeft) | RT_CONCAT3(a_RightPrefix, a_FieldNm, _MASK)) 135 /** Bit field compile time check helper 136 * @internal */ 137 #define RT_BF_CHECK_DO_1ST_MASK_BIT(a_uLeft, a_RightPrefix, a_FieldNm) \ 138 ((a_uLeft) && ( (RT_CONCAT3(a_RightPrefix, a_FieldNm, _MASK) >> RT_CONCAT3(a_RightPrefix, a_FieldNm, _SHIFT)) & 1U ) ) 139 /** Used to check that a bit field mask does not start too early. 140 * @internal */ 141 #define RT_BF_CHECK_DO_MASK_START(a_uLeft, a_RightPrefix, a_FieldNm) \ 142 ( (a_uLeft) \ 143 && ( RT_CONCAT3(a_RightPrefix, a_FieldNm, _SHIFT) == 0 \ 144 || ( ( ( ((RT_CONCAT3(a_RightPrefix, a_FieldNm, _MASK) >> RT_CONCAT3(a_RightPrefix, a_FieldNm, _SHIFT)) & 1U) \ 145 << RT_CONCAT3(a_RightPrefix, a_FieldNm, _SHIFT)) /* => single bit mask, correct type */ \ 146 - 1U) /* => mask of all bits below the field */ \ 147 & RT_CONCAT3(a_RightPrefix, a_FieldNm, _MASK)) == 0 ) ) 148 /** @name Bit field compile time check recursion workers. 149 * @internal 150 * @{ */ 151 #define RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix, f1) \ 152 a_DoThis(a_uLeft, a_RightPrefix, f1) 153 #define RT_BF_CHECK_DO_2(a_DoThis, a_uLeft, a_RightPrefix, f1, f2) \ 154 RT_BF_CHECK_DO_1(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2) 155 #define RT_BF_CHECK_DO_3(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3) \ 156 RT_BF_CHECK_DO_2(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3) 157 #define RT_BF_CHECK_DO_4(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4) \ 158 RT_BF_CHECK_DO_3(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4) 159 #define RT_BF_CHECK_DO_5(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5) \ 160 RT_BF_CHECK_DO_4(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5) 161 #define RT_BF_CHECK_DO_6(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6) \ 162 RT_BF_CHECK_DO_5(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6) 163 #define RT_BF_CHECK_DO_7(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7) \ 164 RT_BF_CHECK_DO_6(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7) 165 #define RT_BF_CHECK_DO_8(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8) \ 166 RT_BF_CHECK_DO_7(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8) 167 #define RT_BF_CHECK_DO_9(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9) \ 168 RT_BF_CHECK_DO_8(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9) 169 #define RT_BF_CHECK_DO_10(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \ 170 RT_BF_CHECK_DO_9(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10) 171 #define RT_BF_CHECK_DO_11(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11) \ 172 RT_BF_CHECK_DO_10(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11) 173 #define RT_BF_CHECK_DO_12(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12) \ 174 RT_BF_CHECK_DO_11(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12) 175 #define RT_BF_CHECK_DO_13(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13) \ 176 RT_BF_CHECK_DO_12(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13) 177 #define RT_BF_CHECK_DO_14(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14) \ 178 RT_BF_CHECK_DO_13(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14) 179 #define RT_BF_CHECK_DO_15(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15) \ 180 RT_BF_CHECK_DO_14(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15) 181 #define RT_BF_CHECK_DO_16(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16) \ 182 RT_BF_CHECK_DO_15(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16) 183 #define RT_BF_CHECK_DO_17(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17) \ 184 RT_BF_CHECK_DO_16(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17) 185 #define RT_BF_CHECK_DO_18(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18) \ 186 RT_BF_CHECK_DO_17(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18) 187 #define RT_BF_CHECK_DO_19(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19) \ 188 RT_BF_CHECK_DO_18(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19) 189 #define RT_BF_CHECK_DO_20(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20) \ 190 RT_BF_CHECK_DO_19(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20) 191 #define RT_BF_CHECK_DO_21(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21) \ 192 RT_BF_CHECK_DO_20(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21) 193 #define RT_BF_CHECK_DO_22(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22) \ 194 RT_BF_CHECK_DO_21(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22) 195 #define RT_BF_CHECK_DO_23(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23) \ 196 RT_BF_CHECK_DO_22(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23) 197 #define RT_BF_CHECK_DO_24(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24) \ 198 RT_BF_CHECK_DO_23(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24) 199 #define RT_BF_CHECK_DO_25(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25) \ 200 RT_BF_CHECK_DO_24(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25) 201 #define RT_BF_CHECK_DO_26(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26) \ 202 RT_BF_CHECK_DO_25(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26) 203 #define RT_BF_CHECK_DO_27(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27) \ 204 RT_BF_CHECK_DO_26(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27) 205 #define RT_BF_CHECK_DO_28(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28) \ 206 RT_BF_CHECK_DO_27(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28) 207 #define RT_BF_CHECK_DO_29(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29) \ 208 RT_BF_CHECK_DO_28(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29) 209 #define RT_BF_CHECK_DO_30(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30) \ 210 RT_BF_CHECK_DO_29(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30) 211 #define RT_BF_CHECK_DO_31(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31) \ 212 RT_BF_CHECK_DO_30(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31) 213 #define RT_BF_CHECK_DO_32(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31, f32) \ 214 RT_BF_CHECK_DO_31(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31, f32) 215 #define RT_BF_CHECK_DO_33(a_DoThis, a_uLeft, a_RightPrefix, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31, f32, f33) \ 216 RT_BF_CHECK_DO_32(a_DoThis, RT_BF_CHECK_DO_1(a_DoThis, a_uLeft, a_RightPrefix,f1), a_RightPrefix, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, f31, f32, f33) 217 /** @} */ 218 219 /** @def RT_BF_ASSERT_COMPILE_CHECKS 220 * Emits a series of AssertCompile statements checking that the bit-field 221 * declarations doesn't overlap, has holes, and generally makes some sense. 222 * 223 * This requires variadic macros because its too much to type otherwise. 224 */ 225 #define RT_BF_ASSERT_COMPILE_CHECKS(a_Prefix, a_uZero, a_uCovered, a_Fields) \ 226 AssertCompile(RT_BF_CHECK_DO_N(RT_BF_CHECK_DO_OR_MASK, a_uZero, a_Prefix, RT_UNPACK_ARGS a_Fields ) == a_uCovered); \ 227 AssertCompile(RT_BF_CHECK_DO_N(RT_BF_CHECK_DO_XOR_MASK, a_uCovered, a_Prefix, RT_UNPACK_ARGS a_Fields ) == 0); \ 228 AssertCompile(RT_BF_CHECK_DO_N(RT_BF_CHECK_DO_1ST_MASK_BIT, true, a_Prefix, RT_UNPACK_ARGS a_Fields ) == true); \ 229 AssertCompile(RT_BF_CHECK_DO_N(RT_BF_CHECK_DO_MASK_START, true, a_Prefix, RT_UNPACK_ARGS a_Fields ) == true) 230 /** Bit field compile time check helper 231 * @internal */ 232 #define RT_BF_CHECK_DO_N(a_DoThis, a_uLeft, a_RightPrefix, ...) \ 233 RT_UNPACK_CALL(RT_CONCAT(RT_BF_CHECK_DO_, RT_EXPAND(RT_COUNT_VA_ARGS(__VA_ARGS__))), (a_DoThis, a_uLeft, a_RightPrefix, __VA_ARGS__)) 234 235 236 /** @file 237 * IPRT - Assertions. 238 */ 239 240 /* 241 * Copyright (C) 2006-2016 Oracle Corporation 242 * 243 * This file is part of VirtualBox Open Source Edition (OSE), as 244 * available from http://www.virtualbox.org. This file is free software; 245 * you can redistribute it and/or modify it under the terms of the GNU 246 * General Public License (GPL) as published by the Free Software 247 * Foundation, in version 2 as it comes in the "COPYING" file of the 248 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the 249 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 250 * 251 * The contents of this file may alternatively be used under the terms 252 * of the Common Development and Distribution License Version 1.0 253 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the 254 * VirtualBox OSE distribution, in which case the provisions of the 255 * CDDL are applicable instead of those of the GPL. 256 * 257 * You may elect to license modified versions of this file under the 258 * terms and conditions of either the GPL or the CDDL or both. 259 */ 260 261 /** @def AssertCompile 262 * Asserts that a C++0x compile-time expression is true. If it's not break the 263 * build. 264 * @param expr Expression which should be true. 265 */ 266 #define AssertCompile(expr) static_assert(!!(expr), #expr) 267 268 269 270 271 /** @file 272 * HM - VMX Structures and Definitions. (VMM) 273 */ 274 275 /* 276 * Copyright (C) 2006-2016 Oracle Corporation 277 * 278 * This file is part of VirtualBox Open Source Edition (OSE), as 279 * available from http://www.virtualbox.org. This file is free software; 280 * you can redistribute it and/or modify it under the terms of the GNU 281 * General Public License (GPL) as published by the Free Software 282 * Foundation, in version 2 as it comes in the "COPYING" file of the 283 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the 284 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 285 * 286 * The contents of this file may alternatively be used under the terms 287 * of the Common Development and Distribution License Version 1.0 288 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the 289 * VirtualBox OSE distribution, in which case the provisions of the 290 * CDDL are applicable instead of those of the GPL. 291 * 292 * You may elect to license modified versions of this file under the 293 * terms and conditions of either the GPL or the CDDL or both. 294 */ 295 296 /** Address calculation scaling field (powers of two). */ 297 #define VMX_XDTR_INSINFO_SCALE_SHIFT 0 298 #define VMX_XDTR_INSINFO_SCALE_MASK UINT32_C(0x00000003) 299 /** Bits 2 thru 6 are undefined. */ 300 #define VMX_XDTR_INSINFO_UNDEF_2_6_SHIFT 2 301 #define VMX_XDTR_INSINFO_UNDEF_2_6_MASK UINT32_C(0x0000007c) 302 /** Address size, only 0(=16), 1(=32) and 2(=64) are defined. 303 * @remarks anyone's guess why this is a 3 bit field... */ 304 #define VMX_XDTR_INSINFO_ADDR_SIZE_SHIFT 7 305 #define VMX_XDTR_INSINFO_ADDR_SIZE_MASK UINT32_C(0x00000380) 306 /** Bit 10 is defined as zero. */ 307 #define VMX_XDTR_INSINFO_ZERO_10_SHIFT 10 308 #define VMX_XDTR_INSINFO_ZERO_10_MASK UINT32_C(0x00000400) 309 /** Operand size, either (1=)32-bit or (0=)16-bit, but get this, it's undefined 310 * for exits from 64-bit code as the operand size there is fixed. */ 311 #define VMX_XDTR_INSINFO_OP_SIZE_SHIFT 11 312 #define VMX_XDTR_INSINFO_OP_SIZE_MASK UINT32_C(0x00000800) 313 /** Bits 12 thru 14 are undefined. */ 314 #define VMX_XDTR_INSINFO_UNDEF_12_14_SHIFT 12 315 #define VMX_XDTR_INSINFO_UNDEF_12_14_MASK UINT32_C(0x00007000) 316 /** Applicable segment register (X86_SREG_XXX values). */ 317 #define VMX_XDTR_INSINFO_SREG_SHIFT 15 318 #define VMX_XDTR_INSINFO_SREG_MASK UINT32_C(0x00038000) 319 /** Index register (X86_GREG_XXX values). Undefined if HAS_INDEX_REG is clear. */ 320 #define VMX_XDTR_INSINFO_INDEX_REG_SHIFT 18 321 #define VMX_XDTR_INSINFO_INDEX_REG_MASK UINT32_C(0x003c0000) 322 /** Is VMX_XDTR_INSINFO_INDEX_REG_XXX valid (=1) or not (=0). */ 323 #define VMX_XDTR_INSINFO_HAS_INDEX_REG_SHIFT 22 324 #define VMX_XDTR_INSINFO_HAS_INDEX_REG_MASK UINT32_C(0x00400000) 325 /** Base register (X86_GREG_XXX values). Undefined if HAS_BASE_REG is clear. */ 326 #define VMX_XDTR_INSINFO_BASE_REG_SHIFT 23 327 #define VMX_XDTR_INSINFO_BASE_REG_MASK UINT32_C(0x07800000) 328 /** Is VMX_XDTR_INSINFO_BASE_REG_XXX valid (=1) or not (=0). */ 329 #define VMX_XDTR_INSINFO_HAS_BASE_REG_SHIFT 27 330 #define VMX_XDTR_INSINFO_HAS_BASE_REG_MASK UINT32_C(0x08000000) 331 /** The instruction identity (VMX_XDTR_INSINFO_II_XXX values) */ 332 #define VMX_XDTR_INSINFO_INSTR_ID_SHIFT 28 333 #define VMX_XDTR_INSINFO_INSTR_ID_MASK UINT32_C(0x30000000) 334 #define VMX_XDTR_INSINFO_II_SGDT 0 /**< Instruction ID: SGDT */ 335 #define VMX_XDTR_INSINFO_II_SIDT 1 /**< Instruction ID: SIDT */ 336 #define VMX_XDTR_INSINFO_II_LGDT 2 /**< Instruction ID: LGDT */ 337 #define VMX_XDTR_INSINFO_II_LIDT 3 /**< Instruction ID: LIDT */ 338 /** Bits 30 & 31 are undefined. */ 339 #define VMX_XDTR_INSINFO_UNDEF_30_31_SHIFT 30 340 #define VMX_XDTR_INSINFO_UNDEF_30_31_MASK UINT32_C(0xc0000000) 341 RT_BF_ASSERT_COMPILE_CHECKS(VMX_XDTR_INSINFO_, UINT32_C(0), UINT32_MAX, 342 (SCALE, UNDEF_2_6, ADDR_SIZE, ZERO_10, OP_SIZE, UNDEF_12_14, SREG, INDEX_REG, HAS_INDEX_REG, 343 BASE_REG, HAS_BASE_REG, INSTR_ID, UNDEF_30_31)); 344 345 346