Change the PM Timer RegisterBitWidth according to the Flags
[mirror_edk2.git] / MdePkg / Include / Ia32 / ProcessorBind.h
CommitLineData
959ccb23 1/** @file\r
1a2f870c 2 Processor or Compiler specific defines and types for IA-32 architecture.\r
959ccb23 3\r
8fe69f13 4 Copyright (c) 2006 - 2010, Intel Corporation<BR> \r
959ccb23 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
959ccb23 13**/\r
14\r
15#ifndef __PROCESSOR_BIND_H__\r
16#define __PROCESSOR_BIND_H__\r
17\r
3566565a 18///\r
19/// Define the processor type so other code can make processor based choices\r
20///\r
959ccb23 21#define MDE_CPU_IA32\r
22\r
23//\r
3963c4bf 24// Make sure we are using the correct packing rules per EFI specification\r
959ccb23 25//\r
5cfbd055 26#if !defined(__GNUC__)\r
959ccb23 27#pragma pack()\r
28#endif\r
29\r
5cfbd055 30#if defined(__INTEL_COMPILER)\r
ed300ce2 31//\r
32// Disable ICC's remark #869: "Parameter" was never referenced warning.\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 : 869 )\r
36\r
b483e395
A
37//\r
38// Disable ICC's remark #1418: external function definition with no prior declaration.\r
39// This is legal ANSI C code so we disable the remark that is turned on with /W4\r
40//\r
41#pragma warning ( disable : 1418 )\r
42\r
b483e395
A
43//\r
44// Disable ICC's remark #1419: external declaration in primary source file\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 : 1419 )\r
48\r
8fe69f13 49//\r
50// Disable ICC's remark #593: "Variable" was set but never used.\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 : 593 )\r
54\r
b483e395
A
55#endif\r
56\r
57\r
5cfbd055 58#if defined(_MSC_EXTENSIONS)\r
959ccb23 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
3963c4bf 92// This warning is caused by empty (after preprocessing) source file. For precompiled header only.\r
959ccb23 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
5cfbd055 104 #if defined(_MSC_EXTENSIONS)\r
9510db65 105\r
959ccb23 106 //\r
f4ec40ab 107 // use Microsoft C complier dependent integer width types \r
959ccb23 108 //\r
f4ec40ab 109\r
110 ///\r
111 /// 8-byte unsigned value\r
112 ///\r
959ccb23 113 typedef unsigned __int64 UINT64;\r
f4ec40ab 114 ///\r
115 /// 8-byte signed value\r
116 ///\r
959ccb23 117 typedef __int64 INT64;\r
f4ec40ab 118 ///\r
119 /// 4-byte unsigned value\r
120 ///\r
959ccb23 121 typedef unsigned __int32 UINT32;\r
f4ec40ab 122 ///\r
123 /// 4-byte signed value\r
124 ///\r
959ccb23 125 typedef __int32 INT32;\r
f4ec40ab 126 ///\r
127 /// 2-byte unsigned value\r
128 ///\r
959ccb23 129 typedef unsigned short UINT16;\r
f4ec40ab 130 ///\r
131 /// 2-byte Character. Unless otherwise specified all strings are stored in the\r
132 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.\r
133 ///\r
959ccb23 134 typedef unsigned short CHAR16;\r
f4ec40ab 135 ///\r
136 /// 2-byte signed value\r
137 ///\r
959ccb23 138 typedef short INT16;\r
f4ec40ab 139 ///\r
140 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other\r
141 /// values are undefined.\r
142 ///\r
959ccb23 143 typedef unsigned char BOOLEAN;\r
f4ec40ab 144 ///\r
145 /// 1-byte unsigned value\r
146 ///\r
959ccb23 147 typedef unsigned char UINT8;\r
f4ec40ab 148 ///\r
149 /// 1-byte Character\r
150 ///\r
959ccb23 151 typedef char CHAR8;\r
f4ec40ab 152 ///\r
153 /// 1-byte signed value\r
154 ///\r
959ccb23 155 typedef char INT8;\r
156 #else\r
157\r
158 //\r
159 // Assume standard IA-32 alignment. \r
160 // Need to check portability of long long\r
161 //\r
f4ec40ab 162\r
163 ///\r
164 /// 8-byte unsigned value\r
165 ///\r
959ccb23 166 typedef unsigned long long UINT64;\r
f4ec40ab 167 ///\r
168 /// 8-byte signed value\r
169 ///\r
959ccb23 170 typedef long long INT64;\r
f4ec40ab 171 ///\r
172 /// 4-byte unsigned value\r
173 ///\r
959ccb23 174 typedef unsigned int UINT32;\r
f4ec40ab 175 ///\r
176 /// 4-byte signed value\r
177 ///\r
959ccb23 178 typedef int INT32;\r
f4ec40ab 179 ///\r
180 /// 2-byte unsigned value\r
181 ///\r
959ccb23 182 typedef unsigned short UINT16;\r
f4ec40ab 183 ///\r
184 /// 2-byte Character. Unless otherwise specified all strings are stored in the\r
185 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.\r
186 ///\r
959ccb23 187 typedef unsigned short CHAR16;\r
f4ec40ab 188 ///\r
189 /// 2-byte signed value\r
190 ///\r
959ccb23 191 typedef short INT16;\r
f4ec40ab 192 ///\r
193 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other\r
194 /// values are undefined.\r
195 ///\r
959ccb23 196 typedef unsigned char BOOLEAN;\r
f4ec40ab 197 ///\r
198 /// 1-byte unsigned value\r
199 ///\r
959ccb23 200 typedef unsigned char UINT8;\r
f4ec40ab 201 ///\r
202 /// 1-byte Character\r
203 ///\r
959ccb23 204 typedef char CHAR8;\r
f4ec40ab 205 ///\r
206 /// 1-byte signed value\r
207 ///\r
959ccb23 208 typedef char INT8;\r
209 #endif\r
959ccb23 210#else\r
211 //\r
212 // Use ANSI C 2000 stdint.h integer width declarations\r
213 //\r
f4ec40ab 214 #include <stdint.h>\r
215\r
216 ///\r
217 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other\r
218 /// values are undefined.\r
219 ///\r
959ccb23 220 typedef uint8_t BOOLEAN;\r
f4ec40ab 221 ///\r
222 /// 1-byte signed value\r
223 ///\r
959ccb23 224 typedef int8_t INT8;\r
f4ec40ab 225 ///\r
226 /// 1-byte unsigned value\r
227 ///\r
959ccb23 228 typedef uint8_t UINT8;\r
f4ec40ab 229 ///\r
230 /// 2-byte signed value\r
231 ///\r
959ccb23 232 typedef int16_t INT16;\r
f4ec40ab 233 ///\r
234 /// 2-byte unsigned value\r
235 ///\r
959ccb23 236 typedef uint16_t UINT16;\r
f4ec40ab 237 ///\r
238 /// 4-byte signed value\r
239 ///\r
959ccb23 240 typedef int32_t INT32;\r
f4ec40ab 241 ///\r
242 /// 4-byte unsigned value\r
243 ///\r
959ccb23 244 typedef uint32_t UINT32;\r
f4ec40ab 245 ///\r
246 /// 8-byte signed value\r
247 ///\r
959ccb23 248 typedef int64_t INT64;\r
f4ec40ab 249 ///\r
250 /// 8-byte unsigned value\r
251 ///\r
959ccb23 252 typedef uint64_t UINT64;\r
f4ec40ab 253 ///\r
254 /// 1-byte Character\r
255 ///\r
959ccb23 256 typedef char CHAR8;\r
f4ec40ab 257 ///\r
258 /// 2-byte Character. Unless otherwise specified all strings are stored in the\r
259 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.\r
260 ///\r
959ccb23 261 typedef uint16_t CHAR16;\r
262\r
263#endif\r
264\r
f4ec40ab 265///\r
266/// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions,\r
267/// 8 bytes on supported 64-bit processor instructions)\r
268///\r
959ccb23 269typedef UINT32 UINTN;\r
f4ec40ab 270///\r
271/// Signed value of native width. (4 bytes on supported 32-bit processor instructions,\r
272/// 8 bytes on supported 64-bit processor instructions)\r
273///\r
959ccb23 274typedef INT32 INTN;\r
275\r
f4ec40ab 276//\r
277// Processor specific defines\r
278//\r
959ccb23 279\r
3566565a 280///\r
f4ec40ab 281/// A value of native width with the highest bit set.\r
3566565a 282///\r
959ccb23 283#define MAX_BIT 0x80000000\r
f4ec40ab 284///\r
285/// A value of native width with the two highest bits set.\r
286///\r
959ccb23 287#define MAX_2_BITS 0xC0000000\r
288\r
3566565a 289///\r
290/// Maximum legal IA-32 address\r
291///\r
959ccb23 292#define MAX_ADDRESS 0xFFFFFFFF\r
293\r
3566565a 294///\r
295/// The stack alignment required for IA-32\r
296///\r
959ccb23 297#define CPU_STACK_ALIGNMENT sizeof(UINTN)\r
298\r
299//\r
300// Modifier to ensure that all protocol member functions and EFI intrinsics\r
301// use the correct C calling convention. All protocol member functions and\r
3963c4bf 302// EFI intrinsics are required to modify their member functions with EFIAPI.\r
959ccb23 303//\r
6149e6bb 304#ifdef EFIAPI\r
305 ///\r
306 /// If EFIAPI is already defined, then we use that definition.\r
307 ///\r
308#elif defined(_MSC_EXTENSIONS)\r
3566565a 309 ///\r
f4ec40ab 310 /// Microsoft* compiler specific method for EFIAPI calling convension\r
3566565a 311 /// \r
959ccb23 312 #define EFIAPI __cdecl \r
86b2b825 313#else\r
5cfbd055 314 #if defined(__GNUC__)\r
f4ec40ab 315 ///\r
316 /// GCC specific method for EFIAPI calling convension\r
317 /// \r
86b2b825 318 #define EFIAPI __attribute__((cdecl)) \r
319 #endif \r
959ccb23 320#endif\r
321\r
5cfbd055 322#if defined(__GNUC__)\r
68167fed 323 ///\r
324 /// For GNU assembly code, .global or .globl can declare global symbols.\r
325 /// Define this macro to unify the usage.\r
326 ///\r
327 #define ASM_GLOBAL .globl\r
27af6b87 328#endif\r
329\r
14996c96
LG
330/**\r
331 Return the pointer to the first instruction of a function given a function pointer.\r
1a2f870c 332 On IA-32 CPU architectures, these two pointer values are the same, \r
14996c96
LG
333 so the implementation of this macro is very simple.\r
334 \r
3963c4bf 335 @param FunctionPointer A pointer to a function.\r
14996c96
LG
336\r
337 @return The pointer to the first instruction of a function given a function pointer.\r
3963c4bf 338 \r
14996c96 339**/\r
9a1d00cb 340#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)\r
24a7505c 341\r
959ccb23 342#endif\r
343\r