1 /*++ 2 3 Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 EfiBind.h 15 16 Abstract: 17 18 Processor or Compiler specific defines and types for Intel Itanium(TM). 19 We are using the ANSI C 2000 _t type definitions for basic types. 20 This it technically a violation of the coding standard, but they 21 are used to make EfiTypes.h portable. Code other than EfiTypes.h 22 should never use any ANSI C 2000 _t integer types. 23 24 --*/ 25 26 #ifndef _EFI_BIND_H_ 27 #define _EFI_BIND_H_ 28 29 30 #define EFI_DRIVER_ENTRY_POINT(InitFunction) 31 32 #define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT 33 34 #define ECP_CPU_IPF 35 36 37 // 38 // Make sure we are useing the correct packing rules per EFI specification 39 // 40 #pragma pack() 41 42 43 #if _MSC_EXTENSIONS 44 45 #if __INTEL_COMPILER 46 47 // 48 // Disable the extra ";" warning; 49 // All places referencing EFI_GUID_STRING MACRO will generate this error. 50 // 51 #pragma warning ( disable : 424 ) 52 53 // 54 // error #593: variable "Status" was set but never used 55 // This error may be flagged if a function only do ASSERT on return status when 56 // EFI_DEBUG is not defined (EDK's ASSERT will be defined as empty statement). 57 // To make EdkCompatibilityPkg buildable by ICC with EFI_DEBUG undefined, disable 58 // this warning. 59 // 60 #pragma warning ( disable : 593 ) 61 62 // 63 // Disable ICC's remark #869: "Parameter" was never referenced warning. 64 // This is legal ANSI C code so we disable the remark that is turned on with -Wall 65 // 66 #pragma warning ( disable : 869 ) 67 68 // 69 // Disable ICC's remark #1418: external function definition with no prior declaration. 70 // This is legal ANSI C code so we disable the remark that is turned on with /W4 71 // 72 #pragma warning ( disable : 1418 ) 73 74 // 75 // Disable ICC's remark #1419: external declaration in primary source file 76 // This is legal ANSI C code so we disable the remark that is turned on with /W4 77 // 78 #pragma warning ( disable : 1419 ) 79 80 // 81 // Disable ICC's remark #869: "Parameter" was never referenced warning. 82 // This is legal ANSI C code so we disable the remark that is turned on with -Wall 83 // 84 #pragma warning ( disable : 869 ) 85 86 #endif 87 88 89 90 // 91 // Disable warning that make it impossible to compile at /W4 92 // This only works for Microsoft tools. Copied from the 93 // IA-32 version of efibind.h 94 // 95 96 // 97 // Disabling bitfield type checking warnings. 98 // 99 #pragma warning ( disable : 4214 ) 100 101 102 // Disabling the unreferenced formal parameter warnings. 103 // 104 #pragma warning ( disable : 4100 ) 105 106 // 107 // Disable slightly different base types warning as CHAR8 * can not be set 108 // to a constant string. 109 // 110 #pragma warning ( disable : 4057 ) 111 112 // 113 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning 114 // 115 #pragma warning ( disable : 4127 ) 116 117 // 118 // Can not cast a function pointer to a data pointer. We need to do this on 119 // IPF to get access to the PLABEL. 120 // 121 #pragma warning ( disable : 4514 ) 122 123 // 124 // Int64ShllMod32 unreferenced inline function 125 // 126 #pragma warning ( disable : 4054 ) 127 128 // 129 // Unreferenced formal parameter - We are object oriented, so we pass This even 130 // if we don't need them. 131 // 132 #pragma warning ( disable : 4100 ) 133 134 // 135 // This warning is caused by empty (after preprocessing) souce file. 136 // 137 #pragma warning ( disable : 4206 ) 138 139 // 140 // Warning: The result of the unary '&' operator may be unaligned. Ignore it. 141 // 142 #pragma warning ( disable : 4366 ) 143 144 #endif 145 146 147 #if (__STDC_VERSION__ < 199901L) 148 // 149 // No ANSI C 2000 stdint.h integer width declarations, so define equivalents 150 // 151 152 #if _MSC_EXTENSIONS 153 154 155 // 156 // use Microsoft C complier dependent integer width types 157 // 158 typedef unsigned __int64 uint64_t; 159 typedef __int64 int64_t; 160 typedef unsigned __int32 uint32_t; 161 typedef __int32 int32_t; 162 typedef unsigned short uint16_t; 163 typedef short int16_t; 164 typedef unsigned char uint8_t; 165 typedef signed char int8_t; 166 #else 167 #ifdef _EFI_P64 168 // 169 // P64 - is Intel Itanium(TM) speak for pointers being 64-bit and longs and ints 170 // are 32-bits 171 // 172 typedef unsigned long long uint64_t; 173 typedef long long int64_t; 174 typedef unsigned int uint32_t; 175 typedef int int32_t; 176 typedef unsigned short uint16_t; 177 typedef short int16_t; 178 typedef unsigned char uint8_t; 179 typedef signed char int8_t; 180 #else 181 // 182 // Assume LP64 - longs and pointers are 64-bit. Ints are 32-bit. 183 // 184 typedef unsigned long uint64_t; 185 typedef long int64_t; 186 typedef unsigned int uint32_t; 187 typedef int int32_t; 188 typedef unsigned short uint16_t; 189 typedef short int16_t; 190 typedef unsigned char uint8_t; 191 typedef signed char int8_t; 192 #endif 193 #endif 194 #else 195 // 196 // Use ANSI C 2000 stdint.h integer width declarations 197 // 198 #include "stdint.h" 199 #endif 200 201 // 202 // Native integer size in stdint.h 203 // 204 typedef uint64_t uintn_t; 205 typedef int64_t intn_t; 206 207 // 208 // Processor specific defines 209 // 210 #define EFI_MAX_BIT 0x8000000000000000 211 #define MAX_2_BITS 0xC000000000000000 212 213 // 214 // Maximum legal Itanium-based address 215 // 216 #define EFI_MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 217 218 // 219 // Bad pointer value to use in check builds. 220 // if you see this value you are using uninitialized or free'ed data 221 // 222 #define EFI_BAD_POINTER 0xAFAFAFAFAFAFAFAF 223 #define EFI_BAD_POINTER_AS_BYTE 0xAF 224 225 #define EFI_DEADLOOP() while(TRUE) 226 227 #ifdef __GNUC__ 228 #define EFI_BREAKPOINT EcpEfiBreakPoint 229 #define MEMORY_FENCE EcpMemoryFence 230 #else 231 // 232 // Inject a break point in the code to assist debugging. 233 // 234 #pragma intrinsic (__break) 235 #define EFI_BREAKPOINT() __break(0) 236 #define EFI_DEADLOOP() while(TRUE) 237 238 // 239 // Memory Fence forces serialization, and is needed to support out of order 240 // memory transactions. The Memory Fence is mainly used to make sure IO 241 // transactions complete in a deterministic sequence, and to syncronize locks 242 // an other MP code. Intel Itanium(TM) processors require explicit memory fence instructions 243 // after every IO. Need to find a way of doing that in the function _mf. 244 // 245 void __mfa (void); 246 #pragma intrinsic (__mfa) 247 #define MEMORY_FENCE() __mfa() 248 #endif 249 250 251 // 252 // Some compilers don't support the forward reference construct: 253 // typedef struct XXXXX. The forward reference is required for 254 // ANSI compatibility. 255 // 256 // The following macro provide a workaround for such cases. 257 // 258 259 260 #ifdef EFI_NO_INTERFACE_DECL 261 #define EFI_FORWARD_DECLARATION(x) 262 #else 263 #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 264 #endif 265 266 // 267 // Some C compilers optimize the calling conventions to increase performance. 268 // _EFIAPI is used to make all public APIs follow the standard C calling 269 // convention. 270 // 271 272 #if _MSC_EXTENSIONS 273 #define _EFIAPI __cdecl 274 #else 275 #define _EFIAPI 276 #endif 277 278 279 #ifdef _EFI_WINNT 280 281 #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING() \ 282 warning ( disable : 4142 ) 283 284 #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING() \ 285 warning ( default : 4142 ) 286 #else 287 288 #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING() \ 289 warning ( disable : 4068 ) 290 291 #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING() \ 292 warning ( default : 4068 ) 293 294 295 #endif 296 297 298 #endif 299 300