1 /** @file 2 Processor or Compiler specific defines and types x64 (Intel(r) EM64T, AMD64). 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_X64 22 23 24 // 25 // Make sure we are useing the correct packing rules per EFI specification 26 // 27 #ifndef __GNUC__ 28 #pragma pack() 29 #endif 30 31 32 #if __INTEL_COMPILER 33 // 34 // Disable ICC's remark #869: "Parameter" was never referenced warning. 35 // This is legal ANSI C code so we disable the remark that is turned on with -Wall 36 // 37 #pragma warning ( disable : 869 ) 38 39 // 40 // Disable ICC's remark #1418: external function definition with no prior declaration. 41 // This is legal ANSI C code so we disable the remark that is turned on with /W4 42 // 43 #pragma warning ( disable : 1418 ) 44 45 // 46 // Disable ICC's remark #1419: external declaration in primary source file 47 // This is legal ANSI C code so we disable the remark that is turned on with /W4 48 // 49 #pragma warning ( disable : 1419 ) 50 51 #endif 52 53 54 #if _MSC_EXTENSIONS 55 56 // 57 // Disable warning that make it impossible to compile at /W4 58 // This only works for Microsoft* tools 59 // 60 61 // 62 // Disabling bitfield type checking warnings. 63 // 64 #pragma warning ( disable : 4214 ) 65 66 // 67 // Disabling the unreferenced formal parameter warnings. 68 // 69 #pragma warning ( disable : 4100 ) 70 71 // 72 // Disable slightly different base types warning as CHAR8 * can not be set 73 // to a constant string. 74 // 75 #pragma warning ( disable : 4057 ) 76 77 // 78 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning 79 // 80 #pragma warning ( disable : 4127 ) 81 82 // 83 // This warning is caused by functions defined but not used. For precompiled header only. 84 // 85 #pragma warning ( disable : 4505 ) 86 87 // 88 // This warning is caused by empty (after preprocessing) souce file. For precompiled header only. 89 // 90 #pragma warning ( disable : 4206 ) 91 92 #endif 93 94 95 #if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L) 96 // 97 // No ANSI C 2000 stdint.h integer width declarations, so define equivalents 98 // 99 100 #if _MSC_EXTENSIONS 101 102 103 // 104 // use Microsoft C complier dependent interger width types 105 // 106 typedef unsigned __int64 UINT64; 107 typedef __int64 INT64; 108 typedef unsigned __int32 UINT32; 109 typedef __int32 INT32; 110 typedef unsigned short UINT16; 111 typedef unsigned short CHAR16; 112 typedef short INT16; 113 typedef unsigned char BOOLEAN; 114 typedef unsigned char UINT8; 115 typedef char CHAR8; 116 typedef char INT8; 117 #else 118 #ifdef _EFI_P64 119 // 120 // P64 - is Intel Itanium(TM) speak for pointers being 64-bit and longs and ints 121 // are 32-bits 122 // 123 typedef unsigned long long UINT64; 124 typedef long long INT64; 125 typedef unsigned int UINT32; 126 typedef int INT32; 127 typedef unsigned short CHAR16; 128 typedef unsigned short UINT16; 129 typedef short INT16; 130 typedef unsigned char BOOLEAN; 131 typedef unsigned char UINT8; 132 typedef char CHAR8; 133 typedef char INT8; 134 #else 135 // 136 // Assume LP64 - longs and pointers are 64-bit. Ints are 32-bit. 137 // 138 typedef unsigned long UINT64; 139 typedef long INT64; 140 typedef unsigned int UINT32; 141 typedef int INT32; 142 typedef unsigned short UINT16; 143 typedef unsigned short CHAR16; 144 typedef short INT16; 145 typedef unsigned char BOOLEAN; 146 typedef unsigned char UINT8; 147 typedef char CHAR8; 148 typedef char INT8; 149 #endif 150 #endif 151 152 #define UINT8_MAX 0xff 153 154 #else 155 // 156 // Use ANSI C 2000 stdint.h integer width declarations 157 // 158 #include <stdint.h> 159 typedef uint8_t BOOLEAN; 160 typedef int8_t INT8; 161 typedef uint8_t UINT8; 162 typedef int16_t INT16; 163 typedef uint16_t UINT16; 164 typedef int32_t INT32; 165 typedef uint32_t UINT32; 166 typedef int64_t INT64; 167 typedef uint64_t UINT64; 168 typedef char CHAR8; 169 typedef uint16_t CHAR16; 170 171 #endif 172 173 typedef UINT64 UINTN; 174 typedef INT64 INTN; 175 176 177 // 178 // Processor specific defines 179 // 180 #define MAX_BIT 0x8000000000000000ULL 181 #define MAX_2_BITS 0xC000000000000000ULL 182 183 // 184 // Maximum legal X64 address 185 // 186 #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFFULL 187 188 // 189 // The stack alignment required for X64 190 // 191 #define CPU_STACK_ALIGNMENT 16 192 193 // 194 // Modifier to ensure that all protocol member functions and EFI intrinsics 195 // use the correct C calling convention. All protocol member functions and 196 // EFI intrinsics are required to modify thier member functions with EFIAPI. 197 // 198 #if _MSC_EXTENSIONS 199 /// 200 /// Define the standard calling convention reguardless of optimization level. 201 /// __cdecl is Microsoft* specific C extension. 202 /// 203 #define EFIAPI __cdecl 204 #elif __GNUC__ 205 /// 206 /// Define the standard calling convention reguardless of optimization level. 207 /// The GCC support assumes a GCC compiler that supports the EFI ABI. The EFI 208 /// ABI is much closer to the x64 Microsoft* ABI than standard x64 (x86-64) 209 /// GCC ABI. Thus a standard x64 (x86-64) GCC compiler can not be used for 210 /// x64. Warning the assembly code in the MDE x64 does not follow the correct 211 /// ABI for the standard x64 (x86-64) GCC. 212 /// 213 #define EFIAPI __attribute__((ms_abi)) 214 #else 215 /// 216 /// The default for a non Microsoft* or GCC compiler is to assume the EFI ABI 217 /// is the standard. 218 /// 219 #define EFIAPI 220 #endif 221 222 // 223 // The Microsoft* C compiler can removed references to unreferenced data items 224 // if the /OPT:REF linker option is used. We defined a macro as this is a 225 // a non standard extension 226 // 227 #if _MSC_EXTENSIONS 228 #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany) 229 #else 230 #define GLOBAL_REMOVE_IF_UNREFERENCED 231 #endif 232 233 // 234 // For symbol name in GNU assembly code, an extra "_" is necessary 235 // 236 #if __GNUC__ 237 #if defined(linux) 238 #define ASM_PFX(name) name 239 #else 240 #define ASM_PFX(name) _##name 241 #endif 242 #endif 243 244 #define FUNCTION_ENTRY_POINT(p) (p) 245 246 #endif 247 248