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