Home | History | Annotate | Download | only in X64
      1 /*++
      2 
      3 Copyright (c) 2005 - 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 x64.
     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 #define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
     32 
     33 
     34 
     35 //
     36 // Make sure we are useing the correct packing rules per EFI specification
     37 //
     38 #ifndef __GNUC__
     39 #pragma pack()
     40 #endif
     41 
     42 #if __INTEL_COMPILER
     43 //
     44 // Disable ICC's warning: trailing comma is nonstandard
     45 //
     46 //#pragma warning ( disable : 271 )
     47 
     48 //
     49 // Disable ICC's warning: extra ";" ignored
     50 //
     51 #pragma warning ( disable : 424 )
     52 
     53 //
     54 // Disable ICC's warning: : variable "foo" was set but never used
     55 //
     56 #pragma warning ( disable : 593 )
     57 
     58 //
     59 // Disable ICC's remark #1418: external function definition with no prior declaration.
     60 // This is legal ANSI C code so we disable the remark that is turned on with /W4
     61 //
     62 #pragma warning ( disable : 1418 )
     63 
     64 
     65 //
     66 // Disable ICC's remark #1419: external declaration in primary source file
     67 // This is legal ANSI C code so we disable the remark that is turned on with /W4
     68 //
     69 #pragma warning ( disable : 1419 )
     70 
     71 //
     72 // Disable ICC's remark #869: "Parameter" was never referenced warning.
     73 // This is legal ANSI C code so we disable the remark that is turned on with -Wall
     74 //
     75 #pragma warning ( disable : 869 )
     76 
     77 #endif
     78 
     79 
     80 #if _MSC_EXTENSIONS
     81 
     82 //
     83 // Disable warning that make it impossible to compile at /W4
     84 // This only works for Microsoft* tools
     85 //
     86 
     87 //
     88 // Disabling bitfield type checking warnings.
     89 //
     90 #pragma warning ( disable : 4214 )
     91 
     92 //
     93 // Disabling the unreferenced formal parameter warnings.
     94 //
     95 #pragma warning ( disable : 4100 )
     96 
     97 //
     98 // Disable slightly different base types warning as CHAR8 * can not be set
     99 // to a constant string.
    100 //
    101 #pragma warning ( disable : 4057 )
    102 
    103 //
    104 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
    105 //
    106 #pragma warning ( disable : 4127 )
    107 
    108 //
    109 // Int64ShllMod32 unreferenced inline function
    110 //
    111 #pragma warning ( disable : 4514 )
    112 
    113 //
    114 // Unreferenced formal parameter - We are object oriented, so we pass This even
    115 //  if we  don't need them.
    116 //
    117 #pragma warning ( disable : 4100 )
    118 
    119 //
    120 // This warning is caused by empty (after preprocessing) souce file.
    121 //
    122 #pragma warning ( disable : 4206 )
    123 
    124 //
    125 // Warning: The result of the unary '&' operator may be unaligned. Ignore it.
    126 //
    127 #pragma warning ( disable : 4366 )
    128 
    129 #endif
    130 
    131 #if defined(_MSC_EXTENSIONS)
    132   //
    133   // use Microsoft C complier dependent integer width types
    134   //
    135   typedef unsigned __int64    uint64_t;
    136   typedef __int64             int64_t;
    137   typedef unsigned __int32    uint32_t;
    138   typedef __int32             int32_t;
    139   typedef unsigned short      uint16_t;
    140   typedef short               int16_t;
    141   typedef unsigned char       uint8_t;
    142   typedef signed char         int8_t;
    143 #else
    144   typedef unsigned long long  uint64_t;
    145   typedef long long           int64_t;
    146   typedef unsigned int        uint32_t;
    147   typedef int                 int32_t;
    148   typedef unsigned short      uint16_t;
    149   typedef short               int16_t;
    150   typedef unsigned char       uint8_t;
    151   typedef signed char         int8_t;
    152 #endif
    153 
    154 //
    155 // Native integer size in stdint.h
    156 //
    157 typedef uint64_t  uintn_t;
    158 typedef int64_t   intn_t;
    159 
    160 //
    161 // Processor specific defines
    162 //
    163 #define EFI_MAX_BIT       0x8000000000000000ULL
    164 #define MAX_2_BITS        0xC000000000000000ULL
    165 
    166 //
    167 // Maximum legal IA-32 address
    168 //
    169 #define EFI_MAX_ADDRESS   0xFFFFFFFFFFFFFFFFULL
    170 
    171 //
    172 //  Bad pointer value to use in check builds.
    173 //  if you see this value you are using uninitialized or free'ed data
    174 //
    175 #define EFI_BAD_POINTER          0xAFAFAFAFAFAFAFAFULL
    176 #define EFI_BAD_POINTER_AS_BYTE  0xAF
    177 
    178 //
    179 // Inject a break point in the code to assist debugging.
    180 //
    181 #define EFI_DEADLOOP()    { volatile int __iii; __iii = 1; while (__iii); }
    182 #if _MSC_EXTENSIONS
    183   #define EFI_BREAKPOINT()  __debugbreak()
    184 #elif __GNUC__
    185   #define EFI_BREAKPOINT() asm("   int $3");
    186 #endif
    187 
    188 //
    189 // Memory Fence forces serialization, and is needed to support out of order
    190 //  memory transactions. The Memory Fence is mainly used to make sure IO
    191 //  transactions complete in a deterministic sequence, and to syncronize locks
    192 //  an other MP code. Currently no memory fencing is required.
    193 //
    194 #define MEMORY_FENCE()
    195 
    196 //
    197 // Some compilers don't support the forward reference construct:
    198 //  typedef struct XXXXX. The forward reference is required for
    199 //  ANSI compatibility.
    200 //
    201 // The following macro provide a workaround for such cases.
    202 //
    203 
    204 
    205 #ifdef EFI_NO_INTERFACE_DECL
    206   #define EFI_FORWARD_DECLARATION(x)
    207 #else
    208   #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
    209 #endif
    210 
    211 
    212 //
    213 // Some C compilers optimize the calling conventions to increase performance.
    214 // _EFIAPI is used to make all public APIs follow the standard C calling
    215 // convention.
    216 //
    217 #if _MSC_EXTENSIONS
    218   //
    219   // Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C.
    220   //
    221 
    222   #define _EFIAPI __cdecl
    223 #else
    224   #define _EFIAPI
    225 #endif
    226 
    227 
    228 #ifdef _EFI_WINNT
    229 
    230   #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
    231            warning ( disable : 4142 )
    232 
    233   #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
    234            warning ( default : 4142 )
    235 #else
    236 
    237   #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
    238            warning ( disable : 4068 )
    239 
    240   #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
    241            warning ( default : 4068 )
    242 
    243 #endif
    244 
    245 //
    246 // For symbol name in GNU assembly code, an extra "_" is necessary
    247 //
    248 #if defined(__GNUC__)
    249   ///
    250   /// Private worker functions for ASM_PFX()
    251   ///
    252   #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
    253   #define __CONCATENATE(a, b) a ## b
    254 
    255   ///
    256   /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
    257   /// on symbols in assembly language.
    258   ///
    259   #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
    260 
    261 #endif
    262 
    263 #endif
    264 
    265