The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/edk2/Include/Base.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /** @file
    2   Root include file for Mde Package Base type modules
    3 
    4   This is the include file for any module of type base. Base modules only use
    5   types defined via this include file and can be ported easily to any
    6   environment. There are a set of base libraries in the Mde Package that can
    7   be used to implement base modules.
    8 
    9 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
   10 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
   11 SPDX-License-Identifier: BSD-2-Clause-Patent
   12 
   13 **/
   14 
   15 
   16 #ifndef __BASE_H__
   17 #define __BASE_H__
   18 
   19 //
   20 // Include processor specific binding
   21 //
   22 #include <ProcessorBind.h>
   23 
   24 #if defined(_MSC_EXTENSIONS)
   25 //
   26 // Disable warning when last field of data structure is a zero sized array.
   27 //
   28 #pragma warning ( disable : 4200 )
   29 #endif
   30 
   31 //
   32 // The Microsoft* C compiler can removed references to unreferenced data items
   33 //  if the /OPT:REF linker option is used. We defined a macro as this is a
   34 //  a non standard extension
   35 //
   36 #if defined(_MSC_VER) && _MSC_VER < 1800 && !defined (MDE_CPU_EBC)
   37   ///
   38   /// Remove global variable from the linked image if there are no references to
   39   /// it after all compiler and linker optimizations have been performed.
   40   ///
   41   ///
   42   #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
   43 #else
   44   ///
   45   /// Remove the global variable from the linked image if there are no references
   46   ///  to it after all compiler and linker optimizations have been performed.
   47   ///
   48   ///
   49   #define GLOBAL_REMOVE_IF_UNREFERENCED
   50 #endif
   51 
   52 //
   53 // Should be used in combination with NORETURN to avoid 'noreturn' returns
   54 // warnings.
   55 //
   56 #ifndef UNREACHABLE
   57   #ifdef __GNUC__
   58     ///
   59     /// Signal compilers and analyzers that this call is not reachable.  It is
   60     /// up to the compiler to remove any code past that point.
   61     ///
   62     #define UNREACHABLE()  __builtin_unreachable ()
   63   #elif defined (__has_feature)
   64     #if __has_builtin (__builtin_unreachable)
   65       ///
   66       /// Signal compilers and analyzers that this call is not reachable.  It is
   67       /// up to the compiler to remove any code past that point.
   68       ///
   69       #define UNREACHABLE()  __builtin_unreachable ()
   70     #endif
   71   #endif
   72 
   73   #ifndef UNREACHABLE
   74     ///
   75     /// Signal compilers and analyzers that this call is not reachable.  It is
   76     /// up to the compiler to remove any code past that point.
   77     ///
   78     #define UNREACHABLE()
   79   #endif
   80 #endif
   81 
   82 //
   83 // Signaling compilers and analyzers that a certain function cannot return may
   84 // remove all following code and thus lead to better optimization and less
   85 // false positives.
   86 //
   87 #ifndef NORETURN
   88   #if defined (__GNUC__) || defined (__clang__)
   89     ///
   90     /// Signal compilers and analyzers that the function cannot return.
   91     /// It is up to the compiler to remove any code past a call to functions
   92     /// flagged with this attribute.
   93     ///
   94     #define NORETURN  __attribute__((noreturn))
   95   #elif defined(_MSC_EXTENSIONS) && !defined(MDE_CPU_EBC)
   96     ///
   97     /// Signal compilers and analyzers that the function cannot return.
   98     /// It is up to the compiler to remove any code past a call to functions
   99     /// flagged with this attribute.
  100     ///
  101     #define NORETURN  __declspec(noreturn)
  102   #else
  103     ///
  104     /// Signal compilers and analyzers that the function cannot return.
  105     /// It is up to the compiler to remove any code past a call to functions
  106     /// flagged with this attribute.
  107     ///
  108     #define NORETURN
  109   #endif
  110 #endif
  111 
  112 //
  113 // Should be used in combination with ANALYZER_NORETURN to avoid 'noreturn'
  114 // returns warnings.
  115 //
  116 #ifndef ANALYZER_UNREACHABLE
  117   #ifdef __clang_analyzer__
  118     #if __has_builtin (__builtin_unreachable)
  119       ///
  120       /// Signal the analyzer that this call is not reachable.
  121       /// This excludes compilers.
  122       ///
  123       #define ANALYZER_UNREACHABLE()  __builtin_unreachable ()
  124     #endif
  125   #endif
  126 
  127   #ifndef ANALYZER_UNREACHABLE
  128     ///
  129     /// Signal the analyzer that this call is not reachable.
  130     /// This excludes compilers.
  131     ///
  132     #define ANALYZER_UNREACHABLE()
  133   #endif
  134 #endif
  135 
  136 //
  137 // Static Analyzers may issue errors about potential NULL-dereferences when
  138 // dereferencing a pointer, that has been checked before, outside of a
  139 // NULL-check.  This may lead to false positives, such as when using ASSERT()
  140 // for verification.
  141 //
  142 #ifndef ANALYZER_NORETURN
  143   #ifdef __has_feature
  144     #if __has_feature (attribute_analyzer_noreturn)
  145       ///
  146       /// Signal analyzers that the function cannot return.
  147       /// This excludes compilers.
  148       ///
  149       #define ANALYZER_NORETURN  __attribute__((analyzer_noreturn))
  150     #endif
  151   #endif
  152 
  153   #ifndef ANALYZER_NORETURN
  154     ///
  155     /// Signal the analyzer that the function cannot return.
  156     /// This excludes compilers.
  157     ///
  158     #define ANALYZER_NORETURN
  159   #endif
  160 #endif
  161 
  162 ///
  163 /// Tell the code optimizer that the function will return twice.
  164 /// This prevents wrong optimizations which can cause bugs.
  165 ///
  166 #ifndef RETURNS_TWICE
  167   #if defined (__GNUC__) || defined (__clang__)
  168     ///
  169     /// Tell the code optimizer that the function will return twice.
  170     /// This prevents wrong optimizations which can cause bugs.
  171     ///
  172     #define RETURNS_TWICE  __attribute__((returns_twice))
  173   #else
  174     ///
  175     /// Tell the code optimizer that the function will return twice.
  176     /// This prevents wrong optimizations which can cause bugs.
  177     ///
  178     #define RETURNS_TWICE
  179   #endif
  180 #endif
  181 
  182 //
  183 // For symbol name in assembly code, an extra "_" is sometimes necessary
  184 //
  185 
  186 ///
  187 /// Private worker functions for ASM_PFX()
  188 ///
  189 #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
  190 #define __CONCATENATE(a, b) a ## b
  191 
  192 ///
  193 /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
  194 /// on symbols in assembly language.
  195 ///
  196 #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
  197 
  198 #ifdef __APPLE__
  199   //
  200   // Apple extension that is used by the linker to optimize code size
  201   // with assembly functions. Put at the end of your .S files
  202   //
  203   #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED  .subsections_via_symbols
  204 #else
  205   #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED
  206 #endif
  207 
  208 #ifdef __CC_ARM
  209   //
  210   // Older RVCT ARM compilers don't fully support #pragma pack and require __packed
  211   // as a prefix for the structure.
  212   //
  213   #define PACKED  __packed
  214 #else
  215   #define PACKED
  216 #endif
  217 
  218 ///
  219 /// 128 bit buffer containing a unique identifier value.
  220 /// Unless otherwise specified, aligned on a 64 bit boundary.
  221 ///
  222 typedef struct {
  223   UINT32  Data1;
  224   UINT16  Data2;
  225   UINT16  Data3;
  226   UINT8   Data4[8];
  227 } GUID;
  228 
  229 ///
  230 /// 4-byte buffer. An IPv4 internet protocol address.
  231 ///
  232 typedef struct {
  233   UINT8 Addr[4];
  234 } IPv4_ADDRESS;
  235 
  236 ///
  237 /// 16-byte buffer. An IPv6 internet protocol address.
  238 ///
  239 typedef struct {
  240   UINT8 Addr[16];
  241 } IPv6_ADDRESS;
  242 
  243 //
  244 // 8-bytes unsigned value that represents a physical system address.
  245 //
  246 typedef UINT64 PHYSICAL_ADDRESS;
  247 
  248 ///
  249 /// LIST_ENTRY structure definition.
  250 ///
  251 typedef struct _LIST_ENTRY LIST_ENTRY;
  252 
  253 ///
  254 /// _LIST_ENTRY structure definition.
  255 ///
  256 struct _LIST_ENTRY {
  257   LIST_ENTRY  *ForwardLink;
  258   LIST_ENTRY  *BackLink;
  259 };
  260 
  261 //
  262 // Modifiers to abstract standard types to aid in debug of problems
  263 //
  264 
  265 ///
  266 /// Datum is read-only.
  267 ///
  268 #define CONST     const
  269 
  270 ///
  271 /// Datum is scoped to the current file or function.
  272 ///
  273 #define STATIC    static
  274 
  275 ///
  276 /// Undeclared type.
  277 ///
  278 #define VOID      void
  279 
  280 //
  281 // Modifiers for Data Types used to self document code.
  282 // This concept is borrowed for UEFI specification.
  283 //
  284 
  285 ///
  286 /// Datum is passed to the function.
  287 ///
  288 #define IN
  289 
  290 ///
  291 /// Datum is returned from the function.
  292 ///
  293 #define OUT
  294 
  295 ///
  296 /// Passing the datum to the function is optional, and a NULL
  297 /// is passed if the value is not supplied.
  298 ///
  299 #define OPTIONAL
  300 
  301 //
  302 //  UEFI specification claims 1 and 0. We are concerned about the
  303 //  compiler portability so we did it this way.
  304 //
  305 
  306 ///
  307 /// Boolean true value.  UEFI Specification defines this value to be 1,
  308 /// but this form is more portable.
  309 ///
  310 #define TRUE  ((BOOLEAN)(1==1))
  311 
  312 ///
  313 /// Boolean false value.  UEFI Specification defines this value to be 0,
  314 /// but this form is more portable.
  315 ///
  316 #define FALSE ((BOOLEAN)(0==1))
  317 
  318 ///
  319 /// NULL pointer (VOID *)
  320 ///
  321 #define NULL  ((VOID *) 0)
  322 
  323 //
  324 // Null character
  325 //
  326 #define CHAR_NULL             0x0000
  327 
  328 ///
  329 /// Maximum values for common UEFI Data Types
  330 ///
  331 #define MAX_INT8    ((INT8)0x7F)
  332 #define MAX_UINT8   ((UINT8)0xFF)
  333 #define MAX_INT16   ((INT16)0x7FFF)
  334 #define MAX_UINT16  ((UINT16)0xFFFF)
  335 #define MAX_INT32   ((INT32)0x7FFFFFFF)
  336 #define MAX_UINT32  ((UINT32)0xFFFFFFFF)
  337 #define MAX_INT64   ((INT64)0x7FFFFFFFFFFFFFFFULL)
  338 #define MAX_UINT64  ((UINT64)0xFFFFFFFFFFFFFFFFULL)
  339 
  340 ///
  341 /// Minimum values for the signed UEFI Data Types
  342 ///
  343 #define MIN_INT8   (((INT8)  -127) - 1)
  344 #define MIN_INT16  (((INT16) -32767) - 1)
  345 #define MIN_INT32  (((INT32) -2147483647) - 1)
  346 #define MIN_INT64  (((INT64) -9223372036854775807LL) - 1)
  347 
  348 #define  BIT0     0x00000001
  349 #define  BIT1     0x00000002
  350 #define  BIT2     0x00000004
  351 #define  BIT3     0x00000008
  352 #define  BIT4     0x00000010
  353 #define  BIT5     0x00000020
  354 #define  BIT6     0x00000040
  355 #define  BIT7     0x00000080
  356 #define  BIT8     0x00000100
  357 #define  BIT9     0x00000200
  358 #define  BIT10    0x00000400
  359 #define  BIT11    0x00000800
  360 #define  BIT12    0x00001000
  361 #define  BIT13    0x00002000
  362 #define  BIT14    0x00004000
  363 #define  BIT15    0x00008000
  364 #define  BIT16    0x00010000
  365 #define  BIT17    0x00020000
  366 #define  BIT18    0x00040000
  367 #define  BIT19    0x00080000
  368 #define  BIT20    0x00100000
  369 #define  BIT21    0x00200000
  370 #define  BIT22    0x00400000
  371 #define  BIT23    0x00800000
  372 #define  BIT24    0x01000000
  373 #define  BIT25    0x02000000
  374 #define  BIT26    0x04000000
  375 #define  BIT27    0x08000000
  376 #define  BIT28    0x10000000
  377 #define  BIT29    0x20000000
  378 #define  BIT30    0x40000000
  379 #define  BIT31    0x80000000
  380 #define  BIT32    0x0000000100000000ULL
  381 #define  BIT33    0x0000000200000000ULL
  382 #define  BIT34    0x0000000400000000ULL
  383 #define  BIT35    0x0000000800000000ULL
  384 #define  BIT36    0x0000001000000000ULL
  385 #define  BIT37    0x0000002000000000ULL
  386 #define  BIT38    0x0000004000000000ULL
  387 #define  BIT39    0x0000008000000000ULL
  388 #define  BIT40    0x0000010000000000ULL
  389 #define  BIT41    0x0000020000000000ULL
  390 #define  BIT42    0x0000040000000000ULL
  391 #define  BIT43    0x0000080000000000ULL
  392 #define  BIT44    0x0000100000000000ULL
  393 #define  BIT45    0x0000200000000000ULL
  394 #define  BIT46    0x0000400000000000ULL
  395 #define  BIT47    0x0000800000000000ULL
  396 #define  BIT48    0x0001000000000000ULL
  397 #define  BIT49    0x0002000000000000ULL
  398 #define  BIT50    0x0004000000000000ULL
  399 #define  BIT51    0x0008000000000000ULL
  400 #define  BIT52    0x0010000000000000ULL
  401 #define  BIT53    0x0020000000000000ULL
  402 #define  BIT54    0x0040000000000000ULL
  403 #define  BIT55    0x0080000000000000ULL
  404 #define  BIT56    0x0100000000000000ULL
  405 #define  BIT57    0x0200000000000000ULL
  406 #define  BIT58    0x0400000000000000ULL
  407 #define  BIT59    0x0800000000000000ULL
  408 #define  BIT60    0x1000000000000000ULL
  409 #define  BIT61    0x2000000000000000ULL
  410 #define  BIT62    0x4000000000000000ULL
  411 #define  BIT63    0x8000000000000000ULL
  412 
  413 #define  SIZE_1KB    0x00000400
  414 #define  SIZE_2KB    0x00000800
  415 #define  SIZE_4KB    0x00001000
  416 #define  SIZE_8KB    0x00002000
  417 #define  SIZE_16KB   0x00004000
  418 #define  SIZE_32KB   0x00008000
  419 #define  SIZE_64KB   0x00010000
  420 #define  SIZE_128KB  0x00020000
  421 #define  SIZE_256KB  0x00040000
  422 #define  SIZE_512KB  0x00080000
  423 #define  SIZE_1MB    0x00100000
  424 #define  SIZE_2MB    0x00200000
  425 #define  SIZE_4MB    0x00400000
  426 #define  SIZE_8MB    0x00800000
  427 #define  SIZE_16MB   0x01000000
  428 #define  SIZE_32MB   0x02000000
  429 #define  SIZE_64MB   0x04000000
  430 #define  SIZE_128MB  0x08000000
  431 #define  SIZE_256MB  0x10000000
  432 #define  SIZE_512MB  0x20000000
  433 #define  SIZE_1GB    0x40000000
  434 #define  SIZE_2GB    0x80000000
  435 #define  SIZE_4GB    0x0000000100000000ULL
  436 #define  SIZE_8GB    0x0000000200000000ULL
  437 #define  SIZE_16GB   0x0000000400000000ULL
  438 #define  SIZE_32GB   0x0000000800000000ULL
  439 #define  SIZE_64GB   0x0000001000000000ULL
  440 #define  SIZE_128GB  0x0000002000000000ULL
  441 #define  SIZE_256GB  0x0000004000000000ULL
  442 #define  SIZE_512GB  0x0000008000000000ULL
  443 #define  SIZE_1TB    0x0000010000000000ULL
  444 #define  SIZE_2TB    0x0000020000000000ULL
  445 #define  SIZE_4TB    0x0000040000000000ULL
  446 #define  SIZE_8TB    0x0000080000000000ULL
  447 #define  SIZE_16TB   0x0000100000000000ULL
  448 #define  SIZE_32TB   0x0000200000000000ULL
  449 #define  SIZE_64TB   0x0000400000000000ULL
  450 #define  SIZE_128TB  0x0000800000000000ULL
  451 #define  SIZE_256TB  0x0001000000000000ULL
  452 #define  SIZE_512TB  0x0002000000000000ULL
  453 #define  SIZE_1PB    0x0004000000000000ULL
  454 #define  SIZE_2PB    0x0008000000000000ULL
  455 #define  SIZE_4PB    0x0010000000000000ULL
  456 #define  SIZE_8PB    0x0020000000000000ULL
  457 #define  SIZE_16PB   0x0040000000000000ULL
  458 #define  SIZE_32PB   0x0080000000000000ULL
  459 #define  SIZE_64PB   0x0100000000000000ULL
  460 #define  SIZE_128PB  0x0200000000000000ULL
  461 #define  SIZE_256PB  0x0400000000000000ULL
  462 #define  SIZE_512PB  0x0800000000000000ULL
  463 #define  SIZE_1EB    0x1000000000000000ULL
  464 #define  SIZE_2EB    0x2000000000000000ULL
  465 #define  SIZE_4EB    0x4000000000000000ULL
  466 #define  SIZE_8EB    0x8000000000000000ULL
  467 
  468 #define  BASE_1KB    0x00000400
  469 #define  BASE_2KB    0x00000800
  470 #define  BASE_4KB    0x00001000
  471 #define  BASE_8KB    0x00002000
  472 #define  BASE_16KB   0x00004000
  473 #define  BASE_32KB   0x00008000
  474 #define  BASE_64KB   0x00010000
  475 #define  BASE_128KB  0x00020000
  476 #define  BASE_256KB  0x00040000
  477 #define  BASE_512KB  0x00080000
  478 #define  BASE_1MB    0x00100000
  479 #define  BASE_2MB    0x00200000
  480 #define  BASE_4MB    0x00400000
  481 #define  BASE_8MB    0x00800000
  482 #define  BASE_16MB   0x01000000
  483 #define  BASE_32MB   0x02000000
  484 #define  BASE_64MB   0x04000000
  485 #define  BASE_128MB  0x08000000
  486 #define  BASE_256MB  0x10000000
  487 #define  BASE_512MB  0x20000000
  488 #define  BASE_1GB    0x40000000
  489 #define  BASE_2GB    0x80000000
  490 #define  BASE_4GB    0x0000000100000000ULL
  491 #define  BASE_8GB    0x0000000200000000ULL
  492 #define  BASE_16GB   0x0000000400000000ULL
  493 #define  BASE_32GB   0x0000000800000000ULL
  494 #define  BASE_64GB   0x0000001000000000ULL
  495 #define  BASE_128GB  0x0000002000000000ULL
  496 #define  BASE_256GB  0x0000004000000000ULL
  497 #define  BASE_512GB  0x0000008000000000ULL
  498 #define  BASE_1TB    0x0000010000000000ULL
  499 #define  BASE_2TB    0x0000020000000000ULL
  500 #define  BASE_4TB    0x0000040000000000ULL
  501 #define  BASE_8TB    0x0000080000000000ULL
  502 #define  BASE_16TB   0x0000100000000000ULL
  503 #define  BASE_32TB   0x0000200000000000ULL
  504 #define  BASE_64TB   0x0000400000000000ULL
  505 #define  BASE_128TB  0x0000800000000000ULL
  506 #define  BASE_256TB  0x0001000000000000ULL
  507 #define  BASE_512TB  0x0002000000000000ULL
  508 #define  BASE_1PB    0x0004000000000000ULL
  509 #define  BASE_2PB    0x0008000000000000ULL
  510 #define  BASE_4PB    0x0010000000000000ULL
  511 #define  BASE_8PB    0x0020000000000000ULL
  512 #define  BASE_16PB   0x0040000000000000ULL
  513 #define  BASE_32PB   0x0080000000000000ULL
  514 #define  BASE_64PB   0x0100000000000000ULL
  515 #define  BASE_128PB  0x0200000000000000ULL
  516 #define  BASE_256PB  0x0400000000000000ULL
  517 #define  BASE_512PB  0x0800000000000000ULL
  518 #define  BASE_1EB    0x1000000000000000ULL
  519 #define  BASE_2EB    0x2000000000000000ULL
  520 #define  BASE_4EB    0x4000000000000000ULL
  521 #define  BASE_8EB    0x8000000000000000ULL
  522 
  523 //
  524 //  Support for variable argument lists in freestanding edk2 modules.
  525 //
  526 //  For modules that use the ISO C library interfaces for variable
  527 //  argument lists, refer to "StdLib/Include/stdarg.h".
  528 //
  529 //  VA_LIST  - typedef for argument list.
  530 //  VA_START (VA_LIST Marker, argument before the ...) - Init Marker for use.
  531 //  VA_END (VA_LIST Marker) - Clear Marker
  532 //  VA_ARG (VA_LIST Marker, var arg type) - Use Marker to get an argument from
  533 //    the ... list. You must know the type and pass it in this macro.  Type
  534 //    must be compatible with the type of the actual next argument (as promoted
  535 //    according to the default argument promotions.)
  536 //  VA_COPY (VA_LIST Dest, VA_LIST Start) - Initialize Dest as a copy of Start.
  537 //
  538 //  Example:
  539 //
  540 //  UINTN
  541 //  EFIAPI
  542 //  ExampleVarArg (
  543 //    IN UINTN  NumberOfArgs,
  544 //    ...
  545 //    )
  546 //  {
  547 //    VA_LIST Marker;
  548 //    UINTN   Index;
  549 //    UINTN   Result;
  550 //
  551 //    //
  552 //    // Initialize the Marker
  553 //    //
  554 //    VA_START (Marker, NumberOfArgs);
  555 //    for (Index = 0, Result = 0; Index < NumberOfArgs; Index++) {
  556 //      //
  557 //      // The ... list is a series of UINTN values, so sum them up.
  558 //      //
  559 //      Result += VA_ARG (Marker, UINTN);
  560 //    }
  561 //
  562 //    VA_END (Marker);
  563 //    return Result;
  564 //  }
  565 //
  566 //  Notes:
  567 //  - Functions that call VA_START() / VA_END() must have a variable
  568 //    argument list and must be declared EFIAPI.
  569 //  - Functions that call VA_COPY() / VA_END() must be declared EFIAPI.
  570 //  - Functions that only use VA_LIST and VA_ARG() need not be EFIAPI.
  571 //
  572 
  573 /**
  574   Return the size of argument that has been aligned to sizeof (UINTN).
  575 
  576   @param  n    The parameter size to be aligned.
  577 
  578   @return The aligned size.
  579 **/
  580 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
  581 
  582 #if defined(__CC_ARM)
  583 //
  584 // RVCT ARM variable argument list support.
  585 //
  586 
  587 ///
  588 /// Variable used to traverse the list of arguments. This type can vary by
  589 /// implementation and could be an array or structure.
  590 ///
  591 #ifdef __APCS_ADSABI
  592   typedef int         *va_list[1];
  593   #define VA_LIST     va_list
  594 #else
  595   typedef struct __va_list { void *__ap; } va_list;
  596   #define VA_LIST                          va_list
  597 #endif
  598 
  599 #define VA_START(Marker, Parameter)   __va_start(Marker, Parameter)
  600 
  601 #define VA_ARG(Marker, TYPE)          __va_arg(Marker, TYPE)
  602 
  603 #define VA_END(Marker)                ((void)0)
  604 
  605 // For some ARM RVCT compilers, __va_copy is not defined
  606 #ifndef __va_copy
  607   #define __va_copy(dest, src) ((void)((dest) = (src)))
  608 #endif
  609 
  610 #define VA_COPY(Dest, Start)          __va_copy (Dest, Start)
  611 
  612 #elif defined(_M_ARM) || defined(_M_ARM64)
  613 //
  614 // MSFT ARM variable argument list support.
  615 //
  616 
  617 typedef char* VA_LIST;
  618 
  619 #define VA_START(Marker, Parameter)     __va_start (&Marker, &Parameter, _INT_SIZE_OF (Parameter), __alignof(Parameter), &Parameter)
  620 #define VA_ARG(Marker, TYPE)            (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE) + ((-(INTN)Marker) & (sizeof(TYPE) - 1))) - _INT_SIZE_OF (TYPE)))
  621 #define VA_END(Marker)                  (Marker = (VA_LIST) 0)
  622 #define VA_COPY(Dest, Start)            ((void)((Dest) = (Start)))
  623 
  624 #elif defined(__GNUC__) || defined(__clang__)
  625 
  626 #if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS)
  627 //
  628 // X64 only. Use MS ABI version of GCC built-in macros for variable argument lists.
  629 //
  630 ///
  631 /// Both GCC and LLVM 3.8 for X64 support new variable argument intrinsics for Microsoft ABI
  632 ///
  633 
  634 ///
  635 /// Variable used to traverse the list of arguments. This type can vary by
  636 /// implementation and could be an array or structure.
  637 ///
  638 typedef __builtin_ms_va_list VA_LIST;
  639 
  640 #define VA_START(Marker, Parameter)  __builtin_ms_va_start (Marker, Parameter)
  641 
  642 #define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ? (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, TYPE)))
  643 
  644 #define VA_END(Marker)               __builtin_ms_va_end (Marker)
  645 
  646 #define VA_COPY(Dest, Start)         __builtin_ms_va_copy (Dest, Start)
  647 
  648 #else
  649 //
  650 // Use GCC built-in macros for variable argument lists.
  651 //
  652 
  653 ///
  654 /// Variable used to traverse the list of arguments. This type can vary by
  655 /// implementation and could be an array or structure.
  656 ///
  657 typedef __builtin_va_list VA_LIST;
  658 
  659 #define VA_START(Marker, Parameter)  __builtin_va_start (Marker, Parameter)
  660 
  661 #define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ? (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, TYPE)))
  662 
  663 #define VA_END(Marker)               __builtin_va_end (Marker)
  664 
  665 #define VA_COPY(Dest, Start)         __builtin_va_copy (Dest, Start)
  666 
  667 #endif
  668 
  669 #else
  670 ///
  671 /// Variable used to traverse the list of arguments. This type can vary by
  672 /// implementation and could be an array or structure.
  673 ///
  674 typedef CHAR8 *VA_LIST;
  675 
  676 /**
  677   Retrieves a pointer to the beginning of a variable argument list, based on
  678   the name of the parameter that immediately precedes the variable argument list.
  679 
  680   This function initializes Marker to point to the beginning of the variable
  681   argument list that immediately follows Parameter.  The method for computing the
  682   pointer to the next argument in the argument list is CPU-specific following the
  683   EFIAPI ABI.
  684 
  685   @param   Marker       The VA_LIST used to traverse the list of arguments.
  686   @param   Parameter    The name of the parameter that immediately precedes
  687                         the variable argument list.
  688 
  689   @return  A pointer to the beginning of a variable argument list.
  690 
  691 **/
  692 #define VA_START(Marker, Parameter) (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF (Parameter)))
  693 
  694 /**
  695   Returns an argument of a specified type from a variable argument list and updates
  696   the pointer to the variable argument list to point to the next argument.
  697 
  698   This function returns an argument of the type specified by TYPE from the beginning
  699   of the variable argument list specified by Marker.  Marker is then updated to point
  700   to the next argument in the variable argument list.  The method for computing the
  701   pointer to the next argument in the argument list is CPU-specific following the EFIAPI ABI.
  702 
  703   @param   Marker   VA_LIST used to traverse the list of arguments.
  704   @param   TYPE     The type of argument to retrieve from the beginning
  705                     of the variable argument list.
  706 
  707   @return  An argument of the type specified by TYPE.
  708 
  709 **/
  710 #define VA_ARG(Marker, TYPE)   (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))
  711 
  712 /**
  713   Terminates the use of a variable argument list.
  714 
  715   This function initializes Marker so it can no longer be used with VA_ARG().
  716   After this macro is used, the only way to access the variable argument list is
  717   by using VA_START() again.
  718 
  719   @param   Marker   VA_LIST used to traverse the list of arguments.
  720 
  721 **/
  722 #define VA_END(Marker)      (Marker = (VA_LIST) 0)
  723 
  724 /**
  725   Initializes a VA_LIST as a copy of an existing VA_LIST.
  726 
  727   This macro initializes Dest as a copy of Start, as if the VA_START macro had been applied to Dest
  728   followed by the same sequence of uses of the VA_ARG macro as had previously been used to reach
  729   the present state of Start.
  730 
  731   @param   Dest   VA_LIST used to traverse the list of arguments.
  732   @param   Start  VA_LIST used to traverse the list of arguments.
  733 
  734 **/
  735 #define VA_COPY(Dest, Start)  ((void)((Dest) = (Start)))
  736 
  737 #endif
  738 
  739 ///
  740 /// Pointer to the start of a variable argument list stored in a memory buffer. Same as UINT8 *.
  741 ///
  742 typedef UINTN  *BASE_LIST;
  743 
  744 /**
  745   Returns the size of a data type in sizeof(UINTN) units rounded up to the nearest UINTN boundary.
  746 
  747   @param  TYPE  The date type to determine the size of.
  748 
  749   @return The size of TYPE in sizeof (UINTN) units rounded up to the nearest UINTN boundary.
  750 **/
  751 #define _BASE_INT_SIZE_OF(TYPE) ((sizeof (TYPE) + sizeof (UINTN) - 1) / sizeof (UINTN))
  752 
  753 /**
  754   Returns an argument of a specified type from a variable argument list and updates
  755   the pointer to the variable argument list to point to the next argument.
  756 
  757   This function returns an argument of the type specified by TYPE from the beginning
  758   of the variable argument list specified by Marker.  Marker is then updated to point
  759   to the next argument in the variable argument list.  The method for computing the
  760   pointer to the next argument in the argument list is CPU specific following the EFIAPI ABI.
  761 
  762   @param   Marker   The pointer to the beginning of a variable argument list.
  763   @param   TYPE     The type of argument to retrieve from the beginning
  764                     of the variable argument list.
  765 
  766   @return  An argument of the type specified by TYPE.
  767 
  768 **/
  769 #define BASE_ARG(Marker, TYPE)   (*(TYPE *) ((Marker += _BASE_INT_SIZE_OF (TYPE)) - _BASE_INT_SIZE_OF (TYPE)))
  770 
  771 /**
  772   The macro that returns the byte offset of a field in a data structure.
  773 
  774   This function returns the offset, in bytes, of field specified by Field from the
  775   beginning of the  data structure specified by TYPE. If TYPE does not contain Field,
  776   the module will not compile.
  777 
  778   @param   TYPE     The name of the data structure that contains the field specified by Field.
  779   @param   Field    The name of the field in the data structure.
  780 
  781   @return  Offset, in bytes, of field.
  782 
  783 **/
  784 #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__clang__)
  785 #define OFFSET_OF(TYPE, Field) ((UINTN) __builtin_offsetof(TYPE, Field))
  786 #endif
  787 
  788 #ifndef OFFSET_OF
  789 #define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field))
  790 #endif
  791 
  792 /**
  793   Portable definition for compile time assertions.
  794   Equivalent to C11 static_assert macro from assert.h.
  795 
  796   @param  Expression  Boolean expression.
  797   @param  Message     Raised compiler diagnostic message when expression is false.
  798 
  799 **/
  800 #ifdef MDE_CPU_EBC
  801   #define STATIC_ASSERT(Expression, Message)
  802 #elif defined(_MSC_EXTENSIONS)
  803   #define STATIC_ASSERT static_assert
  804 #else
  805   #define STATIC_ASSERT _Static_assert
  806 #endif
  807 
  808 //
  809 // Verify that ProcessorBind.h produced UEFI Data Types that are compliant with
  810 // Section 2.3.1 of the UEFI 2.3 Specification.
  811 //
  812 
  813 STATIC_ASSERT (sizeof (BOOLEAN) == 1, "sizeof (BOOLEAN) does not meet UEFI Specification Data Type requirements");
  814 STATIC_ASSERT (sizeof (INT8)    == 1, "sizeof (INT8) does not meet UEFI Specification Data Type requirements");
  815 STATIC_ASSERT (sizeof (UINT8)   == 1, "sizeof (UINT8) does not meet UEFI Specification Data Type requirements");
  816 STATIC_ASSERT (sizeof (INT16)   == 2, "sizeof (INT16) does not meet UEFI Specification Data Type requirements");
  817 STATIC_ASSERT (sizeof (UINT16)  == 2, "sizeof (UINT16) does not meet UEFI Specification Data Type requirements");
  818 STATIC_ASSERT (sizeof (INT32)   == 4, "sizeof (INT32) does not meet UEFI Specification Data Type requirements");
  819 STATIC_ASSERT (sizeof (UINT32)  == 4, "sizeof (UINT32) does not meet UEFI Specification Data Type requirements");
  820 STATIC_ASSERT (sizeof (INT64)   == 8, "sizeof (INT64) does not meet UEFI Specification Data Type requirements");
  821 STATIC_ASSERT (sizeof (UINT64)  == 8, "sizeof (UINT64) does not meet UEFI Specification Data Type requirements");
  822 STATIC_ASSERT (sizeof (CHAR8)   == 1, "sizeof (CHAR8) does not meet UEFI Specification Data Type requirements");
  823 STATIC_ASSERT (sizeof (CHAR16)  == 2, "sizeof (CHAR16) does not meet UEFI Specification Data Type requirements");
  824 
  825 //
  826 // The following three enum types are used to verify that the compiler
  827 // configuration for enum types is compliant with Section 2.3.1 of the
  828 // UEFI 2.3 Specification. These enum types and enum values are not
  829 // intended to be used. A prefix of '__' is used avoid conflicts with
  830 // other types.
  831 //
  832 typedef enum {
  833   __VerifyUint8EnumValue = 0xff
  834 } __VERIFY_UINT8_ENUM_SIZE;
  835 
  836 typedef enum {
  837   __VerifyUint16EnumValue = 0xffff
  838 } __VERIFY_UINT16_ENUM_SIZE;
  839 
  840 typedef enum {
  841   __VerifyUint32EnumValue = 0xffffffff
  842 } __VERIFY_UINT32_ENUM_SIZE;
  843 
  844 STATIC_ASSERT (sizeof (__VERIFY_UINT8_ENUM_SIZE) == 4, "Size of enum does not meet UEFI Specification Data Type requirements");
  845 STATIC_ASSERT (sizeof (__VERIFY_UINT16_ENUM_SIZE) == 4, "Size of enum does not meet UEFI Specification Data Type requirements");
  846 STATIC_ASSERT (sizeof (__VERIFY_UINT32_ENUM_SIZE) == 4, "Size of enum does not meet UEFI Specification Data Type requirements");
  847 
  848 /**
  849   Macro that returns a pointer to the data structure that contains a specified field of
  850   that data structure.  This is a lightweight method to hide information by placing a
  851   public data structure inside a larger private data structure and using a pointer to
  852   the public data structure to retrieve a pointer to the private data structure.
  853 
  854   This function computes the offset, in bytes, of field specified by Field from the beginning
  855   of the  data structure specified by TYPE.  This offset is subtracted from Record, and is
  856   used to return a pointer to a data structure of the type specified by TYPE. If the data type
  857   specified by TYPE does not contain the field specified by Field, then the module will not compile.
  858 
  859   @param   Record   Pointer to the field specified by Field within a data structure of type TYPE.
  860   @param   TYPE     The name of the data structure type to return.  This data structure must
  861                     contain the field specified by Field.
  862   @param   Field    The name of the field in the data structure specified by TYPE to which Record points.
  863 
  864   @return  A pointer to the structure from one of it's elements.
  865 
  866 **/
  867 #define BASE_CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - OFFSET_OF (TYPE, Field)))
  868 
  869 /**
  870   Rounds a value up to the next boundary using a specified alignment.
  871 
  872   This function rounds Value up to the next boundary using the specified Alignment.
  873   This aligned value is returned.
  874 
  875   @param   Value      The value to round up.
  876   @param   Alignment  The alignment boundary used to return the aligned value.
  877 
  878   @return  A value up to the next boundary.
  879 
  880 **/
  881 #define ALIGN_VALUE(Value, Alignment) ((Value) + (((Alignment) - (Value)) & ((Alignment) - 1)))
  882 
  883 /**
  884   Adjust a pointer by adding the minimum offset required for it to be aligned on
  885   a specified alignment boundary.
  886 
  887   This function rounds the pointer specified by Pointer to the next alignment boundary
  888   specified by Alignment. The pointer to the aligned address is returned.
  889 
  890   @param   Pointer    The pointer to round up.
  891   @param   Alignment  The alignment boundary to use to return an aligned pointer.
  892 
  893   @return  Pointer to the aligned address.
  894 
  895 **/
  896 #define ALIGN_POINTER(Pointer, Alignment) ((VOID *) (ALIGN_VALUE ((UINTN)(Pointer), (Alignment))))
  897 
  898 /**
  899   Rounds a value up to the next natural boundary for the current CPU.
  900   This is 4-bytes for 32-bit CPUs and 8-bytes for 64-bit CPUs.
  901 
  902   This function rounds the value specified by Value up to the next natural boundary for the
  903   current CPU. This rounded value is returned.
  904 
  905   @param   Value      The value to round up.
  906 
  907   @return  Rounded value specified by Value.
  908 
  909 **/
  910 #define ALIGN_VARIABLE(Value)  ALIGN_VALUE ((Value), sizeof (UINTN))
  911 
  912 
  913 /**
  914   Return the maximum of two operands.
  915 
  916   This macro returns the maximum of two operand specified by a and b.
  917   Both a and b must be the same numerical types, signed or unsigned.
  918 
  919   @param   a        The first operand with any numerical type.
  920   @param   b        The second operand. Can be any numerical type as long as is
  921                     the same type as a.
  922 
  923   @return  Maximum of two operands.
  924 
  925 **/
  926 #define MAX(a, b)                       \
  927   (((a) > (b)) ? (a) : (b))
  928 
  929 /**
  930   Return the minimum of two operands.
  931 
  932   This macro returns the minimal of two operand specified by a and b.
  933   Both a and b must be the same numerical types, signed or unsigned.
  934 
  935   @param   a        The first operand with any numerical type.
  936   @param   b        The second operand. It should be the same any numerical type with a.
  937 
  938   @return  Minimum of two operands.
  939 
  940 **/
  941 #define MIN(a, b)                       \
  942   (((a) < (b)) ? (a) : (b))
  943 
  944 /**
  945   Return the absolute value of a signed operand.
  946 
  947   This macro returns the absolute value of the signed operand specified by a.
  948 
  949   @param   a        The signed operand.
  950 
  951   @return  The absolute value of the signed operand.
  952 
  953 **/
  954 #define ABS(a)                          \
  955   (((a) < 0) ? (-(a)) : (a))
  956 
  957 //
  958 // Status codes common to all execution phases
  959 //
  960 typedef UINTN RETURN_STATUS;
  961 
  962 /**
  963   Produces a RETURN_STATUS code with the highest bit set.
  964 
  965   @param  StatusCode    The status code value to convert into a warning code.
  966                         StatusCode must be in the range 0x00000000..0x7FFFFFFF.
  967 
  968   @return The value specified by StatusCode with the highest bit set.
  969 
  970 **/
  971 #define ENCODE_ERROR(StatusCode)     ((RETURN_STATUS)(MAX_BIT | (StatusCode)))
  972 
  973 /**
  974   Produces a RETURN_STATUS code with the highest bit clear.
  975 
  976   @param  StatusCode    The status code value to convert into a warning code.
  977                         StatusCode must be in the range 0x00000000..0x7FFFFFFF.
  978 
  979   @return The value specified by StatusCode with the highest bit clear.
  980 
  981 **/
  982 #define ENCODE_WARNING(StatusCode)   ((RETURN_STATUS)(StatusCode))
  983 
  984 /**
  985   Returns TRUE if a specified RETURN_STATUS code is an error code.
  986 
  987   This function returns TRUE if StatusCode has the high bit set.  Otherwise, FALSE is returned.
  988 
  989   @param  StatusCode    The status code value to evaluate.
  990 
  991   @retval TRUE          The high bit of StatusCode is set.
  992   @retval FALSE         The high bit of StatusCode is clear.
  993 
  994 **/
  995 #define RETURN_ERROR(StatusCode)     (((INTN)(RETURN_STATUS)(StatusCode)) < 0)
  996 
  997 ///
  998 /// The operation completed successfully.
  999 ///
 1000 #define RETURN_SUCCESS               0
 1001 
 1002 ///
 1003 /// The image failed to load.
 1004 ///
 1005 #define RETURN_LOAD_ERROR            ENCODE_ERROR (1)
 1006 
 1007 ///
 1008 /// The parameter was incorrect.
 1009 ///
 1010 #define RETURN_INVALID_PARAMETER     ENCODE_ERROR (2)
 1011 
 1012 ///
 1013 /// The operation is not supported.
 1014 ///
 1015 #define RETURN_UNSUPPORTED           ENCODE_ERROR (3)
 1016 
 1017 ///
 1018 /// The buffer was not the proper size for the request.
 1019 ///
 1020 #define RETURN_BAD_BUFFER_SIZE       ENCODE_ERROR (4)
 1021 
 1022 ///
 1023 /// The buffer was not large enough to hold the requested data.
 1024 /// The required buffer size is returned in the appropriate
 1025 /// parameter when this error occurs.
 1026 ///
 1027 #define RETURN_BUFFER_TOO_SMALL      ENCODE_ERROR (5)
 1028 
 1029 ///
 1030 /// There is no data pending upon return.
 1031 ///
 1032 #define RETURN_NOT_READY             ENCODE_ERROR (6)
 1033 
 1034 ///
 1035 /// The physical device reported an error while attempting the
 1036 /// operation.
 1037 ///
 1038 #define RETURN_DEVICE_ERROR          ENCODE_ERROR (7)
 1039 
 1040 ///
 1041 /// The device can not be written to.
 1042 ///
 1043 #define RETURN_WRITE_PROTECTED       ENCODE_ERROR (8)
 1044 
 1045 ///
 1046 /// The resource has run out.
 1047 ///
 1048 #define RETURN_OUT_OF_RESOURCES      ENCODE_ERROR (9)
 1049 
 1050 ///
 1051 /// An inconsistency was detected on the file system causing the
 1052 /// operation to fail.
 1053 ///
 1054 #define RETURN_VOLUME_CORRUPTED      ENCODE_ERROR (10)
 1055 
 1056 ///
 1057 /// There is no more space on the file system.
 1058 ///
 1059 #define RETURN_VOLUME_FULL           ENCODE_ERROR (11)
 1060 
 1061 ///
 1062 /// The device does not contain any medium to perform the
 1063 /// operation.
 1064 ///
 1065 #define RETURN_NO_MEDIA              ENCODE_ERROR (12)
 1066 
 1067 ///
 1068 /// The medium in the device has changed since the last
 1069 /// access.
 1070 ///
 1071 #define RETURN_MEDIA_CHANGED         ENCODE_ERROR (13)
 1072 
 1073 ///
 1074 /// The item was not found.
 1075 ///
 1076 #define RETURN_NOT_FOUND             ENCODE_ERROR (14)
 1077 
 1078 ///
 1079 /// Access was denied.
 1080 ///
 1081 #define RETURN_ACCESS_DENIED         ENCODE_ERROR (15)
 1082 
 1083 ///
 1084 /// The server was not found or did not respond to the request.
 1085 ///
 1086 #define RETURN_NO_RESPONSE           ENCODE_ERROR (16)
 1087 
 1088 ///
 1089 /// A mapping to the device does not exist.
 1090 ///
 1091 #define RETURN_NO_MAPPING            ENCODE_ERROR (17)
 1092 
 1093 ///
 1094 /// A timeout time expired.
 1095 ///
 1096 #define RETURN_TIMEOUT               ENCODE_ERROR (18)
 1097 
 1098 ///
 1099 /// The protocol has not been started.
 1100 ///
 1101 #define RETURN_NOT_STARTED           ENCODE_ERROR (19)
 1102 
 1103 ///
 1104 /// The protocol has already been started.
 1105 ///
 1106 #define RETURN_ALREADY_STARTED       ENCODE_ERROR (20)
 1107 
 1108 ///
 1109 /// The operation was aborted.
 1110 ///
 1111 #define RETURN_ABORTED               ENCODE_ERROR (21)
 1112 
 1113 ///
 1114 /// An ICMP error occurred during the network operation.
 1115 ///
 1116 #define RETURN_ICMP_ERROR            ENCODE_ERROR (22)
 1117 
 1118 ///
 1119 /// A TFTP error occurred during the network operation.
 1120 ///
 1121 #define RETURN_TFTP_ERROR            ENCODE_ERROR (23)
 1122 
 1123 ///
 1124 /// A protocol error occurred during the network operation.
 1125 ///
 1126 #define RETURN_PROTOCOL_ERROR        ENCODE_ERROR (24)
 1127 
 1128 ///
 1129 /// A function encountered an internal version that was
 1130 /// incompatible with a version requested by the caller.
 1131 ///
 1132 #define RETURN_INCOMPATIBLE_VERSION  ENCODE_ERROR (25)
 1133 
 1134 ///
 1135 /// The function was not performed due to a security violation.
 1136 ///
 1137 #define RETURN_SECURITY_VIOLATION    ENCODE_ERROR (26)
 1138 
 1139 ///
 1140 /// A CRC error was detected.
 1141 ///
 1142 #define RETURN_CRC_ERROR             ENCODE_ERROR (27)
 1143 
 1144 ///
 1145 /// The beginning or end of media was reached.
 1146 ///
 1147 #define RETURN_END_OF_MEDIA          ENCODE_ERROR (28)
 1148 
 1149 ///
 1150 /// The end of the file was reached.
 1151 ///
 1152 #define RETURN_END_OF_FILE           ENCODE_ERROR (31)
 1153 
 1154 ///
 1155 /// The language specified was invalid.
 1156 ///
 1157 #define RETURN_INVALID_LANGUAGE      ENCODE_ERROR (32)
 1158 
 1159 ///
 1160 /// The security status of the data is unknown or compromised
 1161 /// and the data must be updated or replaced to restore a valid
 1162 /// security status.
 1163 ///
 1164 #define RETURN_COMPROMISED_DATA      ENCODE_ERROR (33)
 1165 
 1166 ///
 1167 /// A HTTP error occurred during the network operation.
 1168 ///
 1169 #define RETURN_HTTP_ERROR            ENCODE_ERROR (35)
 1170 
 1171 ///
 1172 /// The string contained one or more characters that
 1173 /// the device could not render and were skipped.
 1174 ///
 1175 #define RETURN_WARN_UNKNOWN_GLYPH    ENCODE_WARNING (1)
 1176 
 1177 ///
 1178 /// The handle was closed, but the file was not deleted.
 1179 ///
 1180 #define RETURN_WARN_DELETE_FAILURE   ENCODE_WARNING (2)
 1181 
 1182 ///
 1183 /// The handle was closed, but the data to the file was not
 1184 /// flushed properly.
 1185 ///
 1186 #define RETURN_WARN_WRITE_FAILURE    ENCODE_WARNING (3)
 1187 
 1188 ///
 1189 /// The resulting buffer was too small, and the data was
 1190 /// truncated to the buffer size.
 1191 ///
 1192 #define RETURN_WARN_BUFFER_TOO_SMALL ENCODE_WARNING (4)
 1193 
 1194 ///
 1195 /// The data has not been updated within the timeframe set by
 1196 /// local policy for this type of data.
 1197 ///
 1198 #define RETURN_WARN_STALE_DATA       ENCODE_WARNING (5)
 1199 
 1200 ///
 1201 /// The resulting buffer contains UEFI-compliant file system.
 1202 ///
 1203 #define RETURN_WARN_FILE_SYSTEM      ENCODE_WARNING (6)
 1204 
 1205 
 1206 /**
 1207   Returns a 16-bit signature built from 2 ASCII characters.
 1208 
 1209   This macro returns a 16-bit value built from the two ASCII characters specified
 1210   by A and B.
 1211 
 1212   @param  A    The first ASCII character.
 1213   @param  B    The second ASCII character.
 1214 
 1215   @return A 16-bit value built from the two ASCII characters specified by A and B.
 1216 
 1217 **/
 1218 #define SIGNATURE_16(A, B)        ((A) | (B << 8))
 1219 
 1220 /**
 1221   Returns a 32-bit signature built from 4 ASCII characters.
 1222 
 1223   This macro returns a 32-bit value built from the four ASCII characters specified
 1224   by A, B, C, and D.
 1225 
 1226   @param  A    The first ASCII character.
 1227   @param  B    The second ASCII character.
 1228   @param  C    The third ASCII character.
 1229   @param  D    The fourth ASCII character.
 1230 
 1231   @return A 32-bit value built from the two ASCII characters specified by A, B,
 1232           C and D.
 1233 
 1234 **/
 1235 #define SIGNATURE_32(A, B, C, D)  (SIGNATURE_16 (A, B) | (SIGNATURE_16 (C, D) << 16))
 1236 
 1237 /**
 1238   Returns a 64-bit signature built from 8 ASCII characters.
 1239 
 1240   This macro returns a 64-bit value built from the eight ASCII characters specified
 1241   by A, B, C, D, E, F, G,and H.
 1242 
 1243   @param  A    The first ASCII character.
 1244   @param  B    The second ASCII character.
 1245   @param  C    The third ASCII character.
 1246   @param  D    The fourth ASCII character.
 1247   @param  E    The fifth ASCII character.
 1248   @param  F    The sixth ASCII character.
 1249   @param  G    The seventh ASCII character.
 1250   @param  H    The eighth ASCII character.
 1251 
 1252   @return A 64-bit value built from the two ASCII characters specified by A, B,
 1253           C, D, E, F, G and H.
 1254 
 1255 **/
 1256 #define SIGNATURE_64(A, B, C, D, E, F, G, H) \
 1257     (SIGNATURE_32 (A, B, C, D) | ((UINT64) (SIGNATURE_32 (E, F, G, H)) << 32))
 1258 
 1259 #if defined(_MSC_EXTENSIONS) && !defined (__INTEL_COMPILER) && !defined (MDE_CPU_EBC)
 1260   void * _ReturnAddress(void);
 1261   #pragma intrinsic(_ReturnAddress)
 1262   /**
 1263     Get the return address of the calling function.
 1264 
 1265     Based on intrinsic function _ReturnAddress that provides the address of
 1266     the instruction in the calling function that will be executed after
 1267     control returns to the caller.
 1268 
 1269     @param L    Return Level.
 1270 
 1271     @return The return address of the calling function or 0 if L != 0.
 1272 
 1273   **/
 1274   #define RETURN_ADDRESS(L)     ((L == 0) ? _ReturnAddress() : (VOID *) 0)
 1275 #elif defined (__GNUC__) || defined (__clang__)
 1276   void * __builtin_return_address (unsigned int level);
 1277   /**
 1278     Get the return address of the calling function.
 1279 
 1280     Based on built-in Function __builtin_return_address that returns
 1281     the return address of the current function, or of one of its callers.
 1282 
 1283     @param L    Return Level.
 1284 
 1285     @return The return address of the calling function.
 1286 
 1287   **/
 1288   #define RETURN_ADDRESS(L)     __builtin_return_address (L)
 1289 #else
 1290   /**
 1291     Get the return address of the calling function.
 1292 
 1293     @param L    Return Level.
 1294 
 1295     @return 0 as compilers don't support this feature.
 1296 
 1297   **/
 1298   #define RETURN_ADDRESS(L)     ((VOID *) 0)
 1299 #endif
 1300 
 1301 /**
 1302   Return the number of elements in an array.
 1303 
 1304   @param  Array  An object of array type. Array is only used as an argument to
 1305                  the sizeof operator, therefore Array is never evaluated. The
 1306                  caller is responsible for ensuring that Array's type is not
 1307                  incomplete; that is, Array must have known constant size.
 1308 
 1309   @return The number of elements in Array. The result has type UINTN.
 1310 
 1311 **/
 1312 #define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
 1313 
 1314 #endif
 1315 

Cache object: 71a51a4c20bb29c62233442ce9a87a5c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.