]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/Include/X64/ProcessorBind.h
5b2ad46637379cc1f31d4d31a756c25444efa9c9
[mirror_edk2.git] / BaseTools / Source / C / Include / X64 / ProcessorBind.h
1 /** @file
2 Processor or Compiler specific defines and types x64 (Intel(r) EM64T, AMD64).
3
4 Copyright (c) 2006 - 2008, Intel Corporation All rights reserved.
5
6 This program and the accompanying materials are licensed and made available
7 under the terms and conditions of the BSD License which accompanies this
8 distribution. The full text of the license may be found at:
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 File Name: ProcessorBind.h
15
16 **/
17
18 #ifndef __PROCESSOR_BIND_H__
19 #define __PROCESSOR_BIND_H__
20
21 //
22 // Define the processor type so other code can make processor based choices
23 //
24 #define MDE_CPU_X64
25
26
27 //
28 // Make sure we are useing the correct packing rules per EFI specification
29 //
30 #pragma pack()
31
32
33 #if _MSC_EXTENSIONS
34
35 //
36 // Disable warning that make it impossible to compile at /W4
37 // This only works for Microsoft* tools
38 //
39
40 //
41 // Disabling bitfield type checking warnings.
42 //
43 #pragma warning ( disable : 4214 )
44
45 //
46 // Disabling the unreferenced formal parameter warnings.
47 //
48 #pragma warning ( disable : 4100 )
49
50 //
51 // Disable slightly different base types warning as CHAR8 * can not be set
52 // to a constant string.
53 //
54 #pragma warning ( disable : 4057 )
55
56 //
57 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
58 //
59 #pragma warning ( disable : 4127 )
60
61
62 #endif
63
64
65 #if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L)
66 //
67 // No ANSI C 2000 stdint.h integer width declarations, so define equivalents
68 //
69
70 #if _MSC_EXTENSIONS
71
72
73 //
74 // use Microsoft C complier dependent interger width types
75 //
76 typedef unsigned __int64 UINT64;
77 typedef __int64 INT64;
78 typedef unsigned __int32 UINT32;
79 typedef __int32 INT32;
80 typedef unsigned short UINT16;
81 typedef unsigned short CHAR16;
82 typedef short INT16;
83 typedef unsigned char BOOLEAN;
84 typedef unsigned char UINT8;
85 typedef char CHAR8;
86 typedef char INT8;
87 #else
88 #ifdef _EFI_P64
89 //
90 // P64 - is Intel Itanium(TM) speak for pointers being 64-bit and longs and ints
91 // are 32-bits
92 //
93 typedef unsigned long long UINT64;
94 typedef long long INT64;
95 typedef unsigned int UINT32;
96 typedef int INT32;
97 typedef unsigned short CHAR16;
98 typedef unsigned short UINT16;
99 typedef short INT16;
100 typedef unsigned char BOOLEAN;
101 typedef unsigned char UINT8;
102 typedef char CHAR8;
103 typedef char INT8;
104 #else
105 //
106 // Assume LP64 - longs and pointers are 64-bit. Ints are 32-bit.
107 //
108 typedef unsigned long UINT64;
109 typedef long INT64;
110 typedef unsigned int UINT32;
111 typedef int INT32;
112 typedef unsigned short UINT16;
113 typedef unsigned short CHAR16;
114 typedef short INT16;
115 typedef unsigned char BOOLEAN;
116 typedef unsigned char UINT8;
117 typedef char CHAR8;
118 typedef char INT8;
119 #endif
120 #endif
121
122 #define UINT8_MAX 0xff
123
124 #else
125 //
126 // Use ANSI C 2000 stdint.h integer width declarations
127 //
128 #include <stdint.h>
129 typedef uint8_t BOOLEAN;
130 typedef int8_t INT8;
131 typedef uint8_t UINT8;
132 typedef int16_t INT16;
133 typedef uint16_t UINT16;
134 typedef int32_t INT32;
135 typedef uint32_t UINT32;
136 typedef int64_t INT64;
137 typedef uint64_t UINT64;
138 typedef char CHAR8;
139 typedef uint16_t CHAR16;
140
141 #endif
142
143 typedef UINT64 UINTN;
144 typedef INT64 INTN;
145
146
147 //
148 // Processor specific defines
149 //
150 #define MAX_BIT 0x8000000000000000
151 #define MAX_2_BITS 0xC000000000000000
152
153 //
154 // Maximum legal Itanium-based address
155 //
156 #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF
157
158 //
159 // Modifier to ensure that all protocol member functions and EFI intrinsics
160 // use the correct C calling convention. All protocol member functions and
161 // EFI intrinsics are required to modify thier member functions with EFIAPI.
162 //
163 #if _MSC_EXTENSIONS
164 ///
165 /// Define the standard calling convention reguardless of optimization level.
166 /// __cdecl is Microsoft* specific C extension.
167 ///
168 #define EFIAPI __cdecl
169 #elif __GNUC__
170 ///
171 /// Define the standard calling convention reguardless of optimization level.
172 /// efidecl is an extension to GCC that supports the differnece between x64
173 /// GCC ABI and x64 Microsoft* ABI. EFI is closer to the Microsoft* ABI and
174 /// EFIAPI makes sure the right ABI is used for public interfaces.
175 /// eficecl is a work in progress and we do not yet have the compiler
176 ///
177 #define EFIAPI
178 #else
179 #define EFIAPI
180 #endif
181
182 //
183 // The Microsoft* C compiler can removed references to unreferenced data items
184 // if the /OPT:REF linker option is used. We defined a macro as this is a
185 // a non standard extension
186 //
187 #if _MSC_EXTENSIONS
188 #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
189 #else
190 #define GLOBAL_REMOVE_IF_UNREFERENCED
191 #endif
192
193 #endif
194