12aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/** @file
22aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Common declarations and definitions for Standard C Library headers.
32aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
42aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This header consolidates definitions and declarations for compiler specific
52aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    features in one place in order to assist in making the remainder of the
62aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    library as compiler independent as possible.
72aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
82aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Certain macro and type definitions are required to be provided by several
92aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    different headers.  In order to avoid having multiple definitions, and the
102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    attendant risk of having the definitions get out of sync, they are defined in
112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    this header.
122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Note that MdePkg/Include/Base.h is automatically included and will bring
142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    processor architecture specific definitions along with it.
152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Throughout the library, the following macros are used instead of keywords so
172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    that the library can be easily tuned for different compilers.
182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    __inline    Defined to the appropriate keyword or not defined.
192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    __func__    Defined to __FUNC__, __FUNCTION__, or NULL as appropriate.
20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    __restrict  Defined to nothing for VC++ or to restrict for GCC and C99 compliant compilers.
212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This file and its contents are inspired by the <sys/cdefs.h> files in Berkeley
232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unix.  They have been re-implemented to be specific to the EFI environment.
242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
250164fc8e76b6ca9023c893940ddb00ef0b6bee5adaryl.mcdaniel    Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This program and the accompanying materials are licensed and made available under
272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the terms and conditions of the BSD License that accompanies this distribution.
282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    The full text of the license may be found at
29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    http://opensource.org/licenses/bsd-license.
302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Portions Copyright (c) 1991, 1993
352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    The Regents of the University of California.  All rights reserved.
362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Portions of this code are derived from software contributed to Berkeley by
382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Berkeley Software Design, Inc.
392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Redistribution and use in source and binary forms, with or without
402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    modification, are permitted provided that the following conditions
412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are met:
422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      1. Redistributions of source code must retain the above copyright
432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        notice, this list of conditions and the following disclaimer.
442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      2. Redistributions in binary form must reproduce the above copyright
452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        notice, this list of conditions and the following disclaimer in the
462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        documentation and/or other materials provided with the distribution.
472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      3. Neither the name of the University nor the names of its contributors
482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        may be used to endorse or promote products derived from this software
492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        without specific prior written permission.
502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    SUCH DAMAGE.
622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm**/
632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef _EFI_CDEFS_H
642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_CDEFS_H
652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*
672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* Macro to test if we're using a GNU C compiler of a specific vintage
682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* or later, for e.g. features that appeared in a particular version
692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* of GNU C.  Usage:
702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*
712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*  #if __GNUC_PREREQ__(major, minor)
722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*  ...cool feature...
732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*  #else
742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*  ...delete feature...
752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*  #endif
762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __GNUC__
782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __GNUC_PREREQ__(x, y)           \
792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||      \
802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (__GNUC__ > (x)))
812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define DONT_USE_STRONG_WEAK_ALIAS  1
832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __GNUC_PREREQ__(x, y) 0
862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include  <sys/featuretest.h>
892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#include <machine/_EfiCdefs.h>
902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __PE32__
912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <sys/_EfiCdefs_PE32.h>
922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <sys/cdefs_aout.h>
942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* NULL is defined by the automatic inclusion of Base.h by the build tools. */
972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __GNUC__
992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define _EFI_SIZE_T_      __SIZE_TYPE__     /* sizeof() */
1002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define _EFI_WCHAR_T      __WCHAR_TYPE__
1012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define _EFI_WINT_T       __WINT_TYPE__
1022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //#define _EFI_WINT_MIN     (0)
1032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //#define _EFI_WINT_MAX     (0xFFFF)
1042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define _EFI_PTRDIFF_T_   __PTRDIFF_TYPE__  /* ptr1 - ptr2 --- Must be same size as size_t */
1055244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm
1062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
1072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_SIZE_T_      UINTN       /* sizeof() */
1082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_WCHAR_T      UINT16
1092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_WINT_T       INT32
1102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //#define _EFI_WINT_MIN     (-2147483647)       /* wint_t   */
1112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //#define _EFI_WINT_MAX     ( 2147483647)       /* wint_t   */
1122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define _EFI_PTRDIFF_T_   INTN       /* ptr1 - ptr2 --- Must be same size as size_t */
1132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif  /* __GNUC__ */
1142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_CLOCK_T      UINT64
1162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _EFI_TIME_T       INT32
1172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(__cplusplus)
1192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __BEGIN_DECLS   extern "C" {
1202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __END_DECLS   }
1212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __static_cast(x,y)  static_cast<x>(y)
1222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
1232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __BEGIN_DECLS
1242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __END_DECLS
1252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __static_cast(x,y)  (x)y
1262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
1272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
1292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
1302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
1312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
1322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * in between its arguments.  __CONCAT can also concatenate double-quoted
1332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * strings produced by the __STRING macro, but this only works with ANSI C.
1342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
1352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ___STRING(x)  __STRING(x)
1372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ___CONCAT(x,y)  __CONCAT(x,y)
1382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __CONCAT(x,y) x ## y
1392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __STRING(x) #x
1402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __const     CONST
1422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __signed    signed
1432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __volatile  volatile
1442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __STDC__ || defined(__cplusplus)
1462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #if defined(__cplusplus)
1472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __inline  inline    /* convert to C++ keyword */
1482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #else
1492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #if defined(_MSC_VER) || (!defined(__GNUC__) && !defined(__lint__))
1502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      #define __inline      /* delete C99 keyword */
1512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #endif /* !__GNUC__  && !__lint__ */
1522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #endif /* !__cplusplus */
1532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif  /* !(__STDC__ || __cplusplus) */
1542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Used in NetBSD for internal auditing of the source tree. */
1562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __aconst
1572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
1592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * The following macro is used to remove const cast-away warnings
1602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * from gcc -Wcast-qual; it should be used with caution because it
1612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * can hide valid errors; in particular most valid uses are in
1622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * situations where the API requires it, not to cast away string
1632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * constants. We don't use *intptr_t on purpose here and we are
1642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * explicit about unsigned long so that we don't have additional
1652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * dependencies.
1662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
1672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __UNCONST(a)  ((void *)(a))
1682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define __UNCONST(a)  ((void *)(PHYSICAL_ADDRESS)(const void *)(a))
1692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
1712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * The following macro is used to remove the volatile cast-away warnings
1722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * from gcc -Wcast-qual; as above it should be used with caution
1732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * because it can hide valid errors or warnings.  Valid uses include
1742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * making it possible to pass a volatile pointer to memset().
1752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * For the same reasons as above, we use unsigned long and not intptr_t.
1762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
1772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __UNVOLATILE(a) ((void *)(PHYSICAL_ADDRESS)(volatile void *)(a))
1782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
1802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * GCC2 provides __extension__ to suppress warnings for various GNU C
1812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * language extensions under "-ansi -pedantic".
1822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
1832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if !__GNUC_PREREQ__(2, 0)
1842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __extension__   /* delete __extension__ if non-gcc or gcc1 */
1852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
1862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
1882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * GCC1 and some versions of GCC2 declare dead (non-returning) and
1892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * pure (no side effects) functions using "volatile" and "const";
1902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * unfortunately, these then cause warnings under "-ansi -pedantic".
1912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
1922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * these work for GNU C++ (modulo a slight glitch in the C++ grammar
1932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * in the distribution version of 2.5.5).
1942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
1952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if !__GNUC_PREREQ__(2, 5)
1962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __attribute__(x)  /* delete __attribute__ if non-gcc or gcc1 */
1972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
1982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __dead    __volatile
1992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __pure    __const
2002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Delete pseudo-keywords wherever they are not available or needed. */
2042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef __dead
2052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __dead
2062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __pure
2072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __GNUC_PREREQ__(2, 7)
2102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __unused  __attribute__((__unused__))
2112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __noreturn  __attribute__((__noreturn__))
2122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
2132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __unused  /* delete */
2142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __noreturn  /* delete */
2152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __GNUC_PREREQ__(3, 1)
2182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __used    __attribute__((__used__))
2192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
2202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __used    __unused
2212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __GNUC_PREREQ__(2, 7)
2242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __packed  __attribute__((__packed__))
2252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __aligned(x)  __attribute__((__aligned__(x)))
2262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __section(x)  __attribute__((__section__(x)))
2272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#elif defined(__lint__)
2282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __packed  /* delete */
2292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __aligned(x)  /* delete */
2302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __section(x)  /* delete */
2312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
2322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __packed  error: no __packed for this compiler
2332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __aligned(x)  error: no __aligned for this compiler
2342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __section(x)  error: no __section for this compiler
2352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*
2382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* C99 defines the restrict type qualifier keyword, which was made available
2392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* in GCC 2.92.
2402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
2412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __STDC_VERSION__ >= 199901L
2422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define __restrict  restrict
2432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
2442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #if defined(_MSC_VER) || !__GNUC_PREREQ__(2, 92)
2452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __restrict  /* delete __restrict when not supported */
2462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #endif
2472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*
2502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* C99 defines __func__ predefined identifier, which was made available
2512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm* in GCC 2.95.
2522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
2532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if !(__STDC_VERSION__ >= 199901L)
2542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #if defined(_MSC_VER)
2552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __func__    __FUNCTION__  /* Use the MS-specific predefined macro */
2562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #elif __GNUC_PREREQ__(2, 6)
2572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __func__  __PRETTY_FUNCTION__
2582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #elif __GNUC_PREREQ__(2, 4)
2592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __func__  __FUNCTION__
2602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #else
2612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    #define __func__  ""
2622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #endif
2632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* !(__STDC_VERSION__ >= 199901L) */
2642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define __RENAME(x)
2662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
2682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * A barrier to stop the optimizer from moving code or assume live
2692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * register values. This is gcc specific, the version is more or less
2702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * arbitrary, might work with older compilers.
2712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
2722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __GNUC_PREREQ__(2, 95)
2732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __insn_barrier()  __asm __volatile("":::"memory")
2742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
2752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __insn_barrier()  /* */
2762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
2772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*
2792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * GNU C version 2.96 adds explicit branch prediction so that
2802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * the CPU back-end can hint the processor and also so that
2812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * code blocks can be reordered such that the predicted path
2822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * sees a more linear flow, thus improving cache behavior, etc.
2832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *
2842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * The following two macros provide us with a way to use this
2852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * compiler feature.  Use __predict_true() if you expect the expression
2862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * to evaluate to true, and __predict_false() if you expect the
2872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * expression to evaluate to false.
2882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *
2892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  * A few notes about usage:
2902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *
2912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *  * Generally, __predict_false() error condition checks (unless
2922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    you have some _strong_ reason to do otherwise, in which case
2932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    document it), and/or __predict_true() `no-error' condition
2942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    checks, assuming you want to optimize for the no-error case.
2952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *
2962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *  * Other than that, if you don't know the likelihood of a test
2972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    succeeding from empirical or other `hard' evidence, don't
2982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    make predictions.
2992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *
3002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *  * These are meant to be used in places that are run `a lot'.
3012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    It is wasteful to make predictions in code that is run
3022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    seldomly (e.g. at subsystem initialization time) as the
3032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    basic block reordering that this affects can often generate
3042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *    larger code.
3052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
3062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __GNUC_PREREQ__(2, 96)
3072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __predict_true(exp) __builtin_expect((exp) != 0, 1)
3082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __predict_false(exp)  __builtin_expect((exp) != 0, 0)
3092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
3102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __predict_true(exp) (exp)
3112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __predict_false(exp)  (exp)
3122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
3132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* find least significant bit that is set */
3152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
3162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask))
3182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask))
3192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask))
3202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(_MSC_VER)           /* Handle Microsoft VC++ compiler specifics. */
3222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /*  VC++, by default, defines wchar_t as an intrinsic type, equivalent to
3242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    unsigned short.  This conflicts which Standard C Library
3252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    implementations which try to define wchar_t.
3262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Make sure that this behavior has been turned off by using
3272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /Zc:wchar_t- on the command line.
3282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    */
3292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #ifdef _NATIVE_WCHAR_T_DEFINED
3302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #error You must specify /Zc:wchar_t- to the compiler to turn off intrinsic wchar_t.
3312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #endif
3322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
333d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm  /* Get rid of pre-defined macros that are misleading in this environment. */
334d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm  #undef  _WIN32
335d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm  #undef  _WIN64
336d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm
3372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  // Keep compiler quiet about casting from smaller to larger types
3382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4306 )
339b26913ef0ef10a2ff9a585b0a255175fca83099cdarylm
340b26913ef0ef10a2ff9a585b0a255175fca83099cdarylm  #define __STDC__            1
341b26913ef0ef10a2ff9a585b0a255175fca83099cdarylm  #define __STDC_VERSION__    199409L
342b26913ef0ef10a2ff9a585b0a255175fca83099cdarylm  #define __STDC_HOSTED__     1
343b26913ef0ef10a2ff9a585b0a255175fca83099cdarylm
3442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif  /* defined(_MSC_VER) */
3452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern int _fltused;    // VC++ requires this if you use floating point.  KEEP for all compilers.
3462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _Bool BOOLEAN
3482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _DIAGASSERT(e)
3492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm// Types used to replace long so that it will have constant length regardless of compiler.
3515244f47e46709b22ecefcee8e52b6dc6170ed6c9darylmtypedef  INT32   LONG32;
3522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtypedef UINT32  ULONG32;
3532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtypedef  INT64   LONG64;
3542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtypedef UINT64  ULONG64;
3552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
356d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylmtypedef   INTN   EFI_LONG_T;
357d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylmtypedef  UINTN   EFI_ULONG_T;
3585244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm
3595244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm/* These types reflect the compiler's size for long */
3605244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm#if defined(__GNUC__)
3615244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  #if __GNUC_PREREQ__(4,4)
3625244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm    /* GCC 4.4 or later */
3630164fc8e76b6ca9023c893940ddb00ef0b6bee5adaryl.mcdaniel    typedef   INTN    LONGN;
3640164fc8e76b6ca9023c893940ddb00ef0b6bee5adaryl.mcdaniel    typedef  UINTN    ULONGN;
3655244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  #else
3665244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm    /* minGW gcc variant */
3675244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm    typedef   INT32   LONGN;
3685244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm    typedef  UINT32   ULONGN;
3695244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  #endif  /* __GNUC_PREREQ__(4,4) */
3705244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm#else   /* NOT GCC */
3715244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  /* Microsoft or Intel compilers */
3725244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  typedef   INT32   LONGN;
3735244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm  typedef  UINT32   ULONGN;
3745244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm#endif  /* defined(__GNUC__) */
3755244f47e46709b22ecefcee8e52b6dc6170ed6c9darylm
3762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif  /* _EFI_CDEFS_H */
377