added additional comments and fixed some typo.
[people/mcb30/edk2.git] / edk2 / MdePkg / Include / x64 / ProcessorBind.h
1 /** @file\r
2   Processor or Compiler specific defines and types x64 (Intel(r) EM64T, AMD64).\r
3 \r
4   Copyright (c) 2006, Intel Corporation                                                         \r
5   All rights reserved. This program and the accompanying materials                          \r
6   are licensed and made available under the terms and conditions of the BSD License         \r
7   which accompanies this distribution.  The full text of the license may be found at        \r
8   http://opensource.org/licenses/bsd-license.php                                            \r
9 \r
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
12 \r
13 **/\r
14 \r
15 #ifndef __PROCESSOR_BIND_H__\r
16 #define __PROCESSOR_BIND_H__\r
17 \r
18 ///\r
19 /// Define the processor type so other code can make processor based choices\r
20 ///\r
21 #define MDE_CPU_X64\r
22 \r
23 \r
24 //\r
25 // Make sure we are useing the correct packing rules per EFI specification\r
26 //\r
27 #ifndef __GNUC__\r
28 #pragma pack()\r
29 #endif\r
30 \r
31 \r
32 #if __INTEL_COMPILER\r
33 //\r
34 // Disable ICC's remark #593: "LocalVariable" was set but never used\r
35 // This is legal ANSI C code so we disable the remark that is turned on with -Wall\r
36 //\r
37 #pragma warning ( disable : 593 )\r
38 \r
39 //\r
40 // Disable ICC's remark #869: "Parameter" was never referenced warning.\r
41 // This is legal ANSI C code so we disable the remark that is turned on with -Wall\r
42 //\r
43 #pragma warning ( disable : 869 )\r
44 \r
45 //\r
46 // Disable ICC's remark #1418: external function definition with no prior declaration.\r
47 // This is legal ANSI C code so we disable the remark that is turned on with /W4\r
48 //\r
49 #pragma warning ( disable : 1418 )\r
50 \r
51 //\r
52 // Disable ICC's remark #1419: external declaration in primary source file\r
53 // This is legal ANSI C code so we disable the remark that is turned on with /W4\r
54 //\r
55 #pragma warning ( disable : 1419 )\r
56 \r
57 #endif\r
58 \r
59 \r
60 #if _MSC_EXTENSIONS\r
61 \r
62 //\r
63 // Disable warning that make it impossible to compile at /W4\r
64 // This only works for Microsoft* tools\r
65 //\r
66 \r
67 //\r
68 // Disabling bitfield type checking warnings.\r
69 //\r
70 #pragma warning ( disable : 4214 )\r
71 \r
72 //\r
73 // Disabling the unreferenced formal parameter warnings.\r
74 //\r
75 #pragma warning ( disable : 4100 )\r
76 \r
77 //\r
78 // Disable slightly different base types warning as CHAR8 * can not be set\r
79 // to a constant string.\r
80 //\r
81 #pragma warning ( disable : 4057 )\r
82 \r
83 //\r
84 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning\r
85 //\r
86 #pragma warning ( disable : 4127 )\r
87 \r
88 //\r
89 // This warning is caused by functions defined but not used. For precompiled header only.\r
90 //\r
91 #pragma warning ( disable : 4505 )\r
92 \r
93 //\r
94 // This warning is caused by empty (after preprocessing) souce file. For precompiled header only.\r
95 //\r
96 #pragma warning ( disable : 4206 )\r
97 \r
98 #endif\r
99 \r
100 \r
101 #if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L)\r
102   //\r
103   // No ANSI C 2000 stdint.h integer width declarations, so define equivalents\r
104   //\r
105  \r
106   #if _MSC_EXTENSIONS \r
107     \r
108 \r
109     //\r
110     // use Microsoft C complier dependent interger width types \r
111     //\r
112     typedef unsigned __int64    UINT64;\r
113     typedef __int64             INT64;\r
114     typedef unsigned __int32    UINT32;\r
115     typedef __int32             INT32;\r
116     typedef unsigned short      UINT16;\r
117     typedef unsigned short      CHAR16;\r
118     typedef short               INT16;\r
119     typedef unsigned char       BOOLEAN;\r
120     typedef unsigned char       UINT8;\r
121     typedef char                CHAR8;\r
122     typedef char                INT8;\r
123   #else\r
124     #ifdef _EFI_P64 \r
125       //\r
126       // P64 - is Intel Itanium(TM) speak for pointers being 64-bit and longs and ints \r
127       //  are 32-bits\r
128       //\r
129       typedef unsigned long long  UINT64;\r
130       typedef long long           INT64;\r
131       typedef unsigned int        UINT32;\r
132       typedef int                 INT32;\r
133       typedef unsigned short      CHAR16;\r
134       typedef unsigned short      UINT16;\r
135       typedef short               INT16;\r
136       typedef unsigned char       BOOLEAN;\r
137       typedef unsigned char       UINT8;\r
138       typedef char                CHAR8;\r
139       typedef char                INT8;\r
140     #else\r
141       //\r
142       // Assume LP64 - longs and pointers are 64-bit. Ints are 32-bit.\r
143       //\r
144       typedef unsigned long   UINT64;\r
145       typedef long            INT64;\r
146       typedef unsigned int    UINT32;\r
147       typedef int             INT32;\r
148       typedef unsigned short  UINT16;\r
149       typedef unsigned short  CHAR16;\r
150       typedef short           INT16;\r
151       typedef unsigned char   BOOLEAN;\r
152       typedef unsigned char   UINT8;\r
153       typedef char            CHAR8;\r
154       typedef char            INT8;\r
155     #endif\r
156   #endif\r
157 \r
158   #define UINT8_MAX 0xff\r
159 \r
160 #else\r
161   //\r
162   // Use ANSI C 2000 stdint.h integer width declarations\r
163   //\r
164   #include <stdint.h>\r
165   typedef uint8_t   BOOLEAN;\r
166   typedef int8_t    INT8;\r
167   typedef uint8_t   UINT8;\r
168   typedef int16_t   INT16;\r
169   typedef uint16_t  UINT16;\r
170   typedef int32_t   INT32;\r
171   typedef uint32_t  UINT32;\r
172   typedef int64_t   INT64;\r
173   typedef uint64_t  UINT64;\r
174   typedef char      CHAR8;\r
175   typedef uint16_t  CHAR16;\r
176 \r
177 #endif\r
178 \r
179 typedef UINT64  UINTN;\r
180 typedef INT64   INTN;\r
181 \r
182 \r
183 //\r
184 // Processor specific defines\r
185 //\r
186 #define MAX_BIT     0x8000000000000000ULL\r
187 #define MAX_2_BITS  0xC000000000000000ULL\r
188 \r
189 //\r
190 // Maximum legal X64 address\r
191 //\r
192 #define MAX_ADDRESS   0xFFFFFFFFFFFFFFFFULL\r
193 \r
194 //\r
195 // The stack alignment required for X64\r
196 //\r
197 #define CPU_STACK_ALIGNMENT   16\r
198 \r
199 //\r
200 // Modifier to ensure that all protocol member functions and EFI intrinsics\r
201 // use the correct C calling convention. All protocol member functions and\r
202 // EFI intrinsics are required to modify thier member functions with EFIAPI.\r
203 //\r
204 #if _MSC_EXTENSIONS \r
205   ///\r
206   /// Define the standard calling convention reguardless of optimization level.\r
207   /// __cdecl is Microsoft* specific C extension.\r
208   /// \r
209   #define EFIAPI __cdecl  \r
210 #elif __GNUC__\r
211   ///\r
212   /// Define the standard calling convention reguardless of optimization level.\r
213   /// The GCC support assumes a GCC compiler that supports the EFI ABI. The EFI\r
214   /// ABI is much closer to the x64 Microsoft* ABI than standard x64 (x86-64) \r
215   /// GCC ABI. Thus a standard x64 (x86-64) GCC compiler can not be used for \r
216   /// x64. Warning the assembly code in the MDE x64 does not follow the correct \r
217   /// ABI for the standard x64 (x86-64) GCC.\r
218   ///\r
219   #define EFIAPI \r
220 #else\r
221   ///\r
222   /// The default for a non Microsoft* or GCC compiler is to assume the EFI ABI\r
223   /// is the standard. \r
224   ///\r
225   #define EFIAPI       \r
226 #endif\r
227 \r
228 //\r
229 // The Microsoft* C compiler can removed references to unreferenced data items\r
230 //  if the /OPT:REF linker option is used. We defined a macro as this is a \r
231 //  a non standard extension\r
232 //\r
233 #if _MSC_EXTENSIONS\r
234   #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)\r
235 #else\r
236   #define GLOBAL_REMOVE_IF_UNREFERENCED\r
237 #endif\r
238 \r
239 //\r
240 // For symbol name in GNU assembly code, an extra "_" is necessary\r
241 //\r
242 #if __GNUC__\r
243   #define ASM_PFX(name) _##name    \r
244 #endif\r
245 \r
246 #define FUNCTION_ENTRY_POINT(p) (p)\r
247 \r
248 #endif\r
249 \r