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