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