ReactOS  0.4.15-dev-489-g75a0787
Base.h
Go to the documentation of this file.
1 
22 #ifndef __BASE_H__
23 #define __BASE_H__
24 
25 //
26 // Include processor specific binding
27 //
28 #include <ProcessorBind.h>
29 
41 #define VERIFY_SIZE_OF(TYPE, Size) extern UINT8 _VerifySizeof##TYPE[(sizeof(TYPE) == (Size)) / (sizeof(TYPE) == (Size))]
42 
43 //
44 // Verify that ProcessorBind.h produced UEFI Data Types that are compliant with
45 // Section 2.3.1 of the UEFI 2.3 Specification.
46 //
58 
59 //
60 // The Microsoft* C compiler can removed references to unreferenced data items
61 // if the /OPT:REF linker option is used. We defined a macro as this is a
62 // a non standard extension
63 //
64 #if defined(_MSC_EXTENSIONS) && !defined (MDE_CPU_EBC)
65 #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
71 #else
72 #define GLOBAL_REMOVE_IF_UNREFERENCED
78 #endif
79 
80 //
81 // For symbol name in GNU assembly code, an extra "_" is necessary
82 //
83 #if defined(__GNUC__)
84 #define _CONCATENATE(a, b) __CONCATENATE(a, b)
88 #define __CONCATENATE(a, b) a ## b
89 
94 #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
95 #endif
96 
97 #if __APPLE__
98 //
99 // Apple extension that is used by the linker to optimize code size
100 // with assembly functions. Put at the end of your .S files
101 //
102 #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED .subsections_via_symbols
103 #else
104 #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED
105 #endif
106 
107 #ifdef __CC_ARM
108 //
109 // Older RVCT ARM compilers don't fully support #pragma pack and require __packed
110 // as a prefix for the structure.
111 //
112 #define PACKED __packed
113 #else
114 #define PACKED
115 #endif
116 
117 #if 0
118 typedef struct {
123  UINT32 Data1;
124  UINT16 Data2;
125  UINT16 Data3;
126  UINT8 Data4[8];
127 } GUID;
128 
129 //
130 // 8-bytes unsigned value that represents a physical system address.
131 //
132 typedef UINT64 PHYSICAL_ADDRESS;
133 
137 typedef struct _LIST_ENTRY LIST_ENTRY;
138 
142 struct _LIST_ENTRY {
143  LIST_ENTRY *ForwardLink;
144  LIST_ENTRY *BackLink;
145 };
146 
147 //
148 // Modifiers to abstract standard types to aid in debug of problems
149 //
150 
154 #define CONST const
155 
159 #define STATIC static
160 
164 #define VOID void
165 
166 //
167 // Modifiers for Data Types used to self document code.
168 // This concept is borrowed for UEFI specification.
169 //
170 
174 #define IN
175 
179 #define OUT
180 
185 #define OPTIONAL
186 
187 //
188 // UEFI specification claims 1 and 0. We are concerned about the
189 // complier portability so we did it this way.
190 //
191 
196 #define TRUE ((BOOLEAN)(1==1))
197 
202 #define FALSE ((BOOLEAN)(0==1))
203 
207 #define NULL ((VOID *) 0)
208 #endif
209 
210 #define BIT0 0x00000001
211 #define BIT1 0x00000002
212 #define BIT2 0x00000004
213 #define BIT3 0x00000008
214 #define BIT4 0x00000010
215 #define BIT5 0x00000020
216 #define BIT6 0x00000040
217 #define BIT7 0x00000080
218 #define BIT8 0x00000100
219 #define BIT9 0x00000200
220 #define BIT10 0x00000400
221 #define BIT11 0x00000800
222 #define BIT12 0x00001000
223 #define BIT13 0x00002000
224 #define BIT14 0x00004000
225 #define BIT15 0x00008000
226 #define BIT16 0x00010000
227 #define BIT17 0x00020000
228 #define BIT18 0x00040000
229 #define BIT19 0x00080000
230 #define BIT20 0x00100000
231 #define BIT21 0x00200000
232 #define BIT22 0x00400000
233 #define BIT23 0x00800000
234 #define BIT24 0x01000000
235 #define BIT25 0x02000000
236 #define BIT26 0x04000000
237 #define BIT27 0x08000000
238 #define BIT28 0x10000000
239 #define BIT29 0x20000000
240 #define BIT30 0x40000000
241 #define BIT31 0x80000000
242 #define BIT32 0x0000000100000000ULL
243 #define BIT33 0x0000000200000000ULL
244 #define BIT34 0x0000000400000000ULL
245 #define BIT35 0x0000000800000000ULL
246 #define BIT36 0x0000001000000000ULL
247 #define BIT37 0x0000002000000000ULL
248 #define BIT38 0x0000004000000000ULL
249 #define BIT39 0x0000008000000000ULL
250 #define BIT40 0x0000010000000000ULL
251 #define BIT41 0x0000020000000000ULL
252 #define BIT42 0x0000040000000000ULL
253 #define BIT43 0x0000080000000000ULL
254 #define BIT44 0x0000100000000000ULL
255 #define BIT45 0x0000200000000000ULL
256 #define BIT46 0x0000400000000000ULL
257 #define BIT47 0x0000800000000000ULL
258 #define BIT48 0x0001000000000000ULL
259 #define BIT49 0x0002000000000000ULL
260 #define BIT50 0x0004000000000000ULL
261 #define BIT51 0x0008000000000000ULL
262 #define BIT52 0x0010000000000000ULL
263 #define BIT53 0x0020000000000000ULL
264 #define BIT54 0x0040000000000000ULL
265 #define BIT55 0x0080000000000000ULL
266 #define BIT56 0x0100000000000000ULL
267 #define BIT57 0x0200000000000000ULL
268 #define BIT58 0x0400000000000000ULL
269 #define BIT59 0x0800000000000000ULL
270 #define BIT60 0x1000000000000000ULL
271 #define BIT61 0x2000000000000000ULL
272 #define BIT62 0x4000000000000000ULL
273 #define BIT63 0x8000000000000000ULL
274 
275 #define SIZE_1KB 0x00000400
276 #define SIZE_2KB 0x00000800
277 #define SIZE_4KB 0x00001000
278 #define SIZE_8KB 0x00002000
279 #define SIZE_16KB 0x00004000
280 #define SIZE_32KB 0x00008000
281 #define SIZE_64KB 0x00010000
282 #define SIZE_128KB 0x00020000
283 #define SIZE_256KB 0x00040000
284 #define SIZE_512KB 0x00080000
285 #define SIZE_1MB 0x00100000
286 #define SIZE_2MB 0x00200000
287 #define SIZE_4MB 0x00400000
288 #define SIZE_8MB 0x00800000
289 #define SIZE_16MB 0x01000000
290 #define SIZE_32MB 0x02000000
291 #define SIZE_64MB 0x04000000
292 #define SIZE_128MB 0x08000000
293 #define SIZE_256MB 0x10000000
294 #define SIZE_512MB 0x20000000
295 #define SIZE_1GB 0x40000000
296 #define SIZE_2GB 0x80000000
297 #define SIZE_4GB 0x0000000100000000ULL
298 #define SIZE_8GB 0x0000000200000000ULL
299 #define SIZE_16GB 0x0000000400000000ULL
300 #define SIZE_32GB 0x0000000800000000ULL
301 #define SIZE_64GB 0x0000001000000000ULL
302 #define SIZE_128GB 0x0000002000000000ULL
303 #define SIZE_256GB 0x0000004000000000ULL
304 #define SIZE_512GB 0x0000008000000000ULL
305 #define SIZE_1TB 0x0000010000000000ULL
306 #define SIZE_2TB 0x0000020000000000ULL
307 #define SIZE_4TB 0x0000040000000000ULL
308 #define SIZE_8TB 0x0000080000000000ULL
309 #define SIZE_16TB 0x0000100000000000ULL
310 #define SIZE_32TB 0x0000200000000000ULL
311 #define SIZE_64TB 0x0000400000000000ULL
312 #define SIZE_128TB 0x0000800000000000ULL
313 #define SIZE_256TB 0x0001000000000000ULL
314 #define SIZE_512TB 0x0002000000000000ULL
315 #define SIZE_1PB 0x0004000000000000ULL
316 #define SIZE_2PB 0x0008000000000000ULL
317 #define SIZE_4PB 0x0010000000000000ULL
318 #define SIZE_8PB 0x0020000000000000ULL
319 #define SIZE_16PB 0x0040000000000000ULL
320 #define SIZE_32PB 0x0080000000000000ULL
321 #define SIZE_64PB 0x0100000000000000ULL
322 #define SIZE_128PB 0x0200000000000000ULL
323 #define SIZE_256PB 0x0400000000000000ULL
324 #define SIZE_512PB 0x0800000000000000ULL
325 #define SIZE_1EB 0x1000000000000000ULL
326 #define SIZE_2EB 0x2000000000000000ULL
327 #define SIZE_4EB 0x4000000000000000ULL
328 #define SIZE_8EB 0x8000000000000000ULL
329 
330 #define BASE_1KB 0x00000400
331 #define BASE_2KB 0x00000800
332 #define BASE_4KB 0x00001000
333 #define BASE_8KB 0x00002000
334 #define BASE_16KB 0x00004000
335 #define BASE_32KB 0x00008000
336 #define BASE_64KB 0x00010000
337 #define BASE_128KB 0x00020000
338 #define BASE_256KB 0x00040000
339 #define BASE_512KB 0x00080000
340 #define BASE_1MB 0x00100000
341 #define BASE_2MB 0x00200000
342 #define BASE_4MB 0x00400000
343 #define BASE_8MB 0x00800000
344 #define BASE_16MB 0x01000000
345 #define BASE_32MB 0x02000000
346 #define BASE_64MB 0x04000000
347 #define BASE_128MB 0x08000000
348 #define BASE_256MB 0x10000000
349 #define BASE_512MB 0x20000000
350 #define BASE_1GB 0x40000000
351 #define BASE_2GB 0x80000000
352 #define BASE_4GB 0x0000000100000000ULL
353 #define BASE_8GB 0x0000000200000000ULL
354 #define BASE_16GB 0x0000000400000000ULL
355 #define BASE_32GB 0x0000000800000000ULL
356 #define BASE_64GB 0x0000001000000000ULL
357 #define BASE_128GB 0x0000002000000000ULL
358 #define BASE_256GB 0x0000004000000000ULL
359 #define BASE_512GB 0x0000008000000000ULL
360 #define BASE_1TB 0x0000010000000000ULL
361 #define BASE_2TB 0x0000020000000000ULL
362 #define BASE_4TB 0x0000040000000000ULL
363 #define BASE_8TB 0x0000080000000000ULL
364 #define BASE_16TB 0x0000100000000000ULL
365 #define BASE_32TB 0x0000200000000000ULL
366 #define BASE_64TB 0x0000400000000000ULL
367 #define BASE_128TB 0x0000800000000000ULL
368 #define BASE_256TB 0x0001000000000000ULL
369 #define BASE_512TB 0x0002000000000000ULL
370 #define BASE_1PB 0x0004000000000000ULL
371 #define BASE_2PB 0x0008000000000000ULL
372 #define BASE_4PB 0x0010000000000000ULL
373 #define BASE_8PB 0x0020000000000000ULL
374 #define BASE_16PB 0x0040000000000000ULL
375 #define BASE_32PB 0x0080000000000000ULL
376 #define BASE_64PB 0x0100000000000000ULL
377 #define BASE_128PB 0x0200000000000000ULL
378 #define BASE_256PB 0x0400000000000000ULL
379 #define BASE_512PB 0x0800000000000000ULL
380 #define BASE_1EB 0x1000000000000000ULL
381 #define BASE_2EB 0x2000000000000000ULL
382 #define BASE_4EB 0x4000000000000000ULL
383 #define BASE_8EB 0x8000000000000000ULL
384 
385 //
386 // Support for variable length argument lists using the ANSI standard.
387 //
388 // Since we are using the ANSI standard we used the standard naming and
389 // did not follow the coding convention
390 //
391 // VA_LIST - typedef for argument list.
392 // VA_START (VA_LIST Marker, argument before the ...) - Init Marker for use.
393 // VA_END (VA_LIST Marker) - Clear Marker
394 // VA_ARG (VA_LIST Marker, var arg size) - Use Marker to get an argument from
395 // the ... list. You must know the size and pass it in this macro.
396 // VA_COPY (VA_LIST Dest, VA_LIST Start) - Initialize Dest as a copy of Start.
397 //
398 // example:
399 //
400 // UINTN
401 // ExampleVarArg (
402 // IN UINTN NumberOfArgs,
403 // ...
404 // )
405 // {
406 // VA_LIST Marker;
407 // UINTN Index;
408 // UINTN Result;
409 //
410 // //
411 // // Initialize the Marker
412 // //
413 // VA_START (Marker, NumberOfArgs);
414 // for (Index = 0, Result = 0; Index < NumberOfArgs; Index++) {
415 // //
416 // // The ... list is a series of UINTN values, so average them up.
417 // //
418 // Result += VA_ARG (Marker, UINTN);
419 // }
420 //
421 // VA_END (Marker);
422 // return Result
423 // }
424 //
425 
433 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
434 
435 #if defined(__CC_ARM)
436 //
437 // RVCT ARM variable argument list support.
438 //
439 
444 #ifdef __APCS_ADSABI
445 typedef int *va_list[1];
446 #define VA_LIST va_list
447 #else
448 typedef struct __va_list { void *__ap; } va_list;
449 #define VA_LIST va_list
450 #endif
451 
452 #define VA_START(Marker, Parameter) __va_start(Marker, Parameter)
453 
454 #define VA_ARG(Marker, TYPE) __va_arg(Marker, TYPE)
455 
456 #define VA_END(Marker) ((void)0)
457 
458 #define VA_COPY(Dest, Start) __va_copy (Dest, Start)
459 
460 #elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS)
461 //
462 // Use GCC built-in macros for variable argument lists.
463 //
464 
469 typedef __builtin_va_list VA_LIST;
470 
471 #define VA_START(Marker, Parameter) __builtin_va_start (Marker, Parameter)
472 
473 #define VA_ARG(Marker, TYPE) ((sizeof (TYPE) < sizeof (UINTN)) ? (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, TYPE)))
474 
475 #define VA_END(Marker) __builtin_va_end (Marker)
476 
477 #define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)
478 
479 #else
480 typedef CHAR8 *VA_LIST;
485 
502 #define VA_START(Marker, Parameter) (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF (Parameter)))
503 
520 #define VA_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))
521 
532 #define VA_END(Marker) (Marker = (VA_LIST) 0)
533 
545 #define VA_COPY(Dest, Start) ((void)((Dest) = (Start)))
546 
547 #endif
548 
552 typedef UINTN *BASE_LIST;
553 
561 #define _BASE_INT_SIZE_OF(TYPE) ((sizeof (TYPE) + sizeof (UINTN) - 1) / sizeof (UINTN))
562 
579 #define BASE_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _BASE_INT_SIZE_OF (TYPE)) - _BASE_INT_SIZE_OF (TYPE)))
580 
594 #ifdef __GNUC__
595 #if __GNUC__ >= 4
596 #define OFFSET_OF(TYPE, Field) ((UINTN) __builtin_offsetof(TYPE, Field))
597 #endif
598 #endif
599 
600 #ifndef OFFSET_OF
601 #define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field))
602 #endif
603 
623 #define BASE_CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
624 
637 #define ALIGN_VALUE(Value, Alignment) ((Value) + (((Alignment) - (Value)) & ((Alignment) - 1)))
638 
652 #define ALIGN_POINTER(Pointer, Alignment) ((VOID *) (ALIGN_VALUE ((UINTN)(Pointer), (Alignment))))
653 
666 #define ALIGN_VARIABLE(Value) ALIGN_VALUE ((Value), sizeof (UINTN))
667 
668 
682 #define MAX(a, b) \
683  (((a) > (b)) ? (a) : (b))
684 
697 #define MIN(a, b) \
698  (((a) < (b)) ? (a) : (b))
699 
710 #define ABS(a) \
711  (((a) < 0) ? (-(a)) : (a))
712 
713 //
714 // Status codes common to all execution phases
715 //
717 
727 #define ENCODE_ERROR(StatusCode) ((RETURN_STATUS)(MAX_BIT | (StatusCode)))
728 
738 #define ENCODE_WARNING(StatusCode) ((RETURN_STATUS)(StatusCode))
739 
751 #define RETURN_ERROR(StatusCode) (((INTN)(RETURN_STATUS)(StatusCode)) < 0)
752 
756 #define RETURN_SUCCESS 0
757 
761 #define RETURN_LOAD_ERROR ENCODE_ERROR (1)
762 
766 #define RETURN_INVALID_PARAMETER ENCODE_ERROR (2)
767 
771 #define RETURN_UNSUPPORTED ENCODE_ERROR (3)
772 
776 #define RETURN_BAD_BUFFER_SIZE ENCODE_ERROR (4)
777 
783 #define RETURN_BUFFER_TOO_SMALL ENCODE_ERROR (5)
784 
788 #define RETURN_NOT_READY ENCODE_ERROR (6)
789 
794 #define RETURN_DEVICE_ERROR ENCODE_ERROR (7)
795 
799 #define RETURN_WRITE_PROTECTED ENCODE_ERROR (8)
800 
804 #define RETURN_OUT_OF_RESOURCES ENCODE_ERROR (9)
805 
810 #define RETURN_VOLUME_CORRUPTED ENCODE_ERROR (10)
811 
815 #define RETURN_VOLUME_FULL ENCODE_ERROR (11)
816 
821 #define RETURN_NO_MEDIA ENCODE_ERROR (12)
822 
827 #define RETURN_MEDIA_CHANGED ENCODE_ERROR (13)
828 
832 #define RETURN_NOT_FOUND ENCODE_ERROR (14)
833 
837 #define RETURN_ACCESS_DENIED ENCODE_ERROR (15)
838 
842 #define RETURN_NO_RESPONSE ENCODE_ERROR (16)
843 
847 #define RETURN_NO_MAPPING ENCODE_ERROR (17)
848 
852 #define RETURN_TIMEOUT ENCODE_ERROR (18)
853 
857 #define RETURN_NOT_STARTED ENCODE_ERROR (19)
858 
862 #define RETURN_ALREADY_STARTED ENCODE_ERROR (20)
863 
867 #define RETURN_ABORTED ENCODE_ERROR (21)
868 
872 #define RETURN_ICMP_ERROR ENCODE_ERROR (22)
873 
877 #define RETURN_TFTP_ERROR ENCODE_ERROR (23)
878 
882 #define RETURN_PROTOCOL_ERROR ENCODE_ERROR (24)
883 
888 #define RETURN_INCOMPATIBLE_VERSION ENCODE_ERROR (25)
889 
893 #define RETURN_SECURITY_VIOLATION ENCODE_ERROR (26)
894 
898 #define RETURN_CRC_ERROR ENCODE_ERROR (27)
899 
903 #define RETURN_END_OF_MEDIA ENCODE_ERROR (28)
904 
908 #define RETURN_END_OF_FILE ENCODE_ERROR (31)
909 
913 #define RETURN_INVALID_LANGUAGE ENCODE_ERROR (32)
914 
920 #define RETURN_COMPROMISED_DATA ENCODE_ERROR (33)
921 
926 #define RETURN_WARN_UNKNOWN_GLYPH ENCODE_WARNING (1)
927 
931 #define RETURN_WARN_DELETE_FAILURE ENCODE_WARNING (2)
932 
937 #define RETURN_WARN_WRITE_FAILURE ENCODE_WARNING (3)
938 
943 #define RETURN_WARN_BUFFER_TOO_SMALL ENCODE_WARNING (4)
944 
949 #define RETURN_WARN_STALE_DATA ENCODE_WARNING (5)
950 
963 #define SIGNATURE_16(A, B) ((A) | (B << 8))
964 
980 #define SIGNATURE_32(A, B, C, D) (SIGNATURE_16 (A, B) | (SIGNATURE_16 (C, D) << 16))
981 
1001 #define SIGNATURE_64(A, B, C, D, E, F, G, H) \
1002  (SIGNATURE_32(A, B, C, D) | ((UINT64) (SIGNATURE_32(E, F, G, H)) << 32))
1003 
1004 #endif
1005 
signed char INT8
unsigned short CHAR16
UINTN * BASE_LIST
Definition: Base.h:552
UINT32 UINTN
unsigned int UINT32
unsigned char BOOLEAN
char * va_list
Definition: acmsvcex.h:78
signed char CHAR8
signed long long INT64
Definition: typedefs.h:118
#define VERIFY_SIZE_OF(TYPE, Size)
Definition: Base.h:41
struct _GUID GUID
unsigned short UINT16
#define PHYSICAL_ADDRESS
Definition: env_spec_w32.h:53
UINTN RETURN_STATUS
Definition: Base.h:716
signed int INT32
unsigned long long UINT64
unsigned char UINT8
CHAR8 * VA_LIST
Definition: Base.h:484
signed short INT16