]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/X64/ProcessorBind.h
MdePkg: move to 'hidden' visibility for all symbols under GCC/X64
[mirror_edk2.git] / MdePkg / Include / X64 / ProcessorBind.h
1 /** @file
2 Processor or Compiler specific defines and types x64 (Intel 64, AMD64).
3
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef __PROCESSOR_BIND_H__
16 #define __PROCESSOR_BIND_H__
17
18 ///
19 /// Define the processor type so other code can make processor based choices
20 ///
21 #define MDE_CPU_X64
22
23 //
24 // Make sure we are using the correct packing rules per EFI specification
25 //
26 #if !defined(__GNUC__)
27 #pragma pack()
28 #endif
29
30 #if defined(__GNUC__) && defined(__pic__)
31 //
32 // Mark all symbol declarations and references as hidden, meaning they will
33 // not be subject to symbol preemption. This allows the compiler to refer to
34 // symbols directly using relative references rather than via the GOT, which
35 // contains absolute symbol addresses that are subject to runtime relocation.
36 //
37 #pragma GCC visibility push (hidden)
38 #endif
39
40 #if defined(__INTEL_COMPILER)
41 //
42 // Disable ICC's remark #869: "Parameter" was never referenced warning.
43 // This is legal ANSI C code so we disable the remark that is turned on with -Wall
44 //
45 #pragma warning ( disable : 869 )
46
47 //
48 // Disable ICC's remark #1418: external function definition with no prior declaration.
49 // This is legal ANSI C code so we disable the remark that is turned on with /W4
50 //
51 #pragma warning ( disable : 1418 )
52
53 //
54 // Disable ICC's remark #1419: external declaration in primary source file
55 // This is legal ANSI C code so we disable the remark that is turned on with /W4
56 //
57 #pragma warning ( disable : 1419 )
58
59 //
60 // Disable ICC's remark #593: "Variable" was set but never used.
61 // This is legal ANSI C code so we disable the remark that is turned on with /W4
62 //
63 #pragma warning ( disable : 593 )
64
65 #endif
66
67
68 #if defined(_MSC_EXTENSIONS)
69
70 //
71 // Disable warning that make it impossible to compile at /W4
72 // This only works for Microsoft* tools
73 //
74
75 //
76 // Disabling bitfield type checking warnings.
77 //
78 #pragma warning ( disable : 4214 )
79
80 //
81 // Disabling the unreferenced formal parameter warnings.
82 //
83 #pragma warning ( disable : 4100 )
84
85 //
86 // Disable slightly different base types warning as CHAR8 * can not be set
87 // to a constant string.
88 //
89 #pragma warning ( disable : 4057 )
90
91 //
92 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
93 //
94 #pragma warning ( disable : 4127 )
95
96 //
97 // This warning is caused by functions defined but not used. For precompiled header only.
98 //
99 #pragma warning ( disable : 4505 )
100
101 //
102 // This warning is caused by empty (after preprocessing) source file. For precompiled header only.
103 //
104 #pragma warning ( disable : 4206 )
105
106 #if _MSC_VER == 1800 || _MSC_VER == 1900
107
108 //
109 // Disable these warnings for VS2013.
110 //
111
112 //
113 // This warning is for potentially uninitialized local variable, and it may cause false
114 // positive issues in VS2013 and VS2015 build
115 //
116 #pragma warning ( disable : 4701 )
117
118 //
119 // This warning is for potentially uninitialized local pointer variable, and it may cause
120 // false positive issues in VS2013 and VS2015 build
121 //
122 #pragma warning ( disable : 4703 )
123
124 #endif
125
126 #endif
127
128
129 #if defined(_MSC_EXTENSIONS)
130 //
131 // use Microsoft C complier dependent integer width types
132 //
133
134 ///
135 /// 8-byte unsigned value
136 ///
137 typedef unsigned __int64 UINT64;
138 ///
139 /// 8-byte signed value
140 ///
141 typedef __int64 INT64;
142 ///
143 /// 4-byte unsigned value
144 ///
145 typedef unsigned __int32 UINT32;
146 ///
147 /// 4-byte signed value
148 ///
149 typedef __int32 INT32;
150 ///
151 /// 2-byte unsigned value
152 ///
153 typedef unsigned short UINT16;
154 ///
155 /// 2-byte Character. Unless otherwise specified all strings are stored in the
156 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
157 ///
158 typedef unsigned short CHAR16;
159 ///
160 /// 2-byte signed value
161 ///
162 typedef short INT16;
163 ///
164 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other
165 /// values are undefined.
166 ///
167 typedef unsigned char BOOLEAN;
168 ///
169 /// 1-byte unsigned value
170 ///
171 typedef unsigned char UINT8;
172 ///
173 /// 1-byte Character
174 ///
175 typedef char CHAR8;
176 ///
177 /// 1-byte signed value
178 ///
179 typedef signed char INT8;
180 #else
181 ///
182 /// 8-byte unsigned value
183 ///
184 typedef unsigned long long UINT64;
185 ///
186 /// 8-byte signed value
187 ///
188 typedef long long INT64;
189 ///
190 /// 4-byte unsigned value
191 ///
192 typedef unsigned int UINT32;
193 ///
194 /// 4-byte signed value
195 ///
196 typedef int INT32;
197 ///
198 /// 2-byte unsigned value
199 ///
200 typedef unsigned short UINT16;
201 ///
202 /// 2-byte Character. Unless otherwise specified all strings are stored in the
203 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
204 ///
205 typedef unsigned short CHAR16;
206 ///
207 /// 2-byte signed value
208 ///
209 typedef short INT16;
210 ///
211 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other
212 /// values are undefined.
213 ///
214 typedef unsigned char BOOLEAN;
215 ///
216 /// 1-byte unsigned value
217 ///
218 typedef unsigned char UINT8;
219 ///
220 /// 1-byte Character
221 ///
222 typedef char CHAR8;
223 ///
224 /// 1-byte signed value
225 ///
226 typedef signed char INT8;
227 #endif
228
229 ///
230 /// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions,
231 /// 8 bytes on supported 64-bit processor instructions)
232 ///
233 typedef UINT64 UINTN;
234 ///
235 /// Signed value of native width. (4 bytes on supported 32-bit processor instructions,
236 /// 8 bytes on supported 64-bit processor instructions)
237 ///
238 typedef INT64 INTN;
239
240
241 //
242 // Processor specific defines
243 //
244
245 ///
246 /// A value of native width with the highest bit set.
247 ///
248 #define MAX_BIT 0x8000000000000000ULL
249 ///
250 /// A value of native width with the two highest bits set.
251 ///
252 #define MAX_2_BITS 0xC000000000000000ULL
253
254 ///
255 /// Maximum legal x64 address
256 ///
257 #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFFULL
258
259 ///
260 /// Maximum legal x64 INTN and UINTN values.
261 ///
262 #define MAX_INTN ((INTN)0x7FFFFFFFFFFFFFFFULL)
263 #define MAX_UINTN ((UINTN)0xFFFFFFFFFFFFFFFFULL)
264
265 ///
266 /// The stack alignment required for x64
267 ///
268 #define CPU_STACK_ALIGNMENT 16
269
270 //
271 // Modifier to ensure that all protocol member functions and EFI intrinsics
272 // use the correct C calling convention. All protocol member functions and
273 // EFI intrinsics are required to modify their member functions with EFIAPI.
274 //
275 #ifdef EFIAPI
276 ///
277 /// If EFIAPI is already defined, then we use that definition.
278 ///
279 #elif defined(_MSC_EXTENSIONS)
280 ///
281 /// Microsoft* compiler specific method for EFIAPI calling convention.
282 ///
283 #define EFIAPI __cdecl
284 #elif defined(__GNUC__)
285 ///
286 /// Define the standard calling convention regardless of optimization level.
287 /// The GCC support assumes a GCC compiler that supports the EFI ABI. The EFI
288 /// ABI is much closer to the x64 Microsoft* ABI than standard x64 (x86-64)
289 /// GCC ABI. Thus a standard x64 (x86-64) GCC compiler can not be used for
290 /// x64. Warning the assembly code in the MDE x64 does not follow the correct
291 /// ABI for the standard x64 (x86-64) GCC.
292 ///
293 #define EFIAPI
294 #else
295 ///
296 /// The default for a non Microsoft* or GCC compiler is to assume the EFI ABI
297 /// is the standard.
298 ///
299 #define EFIAPI
300 #endif
301
302 #if defined(__GNUC__)
303 ///
304 /// For GNU assembly code, .global or .globl can declare global symbols.
305 /// Define this macro to unify the usage.
306 ///
307 #define ASM_GLOBAL .globl
308 #endif
309
310 /**
311 Return the pointer to the first instruction of a function given a function pointer.
312 On x64 CPU architectures, these two pointer values are the same,
313 so the implementation of this macro is very simple.
314
315 @param FunctionPointer A pointer to a function.
316
317 @return The pointer to the first instruction of a function given a function pointer.
318
319 **/
320 #define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)
321
322 #ifndef __USER_LABEL_PREFIX__
323 #define __USER_LABEL_PREFIX__
324 #endif
325
326 #endif
327