1 | /* $Id: tst-1-c1xx-xcpt.cpp 2865 2016-09-02 22:17:13Z 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 |
|
---|