13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
364bb20fb9c05f1a7f8b731fae736069e1c2f0401lgaoCopyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
4f57387d54bd8f2c0261834b2ad16155f1db63291hhtianThis program and the accompanying materials
53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangare licensed and made available under the terms and conditions of the BSD License
63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangwhich accompanies this distribution.  The full text of the license may be found at
73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwanghttp://opensource.org/licenses/bsd-license.php
83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangModule Name:
133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  EfiBind.h
153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangAbstract:
173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Processor or Compiler specific defines and types for IA-32.
193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  We are using the ANSI C 2000 _t type definitions for basic types.
203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  This it technically a violation of the coding standard, but they
213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  are used to make EfiTypes.h portable. Code other than EfiTypes.h
223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  should never use any ANSI C 2000 _t integer types.
233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef _EFI_BIND_H_
273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define _EFI_BIND_H_
283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifdef EFI_DEBUG
303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifdef EFI_NT_EMULATOR
323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_DRIVER_ENTRY_POINT(InitFunction)                  \
343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          EFI_STATUS                                          \
353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          EFIAPI                                              \
363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          InitFunction (                                      \
373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            EFI_HANDLE        ImageHandle,                    \
383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            EFI_SYSTEM_TABLE  *SystemTable                    \
393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            );                                                \
403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang                                                              \
413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          UINTN                                               \
423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          __stdcall                                           \
433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          _DllMainCRTStartup (                                \
443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              UINTN    Inst,                                  \
453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              UINTN    reason_for_call,                       \
463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              VOID    *rserved                                \
473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              )                                               \
483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          {                                                   \
493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              return 1;                                       \
503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          }                                                   \
513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang                                                              \
52c7f33ca42470dc87bc41a8583f427883123d67a1qwang          EFI_STATUS                                          \
533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          __declspec( dllexport  )                            \
543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          __cdecl                                             \
553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          InitializeDriver (                                  \
56c7f33ca42470dc87bc41a8583f427883123d67a1qwang              EFI_HANDLE       ImageHandle,                   \
57c7f33ca42470dc87bc41a8583f427883123d67a1qwang              EFI_SYSTEM_TABLE *SystemTable                   \
583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              )                                               \
593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          {                                                   \
603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang              return InitFunction(ImageHandle, SystemTable);  \
613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          }
623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#else
663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_DRIVER_ENTRY_POINT(InitFunction)
683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#else
733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_DRIVER_ENTRY_POINT(InitFunction)
753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Make sure we are useing the correct packing rules per EFI specification
853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
86e8de46808a7d2426116de79cdf2aeab43d5a5537AJFISH#ifndef __GNUC__
873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma pack()
88e8de46808a7d2426116de79cdf2aeab43d5a5537AJFISH#endif
893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
90b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#if __INTEL_COMPILER
91b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
92b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// Disable ICC's warning: trailing comma is nonstandard
93b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
94b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//#pragma warning ( disable : 271 )
95b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
96b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
97b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// Disable ICC's warning: extra ";" ignored
98b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
99b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#pragma warning ( disable : 424 )
100b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
101b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
102b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// Disable ICC's warning: : variable "foo" was set but never used
103b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
104b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#pragma warning ( disable : 593 )
105b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
106b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
107b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// Disable ICC's remark #1418: external function definition with no prior declaration.
108b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// This is legal ANSI C code so we disable the remark that is turned on with /W4
109b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
110b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#pragma warning ( disable : 1418 )
111b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
112b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
113b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
114b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// Disable ICC's remark #1419: external declaration in primary source file
115b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten// This is legal ANSI C code so we disable the remark that is turned on with /W4
116b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten//
117b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#pragma warning ( disable : 1419 )
118b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
11959a7e4f4bd159d4e91d29410ce0c3fa03646c363xli//
12059a7e4f4bd159d4e91d29410ce0c3fa03646c363xli// Disable ICC's remark #869: "Parameter" was never referenced warning.
12159a7e4f4bd159d4e91d29410ce0c3fa03646c363xli// This is legal ANSI C code so we disable the remark that is turned on with -Wall
12259a7e4f4bd159d4e91d29410ce0c3fa03646c363xli//
12359a7e4f4bd159d4e91d29410ce0c3fa03646c363xli#pragma warning ( disable : 869 )
12459a7e4f4bd159d4e91d29410ce0c3fa03646c363xli
125b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten#endif
126b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
127b9b478088b18cf3f4d3edcf94198eb0ba7f1b7eejljusten
1283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#if _MSC_EXTENSIONS
1293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Disable warning that make it impossible to compile at /W4
1323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// This only works for Microsoft* tools
1333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Disabling bitfield type checking warnings.
1373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4214 )
1393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Disabling the unreferenced formal parameter warnings.
1423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4100 )
1443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Disable slightly different base types warning as CHAR8 * can not be set
1473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// to a constant string.
1483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4057 )
1503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
1533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4127 )
1553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Int64ShllMod32 unreferenced inline function
1583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4514 )
1603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Unreferenced formal parameter - We are object oriented, so we pass This even
1633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  if we  don't need them.
1643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4100 )
1663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// This warning is caused by empty (after preprocessing) souce file.
1693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#pragma warning ( disable : 4206 )
1713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
1743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1760e7e330262c29fd995a3ac4ea88b135d90587d96jljusten#if defined(_MSC_EXTENSIONS)
1770e7e330262c29fd995a3ac4ea88b135d90587d96jljusten
1783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  //
1790e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  // use Microsoft C complier dependent integer width types
1803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  //
1810e7e330262c29fd995a3ac4ea88b135d90587d96jljusten
1820e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned __int64    uint64_t;
1830e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef __int64             int64_t;
1840e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned __int32    uint32_t;
1850e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef __int32             int32_t;
1860e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned short      uint16_t;
1870e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef short               int16_t;
1880e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned char       uint8_t;
18964bb20fb9c05f1a7f8b731fae736069e1c2f0401lgao  typedef signed char         int8_t;
1900e7e330262c29fd995a3ac4ea88b135d90587d96jljusten#else
1910e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned long long  uint64_t;
1920e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef long long           int64_t;
1930e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned int        uint32_t;
1940e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef int                 int32_t;
1950e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned short      uint16_t;
1960e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef short               int16_t;
1970e7e330262c29fd995a3ac4ea88b135d90587d96jljusten  typedef unsigned char       uint8_t;
19864bb20fb9c05f1a7f8b731fae736069e1c2f0401lgao  typedef signed char         int8_t;
1993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
2003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Native integer size in stdint.h
2033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef uint32_t  uintn_t;
2053eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef int32_t   intn_t;
2063eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2073eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2083eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Processor specific defines
2093eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_MAX_BIT       0x80000000
2113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define MAX_2_BITS        0xC0000000
2123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Maximum legal IA-32 address
2153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_MAX_ADDRESS   0xFFFFFFFF
2173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  Bad pointer value to use in check builds.
2203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  if you see this value you are using uninitialized or free'ed data
2213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_BAD_POINTER          0xAFAFAFAF
2233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_BAD_POINTER_AS_BYTE  0xAF
2243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Inject a break point in the code to assist debugging for NT Emulation Environment
2273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// For real hardware, just put in a halt loop. Don't do a while(1) because the
2283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// compiler will optimize away the rest of the function following, so that you run out in
2293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// the weeds if you skip over it with a debugger.
2303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2310d37437d289b8ce1c57c884debf27f8fe0e2cd8eqwang#ifdef _MSC_EXTENSIONS
2323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_BREAKPOINT()  __asm { int 3 }
2330d37437d289b8ce1c57c884debf27f8fe0e2cd8eqwang#elif __GNUC__
2340d37437d289b8ce1c57c884debf27f8fe0e2cd8eqwang#define EFI_BREAKPOINT() asm("   int $3");
2350d37437d289b8ce1c57c884debf27f8fe0e2cd8eqwang#endif
2360d37437d289b8ce1c57c884debf27f8fe0e2cd8eqwang
2373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define EFI_DEADLOOP()    { volatile UINTN __iii; __iii = 1; while (__iii); }
2383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Memory Fence forces serialization, and is needed to support out of order
2413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  memory transactions. The Memory Fence is mainly used to make sure IO
2423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  transactions complete in a deterministic sequence, and to syncronize locks
2433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  an other MP code. Currently no memory fencing is required.
2443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define MEMORY_FENCE()
2463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Some compilers don't support the forward reference construct:
2493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  typedef struct XXXXX. The forward reference is required for
2503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  ANSI compatibility.
2513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// The following macro provide a workaround for such cases.
2533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifdef EFI_NO_INTERFACE_DECL
2573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_FORWARD_DECLARATION(x)
2583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#else
2593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
2603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
2613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// Some C compilers optimize the calling conventions to increase performance.
2653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// _EFIAPI is used to make all public APIs follow the standard C calling
2663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// convention.
2673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
2683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#if _MSC_EXTENSIONS
2693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  //
2703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  // Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C.
2713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  //
2723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define _EFIAPI __cdecl
2743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#else
2753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define _EFIAPI
2763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
2773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifdef _EFI_WINNT
2803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
2823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang           warning ( disable : 4142 )
2833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
2853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang           warning ( default : 4142 )
2863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#else
2873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_SUPPRESS_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
2893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang           warning ( disable : 4068 )
2903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  #define EFI_DEFAULT_BENIGN_REDEFINITION_OF_TYPE_WARNING()  \
2923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang           warning ( default : 4068 )
2933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
2953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
296297c148b7a05abc1a9dec34d63b35169e5f41809jljusten//
297297c148b7a05abc1a9dec34d63b35169e5f41809jljusten// For symbol name in GNU assembly code, an extra "_" is necessary
298297c148b7a05abc1a9dec34d63b35169e5f41809jljusten//
29978709ef8cf13fe387a5b72cab34de195e6438070eric_tian#if defined(__GNUC__)
300c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  ///
301c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  /// Private worker functions for ASM_PFX()
302c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  ///
303c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
304c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  #define __CONCATENATE(a, b) a ## b
305c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian
306c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  ///
307c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
308c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  /// on symbols in assembly language.
309c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  ///
310c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian  #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
311c113cd3272b5cde2f79a88ac5895e607ba2852e2eric_tian
312297c148b7a05abc1a9dec34d63b35169e5f41809jljusten#endif
3133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
3143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
3153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
316