1/** @file
2  Processor or Compiler specific defines and types for IA-32 architecture.
3
4Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5This program and the accompanying materials are licensed and made available under
6the terms and conditions of the BSD License that accompanies this distribution.
7The full text of the license may be found at
8http://opensource.org/licenses/bsd-license.php.
9
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11WITHOUT 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///
224typedef 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///
229typedef 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