1 /** @file 2 Processor or Compiler specific defines and types x64 (Intel 64, AMD64). 3 4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> 5 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_X64 22 23 // 24 // Make sure we are using the correct packing rules per EFI specification 25 // 26 #if !defined(__GNUC__) 27 #pragma pack() 28 #endif 29 30 #if defined(__GNUC__) && defined(__pic__) && !defined(USING_LTO) 31 // 32 // Mark all symbol declarations and references as hidden, meaning they will 33 // not be subject to symbol preemption. This allows the compiler to refer to 34 // symbols directly using relative references rather than via the GOT, which 35 // contains absolute symbol addresses that are subject to runtime relocation. 36 // 37 // The LTO linker will not emit GOT based relocations when all symbol 38 // references can be resolved locally, and so there is no need to set the 39 // pragma in that case (and doing so will cause other issues). 40 // 41 #pragma GCC visibility push (hidden) 42 #endif 43 44 #if defined(__INTEL_COMPILER) 45 // 46 // Disable ICC's remark #869: "Parameter" was never referenced warning. 47 // This is legal ANSI C code so we disable the remark that is turned on with -Wall 48 // 49 #pragma warning ( disable : 869 ) 50 51 // 52 // Disable ICC's remark #1418: external function definition with no prior declaration. 53 // This is legal ANSI C code so we disable the remark that is turned on with /W4 54 // 55 #pragma warning ( disable : 1418 ) 56 57 // 58 // Disable ICC's remark #1419: external declaration in primary source file 59 // This is legal ANSI C code so we disable the remark that is turned on with /W4 60 // 61 #pragma warning ( disable : 1419 ) 62 63 // 64 // Disable ICC's remark #593: "Variable" was set but never used. 65 // This is legal ANSI C code so we disable the remark that is turned on with /W4 66 // 67 #pragma warning ( disable : 593 ) 68 69 #endif 70 71 72 #if defined(_MSC_EXTENSIONS) 73 74 // 75 // Disable warning that make it impossible to compile at /W4 76 // This only works for Microsoft* tools 77 // 78 79 // 80 // Disabling bitfield type checking warnings. 81 // 82 #pragma warning ( disable : 4214 ) 83 84 // 85 // Disabling the unreferenced formal parameter warnings. 86 // 87 #pragma warning ( disable : 4100 ) 88 89 // 90 // Disable slightly different base types warning as CHAR8 * can not be set 91 // to a constant string. 92 // 93 #pragma warning ( disable : 4057 ) 94 95 // 96 // ASSERT(FALSE) or while (TRUE) are legal constructs so suppress this warning 97 // 98 #pragma warning ( disable : 4127 ) 99 100 // 101 // This warning is caused by functions defined but not used. For precompiled header only. 102 // 103 #pragma warning ( disable : 4505 ) 104 105 // 106 // This warning is caused by empty (after preprocessing) source file. For precompiled header only. 107 // 108 #pragma warning ( disable : 4206 ) 109 110 #if _MSC_VER == 1800 || _MSC_VER == 1900 111 112 // 113 // Disable these warnings for VS2013. 114 // 115 116 // 117 // This warning is for potentially uninitialized local variable, and it may cause false 118 // positive issues in VS2013 and VS2015 build 119 // 120 #pragma warning ( disable : 4701 ) 121 122 // 123 // This warning is for potentially uninitialized local pointer variable, and it may cause 124 // false positive issues in VS2013 and VS2015 build 125 // 126 #pragma warning ( disable : 4703 ) 127 128 #endif 129 130 #endif 131 132 133 #if defined(_MSC_EXTENSIONS) 134 // 135 // use Microsoft C compiler dependent integer width types 136 // 137 138 /// 139 /// 8-byte unsigned value 140 /// 141 typedef unsigned __int64 UINT64; 142 /// 143 /// 8-byte signed value 144 /// 145 typedef __int64 INT64; 146 /// 147 /// 4-byte unsigned value 148 /// 149 typedef unsigned __int32 UINT32; 150 /// 151 /// 4-byte signed value 152 /// 153 typedef __int32 INT32; 154 /// 155 /// 2-byte unsigned value 156 /// 157 typedef unsigned short UINT16; 158 /// 159 /// 2-byte Character. Unless otherwise specified all strings are stored in the 160 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards. 161 /// 162 typedef unsigned short CHAR16; 163 /// 164 /// 2-byte signed value 165 /// 166 typedef short INT16; 167 /// 168 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other 169 /// values are undefined. 170 /// 171 typedef unsigned char BOOLEAN; 172 /// 173 /// 1-byte unsigned value 174 /// 175 typedef unsigned char UINT8; 176 /// 177 /// 1-byte Character 178 /// 179 typedef char CHAR8; 180 /// 181 /// 1-byte signed value 182 /// 183 typedef signed char INT8; 184 #else 185 /// 186 /// 8-byte unsigned value 187 /// 188 typedef unsigned long long UINT64; 189 /// 190 /// 8-byte signed value 191 /// 192 typedef long long INT64; 193 /// 194 /// 4-byte unsigned value 195 /// 196 typedef unsigned int UINT32; 197 /// 198 /// 4-byte signed value 199 /// 200 typedef int INT32; 201 /// 202 /// 2-byte unsigned value 203 /// 204 typedef unsigned short UINT16; 205 /// 206 /// 2-byte Character. Unless otherwise specified all strings are stored in the 207 /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards. 208 /// 209 typedef unsigned short CHAR16; 210 /// 211 /// 2-byte signed value 212 /// 213 typedef short INT16; 214 /// 215 /// Logical Boolean. 1-byte value containing 0 for FALSE or a 1 for TRUE. Other 216 /// values are undefined. 217 /// 218 typedef unsigned char BOOLEAN; 219 /// 220 /// 1-byte unsigned value 221 /// 222 typedef unsigned char UINT8; 223 /// 224 /// 1-byte Character 225 /// 226 typedef char CHAR8; 227 /// 228 /// 1-byte signed value 229 /// 230 typedef signed char INT8; 231 #endif 232 233 /// 234 /// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions, 235 /// 8 bytes on supported 64-bit processor instructions) 236 /// 237 typedef UINT64 UINTN; 238 /// 239 /// Signed value of native width. (4 bytes on supported 32-bit processor instructions, 240 /// 8 bytes on supported 64-bit processor instructions) 241 /// 242 typedef INT64 INTN; 243 244 245 // 246 // Processor specific defines 247 // 248 249 /// 250 /// A value of native width with the highest bit set. 251 /// 252 #define MAX_BIT 0x8000000000000000ULL 253 /// 254 /// A value of native width with the two highest bits set. 255 /// 256 #define MAX_2_BITS 0xC000000000000000ULL 257 258 /// 259 /// Maximum legal x64 address 260 /// 261 #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFFULL 262 263 /// 264 /// Maximum legal x64 INTN and UINTN values. 265 /// 266 #define MAX_INTN ((INTN)0x7FFFFFFFFFFFFFFFULL) 267 #define MAX_UINTN ((UINTN)0xFFFFFFFFFFFFFFFFULL) 268 269 /// 270 /// The stack alignment required for x64 271 /// 272 #define CPU_STACK_ALIGNMENT 16 273 274 // 275 // Modifier to ensure that all protocol member functions and EFI intrinsics 276 // use the correct C calling convention. All protocol member functions and 277 // EFI intrinsics are required to modify their member functions with EFIAPI. 278 // 279 #ifdef EFIAPI 280 /// 281 /// If EFIAPI is already defined, then we use that definition. 282 /// 283 #elif defined(_MSC_EXTENSIONS) 284 /// 285 /// Microsoft* compiler specific method for EFIAPI calling convention. 286 /// 287 #define EFIAPI __cdecl 288 #elif defined(__GNUC__) 289 /// 290 /// Define the standard calling convention regardless of optimization level. 291 /// The GCC support assumes a GCC compiler that supports the EFI ABI. The EFI 292 /// ABI is much closer to the x64 Microsoft* ABI than standard x64 (x86-64) 293 /// GCC ABI. Thus a standard x64 (x86-64) GCC compiler can not be used for 294 /// x64. Warning the assembly code in the MDE x64 does not follow the correct 295 /// ABI for the standard x64 (x86-64) GCC. 296 /// 297 #define EFIAPI 298 #else 299 /// 300 /// The default for a non Microsoft* or GCC compiler is to assume the EFI ABI 301 /// is the standard. 302 /// 303 #define EFIAPI 304 #endif 305 306 #if defined(__GNUC__) 307 /// 308 /// For GNU assembly code, .global or .globl can declare global symbols. 309 /// Define this macro to unify the usage. 310 /// 311 #define ASM_GLOBAL .globl 312 #endif 313 314 /** 315 Return the pointer to the first instruction of a function given a function pointer. 316 On x64 CPU architectures, these two pointer values are the same, 317 so the implementation of this macro is very simple. 318 319 @param FunctionPointer A pointer to a function. 320 321 @return The pointer to the first instruction of a function given a function pointer. 322 323 **/ 324 #define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer) 325 326 #ifndef __USER_LABEL_PREFIX__ 327 #define __USER_LABEL_PREFIX__ 328 #endif 329 330 #endif 331 332