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