VirtualBox

source: kBuild/trunk/src/kWorker/tst-1-c1xx-xcpt.cpp@ 2878

Last change on this file since 2878 was 2865, checked in by bird, 9 years ago

fixed exception in c1xx.dll/msvcrt/memcpy.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 23.8 KB
Line 
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)
341RT_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
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette