Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / efi / Base.h
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 - 2013, Intel Corporation. All rights reserved.<BR>
10 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
11 This program and the accompanying materials
12 are licensed and made available under the terms and conditions of the BSD License
13 which accompanies this distribution.  The full text of the license may be found at
14 http://opensource.org/licenses/bsd-license.php.
15
16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18
19 **/
20
21
22 #ifndef __BASE_H__
23 #define __BASE_H__
24
25 FILE_LICENCE ( BSD3 );
26
27 //
28 // Include processor specific binding
29 //
30 #include <ipxe/efi/ProcessorBind.h>
31
32
33 /**
34   Verifies the storage size of a given data type.
35
36   This macro generates a divide by zero error or a zero size array declaration in
37   the preprocessor if the size is incorrect.  These are declared as "extern" so
38   the space for these arrays will not be in the modules.
39
40   @param  TYPE  The date type to determine the size of.
41   @param  Size  The expected size for the TYPE.
42
43 **/
44 #define VERIFY_SIZE_OF(TYPE, Size) extern UINT8 _VerifySizeof##TYPE[(sizeof(TYPE) == (Size)) / (sizeof(TYPE) == (Size))]
45
46 //
47 // Verify that ProcessorBind.h produced UEFI Data Types that are compliant with
48 // Section 2.3.1 of the UEFI 2.3 Specification.
49 //
50 VERIFY_SIZE_OF (BOOLEAN, 1);
51 VERIFY_SIZE_OF (INT8, 1);
52 VERIFY_SIZE_OF (UINT8, 1);
53 VERIFY_SIZE_OF (INT16, 2);
54 VERIFY_SIZE_OF (UINT16, 2);
55 VERIFY_SIZE_OF (INT32, 4);
56 VERIFY_SIZE_OF (UINT32, 4);
57 VERIFY_SIZE_OF (INT64, 8);
58 VERIFY_SIZE_OF (UINT64, 8);
59 VERIFY_SIZE_OF (CHAR8, 1);
60 VERIFY_SIZE_OF (CHAR16, 2);
61
62 //
63 // The Microsoft* C compiler can removed references to unreferenced data items
64 //  if the /OPT:REF linker option is used. We defined a macro as this is a
65 //  a non standard extension
66 //
67 #if defined(_MSC_EXTENSIONS) && !defined (MDE_CPU_EBC)
68   ///
69   /// Remove global variable from the linked image if there are no references to
70   /// it after all compiler and linker optimizations have been performed.
71   ///
72   ///
73   #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
74 #else
75   ///
76   /// Remove the global variable from the linked image if there are no references
77   ///  to it after all compiler and linker optimizations have been performed.
78   ///
79   ///
80   #define GLOBAL_REMOVE_IF_UNREFERENCED
81 #endif
82
83 //
84 // For symbol name in assembly code, an extra "_" is sometimes necessary
85 //
86
87 ///
88 /// Private worker functions for ASM_PFX()
89 ///
90 #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
91 #define __CONCATENATE(a, b) a ## b
92
93 ///
94 /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
95 /// on symbols in assembly language.
96 ///
97 #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
98
99 #if __APPLE__
100   //
101   // Apple extension that is used by the linker to optimize code size
102   // with assembly functions. Put at the end of your .S files
103   //
104   #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED  .subsections_via_symbols
105 #else
106   #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED
107 #endif
108
109 #ifdef __CC_ARM
110   //
111   // Older RVCT ARM compilers don't fully support #pragma pack and require __packed
112   // as a prefix for the structure.
113   //
114   #define PACKED  __packed
115 #else
116   #define PACKED
117 #endif
118
119 ///
120 /// 128 bit buffer containing a unique identifier value.
121 /// Unless otherwise specified, aligned on a 64 bit boundary.
122 ///
123 typedef struct {
124   UINT32  Data1;
125   UINT16  Data2;
126   UINT16  Data3;
127   UINT8   Data4[8];
128 } GUID;
129
130 //
131 // 8-bytes unsigned value that represents a physical system address.
132 //
133 typedef UINT64 PHYSICAL_ADDRESS;
134
135 ///
136 /// LIST_ENTRY structure definition.
137 ///
138 typedef struct _LIST_ENTRY LIST_ENTRY;
139
140 ///
141 /// _LIST_ENTRY structure definition.
142 ///
143 struct _LIST_ENTRY {
144   LIST_ENTRY  *ForwardLink;
145   LIST_ENTRY  *BackLink;
146 };
147
148 //
149 // Modifiers to abstract standard types to aid in debug of problems
150 //
151
152 ///
153 /// Datum is read-only.
154 ///
155 #define CONST     const
156
157 ///
158 /// Datum is scoped to the current file or function.
159 ///
160 #define STATIC    static
161
162 ///
163 /// Undeclared type.
164 ///
165 #define VOID      void
166
167 //
168 // Modifiers for Data Types used to self document code.
169 // This concept is borrowed for UEFI specification.
170 //
171
172 ///
173 /// Datum is passed to the function.
174 ///
175 #define IN
176
177 ///
178 /// Datum is returned from the function.
179 ///
180 #define OUT
181
182 ///
183 /// Passing the datum to the function is optional, and a NULL
184 /// is passed if the value is not supplied.
185 ///
186 #define OPTIONAL
187
188 //
189 //  UEFI specification claims 1 and 0. We are concerned about the
190 //  complier portability so we did it this way.
191 //
192
193 ///
194 /// Boolean true value.  UEFI Specification defines this value to be 1,
195 /// but this form is more portable.
196 ///
197 #define TRUE  ((BOOLEAN)(1==1))
198
199 ///
200 /// Boolean false value.  UEFI Specification defines this value to be 0,
201 /// but this form is more portable.
202 ///
203 #define FALSE ((BOOLEAN)(0==1))
204
205 ///
206 /// NULL pointer (VOID *)
207 ///
208 #define NULL  ((VOID *) 0)
209
210 ///
211 /// Maximum values for common UEFI Data Types
212 ///
213 #define MAX_INT8    ((INT8)0x7F)
214 #define MAX_UINT8   ((UINT8)0xFF)
215 #define MAX_INT16   ((INT16)0x7FFF)
216 #define MAX_UINT16  ((UINT16)0xFFFF)
217 #define MAX_INT32   ((INT32)0x7FFFFFFF)
218 #define MAX_UINT32  ((UINT32)0xFFFFFFFF)
219 #define MAX_INT64   ((INT64)0x7FFFFFFFFFFFFFFFULL)
220 #define MAX_UINT64  ((UINT64)0xFFFFFFFFFFFFFFFFULL)
221
222 #define  BIT0     0x00000001
223 #define  BIT1     0x00000002
224 #define  BIT2     0x00000004
225 #define  BIT3     0x00000008
226 #define  BIT4     0x00000010
227 #define  BIT5     0x00000020
228 #define  BIT6     0x00000040
229 #define  BIT7     0x00000080
230 #define  BIT8     0x00000100
231 #define  BIT9     0x00000200
232 #define  BIT10    0x00000400
233 #define  BIT11    0x00000800
234 #define  BIT12    0x00001000
235 #define  BIT13    0x00002000
236 #define  BIT14    0x00004000
237 #define  BIT15    0x00008000
238 #define  BIT16    0x00010000
239 #define  BIT17    0x00020000
240 #define  BIT18    0x00040000
241 #define  BIT19    0x00080000
242 #define  BIT20    0x00100000
243 #define  BIT21    0x00200000
244 #define  BIT22    0x00400000
245 #define  BIT23    0x00800000
246 #define  BIT24    0x01000000
247 #define  BIT25    0x02000000
248 #define  BIT26    0x04000000
249 #define  BIT27    0x08000000
250 #define  BIT28    0x10000000
251 #define  BIT29    0x20000000
252 #define  BIT30    0x40000000
253 #define  BIT31    0x80000000
254 #define  BIT32    0x0000000100000000ULL
255 #define  BIT33    0x0000000200000000ULL
256 #define  BIT34    0x0000000400000000ULL
257 #define  BIT35    0x0000000800000000ULL
258 #define  BIT36    0x0000001000000000ULL
259 #define  BIT37    0x0000002000000000ULL
260 #define  BIT38    0x0000004000000000ULL
261 #define  BIT39    0x0000008000000000ULL
262 #define  BIT40    0x0000010000000000ULL
263 #define  BIT41    0x0000020000000000ULL
264 #define  BIT42    0x0000040000000000ULL
265 #define  BIT43    0x0000080000000000ULL
266 #define  BIT44    0x0000100000000000ULL
267 #define  BIT45    0x0000200000000000ULL
268 #define  BIT46    0x0000400000000000ULL
269 #define  BIT47    0x0000800000000000ULL
270 #define  BIT48    0x0001000000000000ULL
271 #define  BIT49    0x0002000000000000ULL
272 #define  BIT50    0x0004000000000000ULL
273 #define  BIT51    0x0008000000000000ULL
274 #define  BIT52    0x0010000000000000ULL
275 #define  BIT53    0x0020000000000000ULL
276 #define  BIT54    0x0040000000000000ULL
277 #define  BIT55    0x0080000000000000ULL
278 #define  BIT56    0x0100000000000000ULL
279 #define  BIT57    0x0200000000000000ULL
280 #define  BIT58    0x0400000000000000ULL
281 #define  BIT59    0x0800000000000000ULL
282 #define  BIT60    0x1000000000000000ULL
283 #define  BIT61    0x2000000000000000ULL
284 #define  BIT62    0x4000000000000000ULL
285 #define  BIT63    0x8000000000000000ULL
286
287 #define  SIZE_1KB    0x00000400
288 #define  SIZE_2KB    0x00000800
289 #define  SIZE_4KB    0x00001000
290 #define  SIZE_8KB    0x00002000
291 #define  SIZE_16KB   0x00004000
292 #define  SIZE_32KB   0x00008000
293 #define  SIZE_64KB   0x00010000
294 #define  SIZE_128KB  0x00020000
295 #define  SIZE_256KB  0x00040000
296 #define  SIZE_512KB  0x00080000
297 #define  SIZE_1MB    0x00100000
298 #define  SIZE_2MB    0x00200000
299 #define  SIZE_4MB    0x00400000
300 #define  SIZE_8MB    0x00800000
301 #define  SIZE_16MB   0x01000000
302 #define  SIZE_32MB   0x02000000
303 #define  SIZE_64MB   0x04000000
304 #define  SIZE_128MB  0x08000000
305 #define  SIZE_256MB  0x10000000
306 #define  SIZE_512MB  0x20000000
307 #define  SIZE_1GB    0x40000000
308 #define  SIZE_2GB    0x80000000
309 #define  SIZE_4GB    0x0000000100000000ULL
310 #define  SIZE_8GB    0x0000000200000000ULL
311 #define  SIZE_16GB   0x0000000400000000ULL
312 #define  SIZE_32GB   0x0000000800000000ULL
313 #define  SIZE_64GB   0x0000001000000000ULL
314 #define  SIZE_128GB  0x0000002000000000ULL
315 #define  SIZE_256GB  0x0000004000000000ULL
316 #define  SIZE_512GB  0x0000008000000000ULL
317 #define  SIZE_1TB    0x0000010000000000ULL
318 #define  SIZE_2TB    0x0000020000000000ULL
319 #define  SIZE_4TB    0x0000040000000000ULL
320 #define  SIZE_8TB    0x0000080000000000ULL
321 #define  SIZE_16TB   0x0000100000000000ULL
322 #define  SIZE_32TB   0x0000200000000000ULL
323 #define  SIZE_64TB   0x0000400000000000ULL
324 #define  SIZE_128TB  0x0000800000000000ULL
325 #define  SIZE_256TB  0x0001000000000000ULL
326 #define  SIZE_512TB  0x0002000000000000ULL
327 #define  SIZE_1PB    0x0004000000000000ULL
328 #define  SIZE_2PB    0x0008000000000000ULL
329 #define  SIZE_4PB    0x0010000000000000ULL
330 #define  SIZE_8PB    0x0020000000000000ULL
331 #define  SIZE_16PB   0x0040000000000000ULL
332 #define  SIZE_32PB   0x0080000000000000ULL
333 #define  SIZE_64PB   0x0100000000000000ULL
334 #define  SIZE_128PB  0x0200000000000000ULL
335 #define  SIZE_256PB  0x0400000000000000ULL
336 #define  SIZE_512PB  0x0800000000000000ULL
337 #define  SIZE_1EB    0x1000000000000000ULL
338 #define  SIZE_2EB    0x2000000000000000ULL
339 #define  SIZE_4EB    0x4000000000000000ULL
340 #define  SIZE_8EB    0x8000000000000000ULL
341
342 #define  BASE_1KB    0x00000400
343 #define  BASE_2KB    0x00000800
344 #define  BASE_4KB    0x00001000
345 #define  BASE_8KB    0x00002000
346 #define  BASE_16KB   0x00004000
347 #define  BASE_32KB   0x00008000
348 #define  BASE_64KB   0x00010000
349 #define  BASE_128KB  0x00020000
350 #define  BASE_256KB  0x00040000
351 #define  BASE_512KB  0x00080000
352 #define  BASE_1MB    0x00100000
353 #define  BASE_2MB    0x00200000
354 #define  BASE_4MB    0x00400000
355 #define  BASE_8MB    0x00800000
356 #define  BASE_16MB   0x01000000
357 #define  BASE_32MB   0x02000000
358 #define  BASE_64MB   0x04000000
359 #define  BASE_128MB  0x08000000
360 #define  BASE_256MB  0x10000000
361 #define  BASE_512MB  0x20000000
362 #define  BASE_1GB    0x40000000
363 #define  BASE_2GB    0x80000000
364 #define  BASE_4GB    0x0000000100000000ULL
365 #define  BASE_8GB    0x0000000200000000ULL
366 #define  BASE_16GB   0x0000000400000000ULL
367 #define  BASE_32GB   0x0000000800000000ULL
368 #define  BASE_64GB   0x0000001000000000ULL
369 #define  BASE_128GB  0x0000002000000000ULL
370 #define  BASE_256GB  0x0000004000000000ULL
371 #define  BASE_512GB  0x0000008000000000ULL
372 #define  BASE_1TB    0x0000010000000000ULL
373 #define  BASE_2TB    0x0000020000000000ULL
374 #define  BASE_4TB    0x0000040000000000ULL
375 #define  BASE_8TB    0x0000080000000000ULL
376 #define  BASE_16TB   0x0000100000000000ULL
377 #define  BASE_32TB   0x0000200000000000ULL
378 #define  BASE_64TB   0x0000400000000000ULL
379 #define  BASE_128TB  0x0000800000000000ULL
380 #define  BASE_256TB  0x0001000000000000ULL
381 #define  BASE_512TB  0x0002000000000000ULL
382 #define  BASE_1PB    0x0004000000000000ULL
383 #define  BASE_2PB    0x0008000000000000ULL
384 #define  BASE_4PB    0x0010000000000000ULL
385 #define  BASE_8PB    0x0020000000000000ULL
386 #define  BASE_16PB   0x0040000000000000ULL
387 #define  BASE_32PB   0x0080000000000000ULL
388 #define  BASE_64PB   0x0100000000000000ULL
389 #define  BASE_128PB  0x0200000000000000ULL
390 #define  BASE_256PB  0x0400000000000000ULL
391 #define  BASE_512PB  0x0800000000000000ULL
392 #define  BASE_1EB    0x1000000000000000ULL
393 #define  BASE_2EB    0x2000000000000000ULL
394 #define  BASE_4EB    0x4000000000000000ULL
395 #define  BASE_8EB    0x8000000000000000ULL
396
397 //
398 //  Support for variable length argument lists using the ANSI standard.
399 //
400 //  Since we are using the ANSI standard we used the standard naming and
401 //  did not follow the coding convention
402 //
403 //  VA_LIST  - typedef for argument list.
404 //  VA_START (VA_LIST Marker, argument before the ...) - Init Marker for use.
405 //  VA_END (VA_LIST Marker) - Clear Marker
406 //  VA_ARG (VA_LIST Marker, var arg size) - Use Marker to get an argument from
407 //    the ... list. You must know the size and pass it in this macro.
408 //  VA_COPY (VA_LIST Dest, VA_LIST Start) - Initialize Dest as a copy of Start.
409 //
410 //  example:
411 //
412 //  UINTN
413 //  ExampleVarArg (
414 //    IN UINTN  NumberOfArgs,
415 //    ...
416 //    )
417 //  {
418 //    VA_LIST Marker;
419 //    UINTN   Index;
420 //    UINTN   Result;
421 //
422 //    //
423 //    // Initialize the Marker
424 //    //
425 //    VA_START (Marker, NumberOfArgs);
426 //    for (Index = 0, Result = 0; Index < NumberOfArgs; Index++) {
427 //      //
428 //      // The ... list is a series of UINTN values, so average them up.
429 //      //
430 //      Result += VA_ARG (Marker, UINTN);
431 //    }
432 //
433 //    VA_END (Marker);
434 //    return Result
435 //  }
436 //
437
438 /**
439   Return the size of argument that has been aligned to sizeof (UINTN).
440
441   @param  n    The parameter size to be aligned.
442
443   @return The aligned size.
444 **/
445 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
446
447 #if defined(__CC_ARM)
448 //
449 // RVCT ARM variable argument list support.
450 //
451
452 ///
453 /// Variable used to traverse the list of arguments. This type can vary by
454 /// implementation and could be an array or structure.
455 ///
456 #ifdef __APCS_ADSABI
457   typedef int         *va_list[1];
458   #define VA_LIST     va_list
459 #else
460   typedef struct __va_list { void *__ap; } va_list;
461   #define VA_LIST                          va_list
462 #endif
463
464 #define VA_START(Marker, Parameter)   __va_start(Marker, Parameter)
465
466 #define VA_ARG(Marker, TYPE)          __va_arg(Marker, TYPE)
467
468 #define VA_END(Marker)                ((void)0)
469
470 // For some ARM RVCT compilers, __va_copy is not defined
471 #ifndef __va_copy
472   #define __va_copy(dest, src) ((void)((dest) = (src)))
473 #endif
474
475 #define VA_COPY(Dest, Start)          __va_copy (Dest, Start)
476
477 #elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS)
478 //
479 // Use GCC built-in macros for variable argument lists.
480 //
481
482 ///
483 /// Variable used to traverse the list of arguments. This type can vary by
484 /// implementation and could be an array or structure.
485 ///
486 typedef __builtin_va_list VA_LIST;
487
488 #define VA_START(Marker, Parameter)  __builtin_va_start (Marker, Parameter)
489
490 #define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ? (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, TYPE)))
491
492 #define VA_END(Marker)               __builtin_va_end (Marker)
493
494 #define VA_COPY(Dest, Start)         __builtin_va_copy (Dest, Start)
495
496 #else
497 ///
498 /// Variable used to traverse the list of arguments. This type can vary by
499 /// implementation and could be an array or structure.
500 ///
501 typedef CHAR8 *VA_LIST;
502
503 /**
504   Retrieves a pointer to the beginning of a variable argument list, based on
505   the name of the parameter that immediately precedes the variable argument list.
506
507   This function initializes Marker to point to the beginning of the variable
508   argument list that immediately follows Parameter.  The method for computing the
509   pointer to the next argument in the argument list is CPU-specific following the
510   EFIAPI ABI.
511
512   @param   Marker       The VA_LIST used to traverse the list of arguments.
513   @param   Parameter    The name of the parameter that immediately precedes
514                         the variable argument list.
515
516   @return  A pointer to the beginning of a variable argument list.
517
518 **/
519 #define VA_START(Marker, Parameter) (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF (Parameter)))
520
521 /**
522   Returns an argument of a specified type from a variable argument list and updates
523   the pointer to the variable argument list to point to the next argument.
524
525   This function returns an argument of the type specified by TYPE from the beginning
526   of the variable argument list specified by Marker.  Marker is then updated to point
527   to the next argument in the variable argument list.  The method for computing the
528   pointer to the next argument in the argument list is CPU-specific following the EFIAPI ABI.
529
530   @param   Marker   VA_LIST used to traverse the list of arguments.
531   @param   TYPE     The type of argument to retrieve from the beginning
532                     of the variable argument list.
533
534   @return  An argument of the type specified by TYPE.
535
536 **/
537 #define VA_ARG(Marker, TYPE)   (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))
538
539 /**
540   Terminates the use of a variable argument list.
541
542   This function initializes Marker so it can no longer be used with VA_ARG().
543   After this macro is used, the only way to access the variable argument list is
544   by using VA_START() again.
545
546   @param   Marker   VA_LIST used to traverse the list of arguments.
547
548 **/
549 #define VA_END(Marker)      (Marker = (VA_LIST) 0)
550
551 /**
552   Initializes a VA_LIST as a copy of an existing VA_LIST.
553
554   This macro initializes Dest as a copy of Start, as if the VA_START macro had been applied to Dest
555   followed by the same sequence of uses of the VA_ARG macro as had previously been used to reach
556   the present state of Start.
557
558   @param   Dest   VA_LIST used to traverse the list of arguments.
559   @param   Start  VA_LIST used to traverse the list of arguments.
560
561 **/
562 #define VA_COPY(Dest, Start)  ((void)((Dest) = (Start)))
563
564 #endif
565
566 ///
567 /// Pointer to the start of a variable argument list stored in a memory buffer. Same as UINT8 *.
568 ///
569 typedef UINTN  *BASE_LIST;
570
571 /**
572   Returns the size of a data type in sizeof(UINTN) units rounded up to the nearest UINTN boundary.
573
574   @param  TYPE  The date type to determine the size of.
575
576   @return The size of TYPE in sizeof (UINTN) units rounded up to the nearest UINTN boundary.
577 **/
578 #define _BASE_INT_SIZE_OF(TYPE) ((sizeof (TYPE) + sizeof (UINTN) - 1) / sizeof (UINTN))
579
580 /**
581   Returns an argument of a specified type from a variable argument list and updates
582   the pointer to the variable argument list to point to the next argument.
583
584   This function returns an argument of the type specified by TYPE from the beginning
585   of the variable argument list specified by Marker.  Marker is then updated to point
586   to the next argument in the variable argument list.  The method for computing the
587   pointer to the next argument in the argument list is CPU specific following the EFIAPI ABI.
588
589   @param   Marker   The pointer to the beginning of a variable argument list.
590   @param   TYPE     The type of argument to retrieve from the beginning
591                     of the variable argument list.
592
593   @return  An argument of the type specified by TYPE.
594
595 **/
596 #define BASE_ARG(Marker, TYPE)   (*(TYPE *) ((Marker += _BASE_INT_SIZE_OF (TYPE)) - _BASE_INT_SIZE_OF (TYPE)))
597
598 /**
599   The macro that returns the byte offset of a field in a data structure.
600
601   This function returns the offset, in bytes, of field specified by Field from the
602   beginning of the  data structure specified by TYPE. If TYPE does not contain Field,
603   the module will not compile.
604
605   @param   TYPE     The name of the data structure that contains the field specified by Field.
606   @param   Field    The name of the field in the data structure.
607
608   @return  Offset, in bytes, of field.
609
610 **/
611 #ifdef __GNUC__
612 #if __GNUC__ >= 4
613 #define OFFSET_OF(TYPE, Field) ((UINTN) __builtin_offsetof(TYPE, Field))
614 #endif
615 #endif
616
617 #ifndef OFFSET_OF
618 #define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field))
619 #endif
620
621 /**
622   Macro that returns a pointer to the data structure that contains a specified field of
623   that data structure.  This is a lightweight method to hide information by placing a
624   public data structure inside a larger private data structure and using a pointer to
625   the public data structure to retrieve a pointer to the private data structure.
626
627   This function computes the offset, in bytes, of field specified by Field from the beginning
628   of the  data structure specified by TYPE.  This offset is subtracted from Record, and is
629   used to return a pointer to a data structure of the type specified by TYPE. If the data type
630   specified by TYPE does not contain the field specified by Field, then the module will not compile.
631
632   @param   Record   Pointer to the field specified by Field within a data structure of type TYPE.
633   @param   TYPE     The name of the data structure type to return.  This data structure must
634                     contain the field specified by Field.
635   @param   Field    The name of the field in the data structure specified by TYPE to which Record points.
636
637   @return  A pointer to the structure from one of it's elements.
638
639 **/
640 #define BASE_CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
641
642 /**
643   Rounds a value up to the next boundary using a specified alignment.
644
645   This function rounds Value up to the next boundary using the specified Alignment.
646   This aligned value is returned.
647
648   @param   Value      The value to round up.
649   @param   Alignment  The alignment boundary used to return the aligned value.
650
651   @return  A value up to the next boundary.
652
653 **/
654 #define ALIGN_VALUE(Value, Alignment) ((Value) + (((Alignment) - (Value)) & ((Alignment) - 1)))
655
656 /**
657   Adjust a pointer by adding the minimum offset required for it to be aligned on
658   a specified alignment boundary.
659
660   This function rounds the pointer specified by Pointer to the next alignment boundary
661   specified by Alignment. The pointer to the aligned address is returned.
662
663   @param   Pointer    The pointer to round up.
664   @param   Alignment  The alignment boundary to use to return an aligned pointer.
665
666   @return  Pointer to the aligned address.
667
668 **/
669 #define ALIGN_POINTER(Pointer, Alignment) ((VOID *) (ALIGN_VALUE ((UINTN)(Pointer), (Alignment))))
670
671 /**
672   Rounds a value up to the next natural boundary for the current CPU.
673   This is 4-bytes for 32-bit CPUs and 8-bytes for 64-bit CPUs.
674
675   This function rounds the value specified by Value up to the next natural boundary for the
676   current CPU. This rounded value is returned.
677
678   @param   Value      The value to round up.
679
680   @return  Rounded value specified by Value.
681
682 **/
683 #define ALIGN_VARIABLE(Value)  ALIGN_VALUE ((Value), sizeof (UINTN))
684
685
686 /**
687   Return the maximum of two operands.
688
689   This macro returns the maximum of two operand specified by a and b.
690   Both a and b must be the same numerical types, signed or unsigned.
691
692   @param   a        The first operand with any numerical type.
693   @param   b        The second operand. Can be any numerical type as long as is
694                     the same type as a.
695
696   @return  Maximum of two operands.
697
698 **/
699 #define MAX(a, b)                       \
700   (((a) > (b)) ? (a) : (b))
701
702 /**
703   Return the minimum of two operands.
704
705   This macro returns the minimal of two operand specified by a and b.
706   Both a and b must be the same numerical types, signed or unsigned.
707
708   @param   a        The first operand with any numerical type.
709   @param   b        The second operand. It should be the same any numerical type with a.
710
711   @return  Minimum of two operands.
712
713 **/
714 #define MIN(a, b)                       \
715   (((a) < (b)) ? (a) : (b))
716
717 /**
718   Return the absolute value of a signed operand.
719
720   This macro returns the absolute value of the signed operand specified by a.
721
722   @param   a        The signed operand.
723
724   @return  The absolute value of the signed operand.
725
726 **/
727 #define ABS(a)                          \
728   (((a) < 0) ? (-(a)) : (a))
729
730 //
731 // Status codes common to all execution phases
732 //
733 typedef UINTN RETURN_STATUS;
734
735 /**
736   Produces a RETURN_STATUS code with the highest bit set.
737
738   @param  StatusCode    The status code value to convert into a warning code.
739                         StatusCode must be in the range 0x00000000..0x7FFFFFFF.
740
741   @return The value specified by StatusCode with the highest bit set.
742
743 **/
744 #define ENCODE_ERROR(StatusCode)     ((RETURN_STATUS)(MAX_BIT | (StatusCode)))
745
746 /**
747   Produces a RETURN_STATUS code with the highest bit clear.
748
749   @param  StatusCode    The status code value to convert into a warning code.
750                         StatusCode must be in the range 0x00000000..0x7FFFFFFF.
751
752   @return The value specified by StatusCode with the highest bit clear.
753
754 **/
755 #define ENCODE_WARNING(StatusCode)   ((RETURN_STATUS)(StatusCode))
756
757 /**
758   Returns TRUE if a specified RETURN_STATUS code is an error code.
759
760   This function returns TRUE if StatusCode has the high bit set.  Otherwise, FALSE is returned.
761
762   @param  StatusCode    The status code value to evaluate.
763
764   @retval TRUE          The high bit of StatusCode is set.
765   @retval FALSE         The high bit of StatusCode is clear.
766
767 **/
768 #define RETURN_ERROR(StatusCode)     (((INTN)(RETURN_STATUS)(StatusCode)) < 0)
769
770 ///
771 /// The operation completed successfully.
772 ///
773 #define RETURN_SUCCESS               0
774
775 ///
776 /// The image failed to load.
777 ///
778 #define RETURN_LOAD_ERROR            ENCODE_ERROR (1)
779
780 ///
781 /// The parameter was incorrect.
782 ///
783 #define RETURN_INVALID_PARAMETER     ENCODE_ERROR (2)
784
785 ///
786 /// The operation is not supported.
787 ///
788 #define RETURN_UNSUPPORTED           ENCODE_ERROR (3)
789
790 ///
791 /// The buffer was not the proper size for the request.
792 ///
793 #define RETURN_BAD_BUFFER_SIZE       ENCODE_ERROR (4)
794
795 ///
796 /// The buffer was not large enough to hold the requested data.
797 /// The required buffer size is returned in the appropriate
798 /// parameter when this error occurs.
799 ///
800 #define RETURN_BUFFER_TOO_SMALL      ENCODE_ERROR (5)
801
802 ///
803 /// There is no data pending upon return.
804 ///
805 #define RETURN_NOT_READY             ENCODE_ERROR (6)
806
807 ///
808 /// The physical device reported an error while attempting the
809 /// operation.
810 ///
811 #define RETURN_DEVICE_ERROR          ENCODE_ERROR (7)
812
813 ///
814 /// The device can not be written to.
815 ///
816 #define RETURN_WRITE_PROTECTED       ENCODE_ERROR (8)
817
818 ///
819 /// The resource has run out.
820 ///
821 #define RETURN_OUT_OF_RESOURCES      ENCODE_ERROR (9)
822
823 ///
824 /// An inconsistency was detected on the file system causing the
825 /// operation to fail.
826 ///
827 #define RETURN_VOLUME_CORRUPTED      ENCODE_ERROR (10)
828
829 ///
830 /// There is no more space on the file system.
831 ///
832 #define RETURN_VOLUME_FULL           ENCODE_ERROR (11)
833
834 ///
835 /// The device does not contain any medium to perform the
836 /// operation.
837 ///
838 #define RETURN_NO_MEDIA              ENCODE_ERROR (12)
839
840 ///
841 /// The medium in the device has changed since the last
842 /// access.
843 ///
844 #define RETURN_MEDIA_CHANGED         ENCODE_ERROR (13)
845
846 ///
847 /// The item was not found.
848 ///
849 #define RETURN_NOT_FOUND             ENCODE_ERROR (14)
850
851 ///
852 /// Access was denied.
853 ///
854 #define RETURN_ACCESS_DENIED         ENCODE_ERROR (15)
855
856 ///
857 /// The server was not found or did not respond to the request.
858 ///
859 #define RETURN_NO_RESPONSE           ENCODE_ERROR (16)
860
861 ///
862 /// A mapping to the device does not exist.
863 ///
864 #define RETURN_NO_MAPPING            ENCODE_ERROR (17)
865
866 ///
867 /// A timeout time expired.
868 ///
869 #define RETURN_TIMEOUT               ENCODE_ERROR (18)
870
871 ///
872 /// The protocol has not been started.
873 ///
874 #define RETURN_NOT_STARTED           ENCODE_ERROR (19)
875
876 ///
877 /// The protocol has already been started.
878 ///
879 #define RETURN_ALREADY_STARTED       ENCODE_ERROR (20)
880
881 ///
882 /// The operation was aborted.
883 ///
884 #define RETURN_ABORTED               ENCODE_ERROR (21)
885
886 ///
887 /// An ICMP error occurred during the network operation.
888 ///
889 #define RETURN_ICMP_ERROR            ENCODE_ERROR (22)
890
891 ///
892 /// A TFTP error occurred during the network operation.
893 ///
894 #define RETURN_TFTP_ERROR            ENCODE_ERROR (23)
895
896 ///
897 /// A protocol error occurred during the network operation.
898 ///
899 #define RETURN_PROTOCOL_ERROR        ENCODE_ERROR (24)
900
901 ///
902 /// A function encountered an internal version that was
903 /// incompatible with a version requested by the caller.
904 ///
905 #define RETURN_INCOMPATIBLE_VERSION  ENCODE_ERROR (25)
906
907 ///
908 /// The function was not performed due to a security violation.
909 ///
910 #define RETURN_SECURITY_VIOLATION    ENCODE_ERROR (26)
911
912 ///
913 /// A CRC error was detected.
914 ///
915 #define RETURN_CRC_ERROR             ENCODE_ERROR (27)
916
917 ///
918 /// The beginning or end of media was reached.
919 ///
920 #define RETURN_END_OF_MEDIA          ENCODE_ERROR (28)
921
922 ///
923 /// The end of the file was reached.
924 ///
925 #define RETURN_END_OF_FILE           ENCODE_ERROR (31)
926
927 ///
928 /// The language specified was invalid.
929 ///
930 #define RETURN_INVALID_LANGUAGE      ENCODE_ERROR (32)
931
932 ///
933 /// The security status of the data is unknown or compromised
934 /// and the data must be updated or replaced to restore a valid
935 /// security status.
936 ///
937 #define RETURN_COMPROMISED_DATA      ENCODE_ERROR (33)
938
939 ///
940 /// The string contained one or more characters that
941 /// the device could not render and were skipped.
942 ///
943 #define RETURN_WARN_UNKNOWN_GLYPH    ENCODE_WARNING (1)
944
945 ///
946 /// The handle was closed, but the file was not deleted.
947 ///
948 #define RETURN_WARN_DELETE_FAILURE   ENCODE_WARNING (2)
949
950 ///
951 /// The handle was closed, but the data to the file was not
952 /// flushed properly.
953 ///
954 #define RETURN_WARN_WRITE_FAILURE    ENCODE_WARNING (3)
955
956 ///
957 /// The resulting buffer was too small, and the data was
958 /// truncated to the buffer size.
959 ///
960 #define RETURN_WARN_BUFFER_TOO_SMALL ENCODE_WARNING (4)
961
962 ///
963 /// The data has not been updated within the timeframe set by
964 /// local policy for this type of data.
965 ///
966 #define RETURN_WARN_STALE_DATA       ENCODE_WARNING (5)
967
968 /**
969   Returns a 16-bit signature built from 2 ASCII characters.
970
971   This macro returns a 16-bit value built from the two ASCII characters specified
972   by A and B.
973
974   @param  A    The first ASCII character.
975   @param  B    The second ASCII character.
976
977   @return A 16-bit value built from the two ASCII characters specified by A and B.
978
979 **/
980 #define SIGNATURE_16(A, B)        ((A) | (B << 8))
981
982 /**
983   Returns a 32-bit signature built from 4 ASCII characters.
984
985   This macro returns a 32-bit value built from the four ASCII characters specified
986   by A, B, C, and D.
987
988   @param  A    The first ASCII character.
989   @param  B    The second ASCII character.
990   @param  C    The third ASCII character.
991   @param  D    The fourth ASCII character.
992
993   @return A 32-bit value built from the two ASCII characters specified by A, B,
994           C and D.
995
996 **/
997 #define SIGNATURE_32(A, B, C, D)  (SIGNATURE_16 (A, B) | (SIGNATURE_16 (C, D) << 16))
998
999 /**
1000   Returns a 64-bit signature built from 8 ASCII characters.
1001
1002   This macro returns a 64-bit value built from the eight ASCII characters specified
1003   by A, B, C, D, E, F, G,and H.
1004
1005   @param  A    The first ASCII character.
1006   @param  B    The second ASCII character.
1007   @param  C    The third ASCII character.
1008   @param  D    The fourth ASCII character.
1009   @param  E    The fifth ASCII character.
1010   @param  F    The sixth ASCII character.
1011   @param  G    The seventh ASCII character.
1012   @param  H    The eighth ASCII character.
1013
1014   @return A 64-bit value built from the two ASCII characters specified by A, B,
1015           C, D, E, F, G and H.
1016
1017 **/
1018 #define SIGNATURE_64(A, B, C, D, E, F, G, H) \
1019     (SIGNATURE_32 (A, B, C, D) | ((UINT64) (SIGNATURE_32 (E, F, G, H)) << 32))
1020
1021 #endif
1022