• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 - 2008, Intel Corporation
10 All rights reserved. This program and the accompanying materials
11 are licensed and made available under the terms and conditions of the BSD License
12 which accompanies this distribution.  The full text of the license may be found at
13 http://opensource.org/licenses/bsd-license.php
14 
15 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 
18 **/
19 
20 
21 #ifndef __BASE_H__
22 #define __BASE_H__
23 
24 //
25 // Include processor specific binding
26 //
27 #include <gpxe/efi/ProcessorBind.h>
28 
29 typedef struct {
30   UINT32  Data1;
31   UINT16  Data2;
32   UINT16  Data3;
33   UINT8   Data4[8];
34 } GUID;
35 
36 typedef UINT64 PHYSICAL_ADDRESS;
37 
38 ///
39 /// LIST_ENTRY definition
40 ///
41 typedef struct _LIST_ENTRY LIST_ENTRY;
42 
43 struct _LIST_ENTRY {
44   LIST_ENTRY  *ForwardLink;
45   LIST_ENTRY  *BackLink;
46 };
47 
48 //
49 // Modifiers to absract standard types to aid in debug of problems
50 //
51 #define CONST     const
52 #define STATIC    static
53 #define VOID      void
54 
55 //
56 // Modifiers for Data Types used to self document code.
57 // This concept is borrowed for UEFI specification.
58 //
59 #define IN
60 #define OUT
61 #define OPTIONAL
62 
63 //
64 //  UEFI specification claims 1 and 0. We are concerned about the
65 //  complier portability so we did it this way.
66 //
67 #define TRUE  ((BOOLEAN)(1==1))
68 #define FALSE ((BOOLEAN)(0==1))
69 
70 #define NULL  ((VOID *) 0)
71 
72 #define  BIT0     0x00000001
73 #define  BIT1     0x00000002
74 #define  BIT2     0x00000004
75 #define  BIT3     0x00000008
76 #define  BIT4     0x00000010
77 #define  BIT5     0x00000020
78 #define  BIT6     0x00000040
79 #define  BIT7     0x00000080
80 #define  BIT8     0x00000100
81 #define  BIT9     0x00000200
82 #define  BIT10    0x00000400
83 #define  BIT11    0x00000800
84 #define  BIT12    0x00001000
85 #define  BIT13    0x00002000
86 #define  BIT14    0x00004000
87 #define  BIT15    0x00008000
88 #define  BIT16    0x00010000
89 #define  BIT17    0x00020000
90 #define  BIT18    0x00040000
91 #define  BIT19    0x00080000
92 #define  BIT20    0x00100000
93 #define  BIT21    0x00200000
94 #define  BIT22    0x00400000
95 #define  BIT23    0x00800000
96 #define  BIT24    0x01000000
97 #define  BIT25    0x02000000
98 #define  BIT26    0x04000000
99 #define  BIT27    0x08000000
100 #define  BIT28    0x10000000
101 #define  BIT29    0x20000000
102 #define  BIT30    0x40000000
103 #define  BIT31    0x80000000
104 #define  BIT32    0x0000000100000000UL
105 #define  BIT33    0x0000000200000000UL
106 #define  BIT34    0x0000000400000000UL
107 #define  BIT35    0x0000000800000000UL
108 #define  BIT36    0x0000001000000000UL
109 #define  BIT37    0x0000002000000000UL
110 #define  BIT38    0x0000004000000000UL
111 #define  BIT39    0x0000008000000000UL
112 #define  BIT40    0x0000010000000000UL
113 #define  BIT41    0x0000020000000000UL
114 #define  BIT42    0x0000040000000000UL
115 #define  BIT43    0x0000080000000000UL
116 #define  BIT44    0x0000100000000000UL
117 #define  BIT45    0x0000200000000000UL
118 #define  BIT46    0x0000400000000000UL
119 #define  BIT47    0x0000800000000000UL
120 #define  BIT48    0x0001000000000000UL
121 #define  BIT49    0x0002000000000000UL
122 #define  BIT50    0x0004000000000000UL
123 #define  BIT51    0x0008000000000000UL
124 #define  BIT52    0x0010000000000000UL
125 #define  BIT53    0x0020000000000000UL
126 #define  BIT54    0x0040000000000000UL
127 #define  BIT55    0x0080000000000000UL
128 #define  BIT56    0x0100000000000000UL
129 #define  BIT57    0x0200000000000000UL
130 #define  BIT58    0x0400000000000000UL
131 #define  BIT59    0x0800000000000000UL
132 #define  BIT60    0x1000000000000000UL
133 #define  BIT61    0x2000000000000000UL
134 #define  BIT62    0x4000000000000000UL
135 #define  BIT63    0x8000000000000000UL
136 
137 //
138 //  Support for variable length argument lists using the ANSI standard.
139 //
140 //  Since we are using the ANSI standard we used the standard nameing and
141 //  did not folow the coding convention
142 //
143 //  VA_LIST  - typedef for argument list.
144 //  VA_START (VA_LIST Marker, argument before the ...) - Init Marker for use.
145 //  VA_END (VA_LIST Marker) - Clear Marker
146 //  VA_ARG (VA_LIST Marker, var arg size) - Use Marker to get an argumnet from
147 //    the ... list. You must know the size and pass it in this macro.
148 //
149 //  example:
150 //
151 //  UINTN
152 //  ExampleVarArg (
153 //    IN UINTN  NumberOfArgs,
154 //    ...
155 //    )
156 //  {
157 //    VA_LIST Marker;
158 //    UINTN   Index;
159 //    UINTN   Result;
160 //
161 //    //
162 //    // Initialize the Marker
163 //    //
164 //    VA_START (Marker, NumberOfArgs);
165 //    for (Index = 0, Result = 0; Index < NumberOfArgs; Index++) {
166 //      //
167 //      // The ... list is a series of UINTN values, so average them up.
168 //      //
169 //      Result += VA_ARG (Marker, UINTN);
170 //    }
171 //
172 //    VA_END (Marker);
173 //    return Result
174 //  }
175 //
176 
177 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
178 
179 //
180 // Also support coding convention rules for var arg macros
181 //
182 typedef CHAR8 *VA_LIST;
183 #define VA_START(ap, v) (ap = (VA_LIST) & (v) + _INT_SIZE_OF (v))
184 #define VA_ARG(ap, t)   (*(t *) ((ap += _INT_SIZE_OF (t)) - _INT_SIZE_OF (t)))
185 #define VA_END(ap)      (ap = (VA_LIST) 0)
186 
187 //
188 // Macro that returns the byte offset of a field in a data structure.
189 //
190 #define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field))
191 
192 ///
193 ///  CONTAINING_RECORD - returns a pointer to the structure
194 ///      from one of it's elements.
195 ///
196 #define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
197 
198 ///
199 ///  ALIGN_VALUE - aligns a value up to the next boundary of the given alignment.
200 ///
201 #define ALIGN_VALUE(Value, Alignment) ((Value) + (((Alignment) - (Value)) & ((Alignment) - 1)))
202 
203 ///
204 ///  ALIGN_POINTER - aligns a pointer to the lowest boundry
205 ///
206 #define ALIGN_POINTER(Pointer, Alignment) ((VOID *) (ALIGN_VALUE ((UINTN)(Pointer), (Alignment))))
207 
208 ///
209 ///  ALIGN_VARIABLE - aligns a variable up to the next natural boundry for int size of a processor
210 ///
211 #define ALIGN_VARIABLE(Value)  ALIGN_VALUE ((Value), sizeof (UINTN))
212 
213 
214 //
215 // Return the maximum of two operands.
216 // This macro returns the maximum of two operand specified by a and b.
217 // Both a and b must be the same numerical types, signed or unsigned.
218 //
219 #define MAX(a, b)                       \
220   (((a) > (b)) ? (a) : (b))
221 
222 
223 //
224 // Return the minimum of two operands.
225 // This macro returns the minimal of two operand specified by a and b.
226 // Both a and b must be the same numerical types, signed or unsigned.
227 //
228 #define MIN(a, b)                       \
229   (((a) < (b)) ? (a) : (b))
230 
231 
232 //
233 // EFI Error Codes common to all execution phases
234 //
235 
236 typedef INTN RETURN_STATUS;
237 
238 ///
239 /// Set the upper bit to indicate EFI Error.
240 ///
241 #define ENCODE_ERROR(a)              (MAX_BIT | (a))
242 
243 #define ENCODE_WARNING(a)            (a)
244 #define RETURN_ERROR(a)              ((INTN) (a) < 0)
245 
246 #define RETURN_SUCCESS               0
247 #define RETURN_LOAD_ERROR            ENCODE_ERROR (1)
248 #define RETURN_INVALID_PARAMETER     ENCODE_ERROR (2)
249 #define RETURN_UNSUPPORTED           ENCODE_ERROR (3)
250 #define RETURN_BAD_BUFFER_SIZE       ENCODE_ERROR (4)
251 #define RETURN_BUFFER_TOO_SMALL      ENCODE_ERROR (5)
252 #define RETURN_NOT_READY             ENCODE_ERROR (6)
253 #define RETURN_DEVICE_ERROR          ENCODE_ERROR (7)
254 #define RETURN_WRITE_PROTECTED       ENCODE_ERROR (8)
255 #define RETURN_OUT_OF_RESOURCES      ENCODE_ERROR (9)
256 #define RETURN_VOLUME_CORRUPTED      ENCODE_ERROR (10)
257 #define RETURN_VOLUME_FULL           ENCODE_ERROR (11)
258 #define RETURN_NO_MEDIA              ENCODE_ERROR (12)
259 #define RETURN_MEDIA_CHANGED         ENCODE_ERROR (13)
260 #define RETURN_NOT_FOUND             ENCODE_ERROR (14)
261 #define RETURN_ACCESS_DENIED         ENCODE_ERROR (15)
262 #define RETURN_NO_RESPONSE           ENCODE_ERROR (16)
263 #define RETURN_NO_MAPPING            ENCODE_ERROR (17)
264 #define RETURN_TIMEOUT               ENCODE_ERROR (18)
265 #define RETURN_NOT_STARTED           ENCODE_ERROR (19)
266 #define RETURN_ALREADY_STARTED       ENCODE_ERROR (20)
267 #define RETURN_ABORTED               ENCODE_ERROR (21)
268 #define RETURN_ICMP_ERROR            ENCODE_ERROR (22)
269 #define RETURN_TFTP_ERROR            ENCODE_ERROR (23)
270 #define RETURN_PROTOCOL_ERROR        ENCODE_ERROR (24)
271 #define RETURN_INCOMPATIBLE_VERSION  ENCODE_ERROR (25)
272 #define RETURN_SECURITY_VIOLATION    ENCODE_ERROR (26)
273 #define RETURN_CRC_ERROR             ENCODE_ERROR (27)
274 #define RETURN_END_OF_MEDIA          ENCODE_ERROR (28)
275 #define RETURN_END_OF_FILE           ENCODE_ERROR (31)
276 #define RETURN_INVALID_LANGUAGE      ENCODE_ERROR (32)
277 
278 
279 #define RETURN_WARN_UNKNOWN_GLYPH    ENCODE_WARNING (1)
280 #define RETURN_WARN_DELETE_FAILURE   ENCODE_WARNING (2)
281 #define RETURN_WARN_WRITE_FAILURE    ENCODE_WARNING (3)
282 #define RETURN_WARN_BUFFER_TOO_SMALL ENCODE_WARNING (4)
283 
284 /**
285   Returns a 16-bit signature built from 2 ASCII characters.
286 
287   @param  A	   The first ASCII character.
288   @param  B	   The second ASCII character.
289 
290   @return A 16-bit value built from the two ASCII characters specified by A and B.
291 
292 **/
293 #define SIGNATURE_16(A, B)        ((A) | (B << 8))
294 
295 /**
296   Returns a 32-bit signature built from 4 ASCII characters.
297 
298   @param  A	   The first ASCII character.
299   @param  B	   The second ASCII character.
300   @param  C	   The third ASCII character.
301   @param  D	   The fourth ASCII character.
302 
303   @return A 32-bit value built from the two ASCII characters specified by A, B,
304           C and D.
305 
306 **/
307 #define SIGNATURE_32(A, B, C, D)  (SIGNATURE_16 (A, B) | (SIGNATURE_16 (C, D) << 16))
308 
309 /**
310   Returns a 64-bit signature built from 8 ASCII characters.
311 
312   @param  A	   The first ASCII character.
313   @param  B	   The second ASCII character.
314   @param  C	   The third ASCII character.
315   @param  D	   The fourth ASCII character.
316   @param  E	   The fifth ASCII character.
317   @param  F	   The sixth ASCII character.
318   @param  G	   The seventh ASCII character.
319   @param  H	   The eighth ASCII character.
320 
321   @return A 64-bit value built from the two ASCII characters specified by A, B,
322           C, D, E, F, G and H.
323 
324 **/
325 #define SIGNATURE_64(A, B, C, D, E, F, G, H) \
326     (SIGNATURE_32 (A, B, C, D) | ((UINT64) (SIGNATURE_32 (E, F, G, H)) << 32))
327 
328 #endif
329 
330