xref: /freebsd/sys/contrib/edk2/Include/Base.h (revision 72143e89bb430c3b1406b399b810806904f6c882)
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 
1316