edk2/MdePkg/Include/Ia32/ProcessorBind.h:
[people/mcb30/edk2.git] / edk2 / MdePkg / Include / Ia32 / ProcessorBind.h
1 /** @file\r
2   Processor or Compiler specific defines and types for Ia32 architecture.\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_IA32\r
22 \r
23 //\r
24 // Make sure we are useing the correct packing rules per EFI specification\r
25 //\r
26 #ifndef __GNUC__\r
27 #pragma pack()\r
28 #endif\r
29 \r
30 #if __INTEL_COMPILER\r
31 //\r
32 // Disable ICC's remark #593: "LocalVariable" was set but never used\r
33 // This is legal ANSI C code so we disable the remark that is turned on with -Wall\r
34 //\r
35 #pragma warning ( disable : 593 )\r
36 \r
37 //\r
38 // Disable ICC's remark #869: "Parameter" was never referenced warning.\r
39 // This is legal ANSI C code so we disable the remark that is turned on with -Wall\r
40 //\r
41 #pragma warning ( disable : 869 )\r
42 \r
43 //\r
44 // Disable ICC's remark #1418: external function definition with no prior declaration.\r
45 // This is legal ANSI C code so we disable the remark that is turned on with /W4\r
46 //\r
47 #pragma warning ( disable : 1418 )\r
48 \r
49 //\r
50 // Disable ICC's remark #1419: external declaration in primary source file\r
51 // This is legal ANSI C code so we disable the remark that is turned on with /W4\r
52 //\r
53 #pragma warning ( disable : 1419 )\r
54 \r
55 #endif\r
56 \r
57 \r
58 #if _MSC_EXTENSIONS\r
59 \r
60 //\r
61 // Disable warning that make it impossible to compile at /W4\r
62 // This only works for Microsoft* tools\r
63 //\r
64 \r
65 //\r
66 // Disabling bitfield type checking warnings.\r
67 //\r
68 #pragma warning ( disable : 4214 )\r
69 \r
70 //\r
71 // Disabling the unreferenced formal parameter warnings.\r
72 //\r
73 #pragma warning ( disable : 4100 )\r
74 \r
75 //\r
76 // Disable slightly different base types warning as CHAR8 * can not be set\r
77 // to a constant string.\r
78 //\r
79 #pragma warning ( disable : 4057 )\r
80 \r
81 //\r
82 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning\r
83 //\r
84 #pragma warning ( disable : 4127 )\r
85 \r
86 //\r
87 // This warning is caused by functions defined but not used. For precompiled header only.\r
88 //\r
89 #pragma warning ( disable : 4505 )\r
90 \r
91 //\r
92 // This warning is caused by empty (after preprocessing) souce file. For precompiled header only.\r
93 //\r
94 #pragma warning ( disable : 4206 )\r
95 \r
96 #endif\r
97 \r
98 \r
99 #if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L)\r
100   //\r
101   // No ANSI C 2000 stdint.h integer width declarations, so define equivalents\r
102   //\r
103  \r
104   #if _MSC_EXTENSIONS \r
105     \r
106     //\r
107     // use Microsoft* C complier dependent interger width types \r
108     //\r
109     typedef unsigned __int64    UINT64;\r
110     typedef __int64             INT64;\r
111     typedef unsigned __int32    UINT32;\r
112     typedef __int32             INT32;\r
113     typedef unsigned short      UINT16;\r
114     typedef unsigned short      CHAR16;\r
115     typedef short               INT16;\r
116     typedef unsigned char       BOOLEAN;\r
117     typedef unsigned char       UINT8;\r
118     typedef char                CHAR8;\r
119     typedef char                INT8;\r
120   #else\r
121 \r
122     //\r
123     // Assume standard IA-32 alignment. \r
124     // Need to check portability of long long\r
125     //\r
126     typedef unsigned long long  UINT64;\r
127     typedef long long           INT64;\r
128     typedef unsigned int        UINT32;\r
129     typedef int                 INT32;\r
130     typedef unsigned short      UINT16;\r
131     typedef unsigned short      CHAR16;\r
132     typedef short               INT16;\r
133     typedef unsigned char       BOOLEAN;\r
134     typedef unsigned char       UINT8;\r
135     typedef char                CHAR8;\r
136     typedef char                INT8;\r
137   #endif\r
138 \r
139   #define UINT8_MAX 0xff\r
140 \r
141 #else\r
142   //\r
143   // Use ANSI C 2000 stdint.h integer width declarations\r
144   //\r
145   #include "stdint.h"\r
146   typedef uint8_t   BOOLEAN;\r
147   typedef int8_t    INT8;\r
148   typedef uint8_t   UINT8;\r
149   typedef int16_t   INT16;\r
150   typedef uint16_t  UINT16;\r
151   typedef int32_t   INT32;\r
152   typedef uint32_t  UINT32;\r
153   typedef int64_t   INT64;\r
154   typedef uint64_t  UINT64;\r
155   typedef char      CHAR8;\r
156   typedef uint16_t  CHAR16;\r
157 \r
158 #endif\r
159 \r
160 typedef UINT32  UINTN;\r
161 typedef INT32   INTN;\r
162 \r
163 \r
164 ///\r
165 /// Processor specific defines\r
166 ///\r
167 #define MAX_BIT     0x80000000\r
168 #define MAX_2_BITS  0xC0000000\r
169 \r
170 ///\r
171 /// Maximum legal IA-32 address\r
172 ///\r
173 #define MAX_ADDRESS   0xFFFFFFFF\r
174 \r
175 ///\r
176 /// The stack alignment required for IA-32\r
177 ///\r
178 #define CPU_STACK_ALIGNMENT   sizeof(UINTN)\r
179 \r
180 //\r
181 // Modifier to ensure that all protocol member functions and EFI intrinsics\r
182 // use the correct C calling convention. All protocol member functions and\r
183 // EFI intrinsics are required to modify thier member functions with EFIAPI.\r
184 //\r
185 #if _MSC_EXTENSIONS\r
186   ///\r
187   /// Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C.\r
188   /// \r
189   #define EFIAPI __cdecl  \r
190 #else\r
191   #if __GNUC__\r
192     #define EFIAPI __attribute__((cdecl))  \r
193   #endif  \r
194 #endif\r
195 \r
196 //\r
197 // The Microsoft* C compiler can removed references to unreferenced data items\r
198 //  if the /OPT:REF linker option is used. We defined a macro as this is a \r
199 //  a non standard extension\r
200 //\r
201 #if _MSC_EXTENSIONS\r
202   #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)\r
203 #else\r
204   #define GLOBAL_REMOVE_IF_UNREFERENCED\r
205 #endif\r
206 \r
207 //\r
208 // For symbol name in GNU assembly code, an extra "_" is necessary\r
209 //\r
210 #if __GNUC__\r
211   #if defined(linux)\r
212     #define ASM_PFX(name) name\r
213   #else\r
214     #define ASM_PFX(name) _##name\r
215   #endif \r
216 #endif\r
217 \r
218 #define FUNCTION_ENTRY_POINT(p) (p)\r
219 \r
220 #endif\r
221 \r