• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Processor or Compiler specific defines and types for IA-32 architecture.
3 
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 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_IA32
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(__INTEL_COMPILER)
31 //
32 // Disable ICC's remark #869: "Parameter" was never referenced warning.
33 // This is legal ANSI C code so we disable the remark that is turned on with -Wall
34 //
35 #pragma warning ( disable : 869 )
36 
37 //
38 // Disable ICC's remark #1418: external function definition with no prior declaration.
39 // This is legal ANSI C code so we disable the remark that is turned on with /W4
40 //
41 #pragma warning ( disable : 1418 )
42 
43 //
44 // Disable ICC's remark #1419: external declaration in primary source file
45 // This is legal ANSI C code so we disable the remark that is turned on with /W4
46 //
47 #pragma warning ( disable : 1419 )
48 
49 //
50 // Disable ICC's remark #593: "Variable" was set but never used.
51 // This is legal ANSI C code so we disable the remark that is turned on with /W4
52 //
53 #pragma warning ( disable : 593 )
54 
55 #endif
56 
57 
58 #if defined(_MSC_EXTENSIONS)
59 
60 //
61 // Disable warning that make it impossible to compile at /W4
62 // This only works for Microsoft* tools
63 //
64 
65 //
66 // Disabling bitfield type checking warnings.
67 //
68 #pragma warning ( disable : 4214 )
69 
70 //
71 // Disabling the unreferenced formal parameter warnings.
72 //
73 #pragma warning ( disable : 4100 )
74 
75 //
76 // Disable slightly different base types warning as CHAR8 * can not be set
77 // to a constant string.
78 //
79 #pragma warning ( disable : 4057 )
80 
81 //
82 // ASSERT(FALSE) or while (TRUE) are legal constructs so suppress this warning
83 //
84 #pragma warning ( disable : 4127 )
85 
86 //
87 // This warning is caused by functions defined but not used. For precompiled header only.
88 //
89 #pragma warning ( disable : 4505 )
90 
91 //
92 // This warning is caused by empty (after preprocessing) source file. For precompiled header only.
93 //
94 #pragma warning ( disable : 4206 )
95 
96 #if _MSC_VER == 1800 || _MSC_VER == 1900
97 
98 //
99 // Disable these warnings for VS2013.
100 //
101 
102 //
103 // This warning is for potentially uninitialized local variable, and it may cause false
104 // positive issues in VS2013 and VS2015 build
105 //
106 #pragma warning ( disable : 4701 )
107 
108 //
109 // This warning is for potentially uninitialized local pointer variable, and it may cause
110 // false positive issues in VS2013 and VS2015 build
111 //
112 #pragma warning ( disable : 4703 )
113 
114 #endif
115 
116 #endif
117 
118 
119 #if defined(_MSC_EXTENSIONS)
120 
121   //
122   // use Microsoft C compiler dependent integer width types
123   //
124 
125   ///
126   /// 8-byte unsigned value.
127   ///
128   typedef unsigned __int64    UINT64;
129   ///
130   /// 8-byte signed value.
131   ///
132   typedef __int64             INT64;
133   ///
134   /// 4-byte unsigned value.
135   ///
136   typedef unsigned __int32    UINT32;
137   ///
138   /// 4-byte signed value.
139   ///
140   typedef __int32             INT32;
141   ///
142   /// 2-byte unsigned value.
143   ///
144   typedef unsigned short      UINT16;
145   ///
146   /// 2-byte Character.  Unless otherwise specified all strings are stored in the
147   /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
148   ///
149   typedef unsigned short      CHAR16;
150   ///
151   /// 2-byte signed value.
152   ///
153   typedef short               INT16;
154   ///
155   /// Logical Boolean.  1-byte value containing 0 for FALSE or a 1 for TRUE.  Other
156   /// values are undefined.
157   ///
158   typedef unsigned char       BOOLEAN;
159   ///
160   /// 1-byte unsigned value.
161   ///
162   typedef unsigned char       UINT8;
163   ///
164   /// 1-byte Character.
165   ///
166   typedef char                CHAR8;
167   ///
168   /// 1-byte signed value.
169   ///
170   typedef signed char         INT8;
171 #else
172   ///
173   /// 8-byte unsigned value.
174   ///
175   typedef unsigned long long  UINT64;
176   ///
177   /// 8-byte signed value.
178   ///
179   typedef long long           INT64;
180   ///
181   /// 4-byte unsigned value.
182   ///
183   typedef unsigned int        UINT32;
184   ///
185   /// 4-byte signed value.
186   ///
187   typedef int                 INT32;
188   ///
189   /// 2-byte unsigned value.
190   ///
191   typedef unsigned short      UINT16;
192   ///
193   /// 2-byte Character.  Unless otherwise specified all strings are stored in the
194   /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
195   ///
196   typedef unsigned short      CHAR16;
197   ///
198   /// 2-byte signed value.
199   ///
200   typedef short               INT16;
201   ///
202   /// Logical Boolean.  1-byte value containing 0 for FALSE or a 1 for TRUE.  Other
203   /// values are undefined.
204   ///
205   typedef unsigned char       BOOLEAN;
206   ///
207   /// 1-byte unsigned value.
208   ///
209   typedef unsigned char       UINT8;
210   ///
211   /// 1-byte Character
212   ///
213   typedef char                CHAR8;
214   ///
215   /// 1-byte signed value
216   ///
217   typedef signed char         INT8;
218 #endif
219 
220 ///
221 /// Unsigned value of native width.  (4 bytes on supported 32-bit processor instructions;
222 /// 8 bytes on supported 64-bit processor instructions.)
223 ///
224 typedef UINT32  UINTN;
225 ///
226 /// Signed value of native width.  (4 bytes on supported 32-bit processor instructions;
227 /// 8 bytes on supported 64-bit processor instructions.)
228 ///
229 typedef INT32   INTN;
230 
231 //
232 // Processor specific defines
233 //
234 
235 ///
236 /// A value of native width with the highest bit set.
237 ///
238 #define MAX_BIT     0x80000000
239 ///
240 /// A value of native width with the two highest bits set.
241 ///
242 #define MAX_2_BITS  0xC0000000
243 
244 ///
245 /// Maximum legal IA-32 address.
246 ///
247 #define MAX_ADDRESS   0xFFFFFFFF
248 
249 ///
250 /// Maximum legal IA-32 INTN and UINTN values.
251 ///
252 #define MAX_INTN   ((INTN)0x7FFFFFFF)
253 #define MAX_UINTN  ((UINTN)0xFFFFFFFF)
254 
255 ///
256 /// The stack alignment required for IA-32.
257 ///
258 #define CPU_STACK_ALIGNMENT   sizeof(UINTN)
259 
260 //
261 // Modifier to ensure that all protocol member functions and EFI intrinsics
262 // use the correct C calling convention. All protocol member functions and
263 // EFI intrinsics are required to modify their member functions with EFIAPI.
264 //
265 #ifdef EFIAPI
266   ///
267   /// If EFIAPI is already defined, then we use that definition.
268   ///
269 #elif defined(_MSC_EXTENSIONS)
270   ///
271   /// Microsoft* compiler specific method for EFIAPI calling convention.
272   ///
273   #define EFIAPI __cdecl
274 #elif defined(__GNUC__)
275   ///
276   /// GCC specific method for EFIAPI calling convention.
277   ///
278   #define EFIAPI __attribute__((cdecl))
279 #else
280   ///
281   /// The default for a non Microsoft* or GCC compiler is to assume the EFI ABI
282   /// is the standard.
283   ///
284   #define EFIAPI
285 #endif
286 
287 #if defined(__GNUC__)
288   ///
289   /// For GNU assembly code, .global or .globl can declare global symbols.
290   /// Define this macro to unify the usage.
291   ///
292   #define ASM_GLOBAL .globl
293 #endif
294 
295 /**
296   Return the pointer to the first instruction of a function given a function pointer.
297   On IA-32 CPU architectures, these two pointer values are the same,
298   so the implementation of this macro is very simple.
299 
300   @param  FunctionPointer   A pointer to a function.
301 
302   @return The pointer to the first instruction of a function given a function pointer.
303 
304 **/
305 #define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)
306 
307 #ifndef __USER_LABEL_PREFIX__
308 #define __USER_LABEL_PREFIX__ _
309 #endif
310 
311 #endif
312 
313