ReactOS 0.4.16-dev-2324-ge2cf0bf
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)
70#define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
71#else
77#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__)
87#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
122typedef 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//
133
137typedef struct _LIST_ENTRY LIST_ENTRY;
138
142struct _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
445typedef int *va_list[1];
446#define VA_LIST va_list
447#else
448typedef 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
469typedef __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
484typedef 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
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
#define VERIFY_SIZE_OF(TYPE, Size)
Definition: Base.h:41
CHAR8 * VA_LIST
Definition: Base.h:484
UINTN * BASE_LIST
Definition: Base.h:552
UINTN RETURN_STATUS
Definition: Base.h:716
unsigned short CHAR16
signed char CHAR8
UINT32 UINTN
unsigned short UINT16
Definition: actypes.h:129
unsigned char BOOLEAN
Definition: actypes.h:127
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
short INT16
Definition: actypes.h:130
unsigned char UINT8
Definition: actypes.h:128
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
signed char INT8
Definition: basetsd.h:183
char * va_list
Definition: vadefs.h:50
#define PHYSICAL_ADDRESS
Definition: env_spec_w32.h:53
Definition: typedefs.h:120
int32_t INT32
Definition: typedefs.h:58
uint32_t UINT32
Definition: typedefs.h:59