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