]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Efi/Include/EfiTypes.h
f73a928860e3541dad13b8c350f7449d44bac86e
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Efi / Include / EfiTypes.h
1 /*++
2
3 Copyright (c) 2004, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 EfiTypes.h
15
16 Abstract:
17
18 EFI defined types. Use these types when ever possible!
19
20 --*/
21
22 #ifndef _EFI_TYPES_H_
23 #define _EFI_TYPES_H_
24
25 //
26 // EFI Data Types based on ANSI C integer types in EfiBind.h
27 //
28 typedef uint8_t BOOLEAN;
29 typedef intn_t INTN;
30 typedef uintn_t UINTN;
31 typedef int8_t INT8;
32 typedef uint8_t UINT8;
33 typedef int16_t INT16;
34 typedef uint16_t UINT16;
35 typedef int32_t INT32;
36 typedef uint32_t UINT32;
37 typedef int64_t INT64;
38 typedef uint64_t UINT64;
39 typedef char CHAR8;
40 typedef uint16_t CHAR16;
41 typedef UINT64 EFI_LBA;
42
43 //
44 // Modifiers for EFI Data Types used to self document code.
45 // Please see EFI coding convention for proper usage.
46 //
47 #ifndef IN
48 //
49 // Some other envirnments use this construct, so #ifndef to prevent
50 // mulitple definition.
51 //
52 #define IN
53 #define OUT
54 #define OPTIONAL
55 #endif
56
57 #ifndef UNALIGNED
58 #define UNALIGNED
59 #endif
60
61 //
62 // Modifiers for EFI Runtime and Boot Services
63 //
64 #define EFI_RUNTIMESERVICE
65 #define EFI_BOOTSERVICE
66
67 //
68 // Boot Service add in EFI 1.1
69 //
70 #define EFI_BOOTSERVICE11
71
72 //
73 // Modifiers to absract standard types to aid in debug of problems
74 //
75 #define CONST const
76 #define STATIC static
77 #define VOID void
78 #define VOLATILE volatile
79
80 //
81 // Modifier to ensure that all protocol member functions and EFI intrinsics
82 // use the correct C calling convention. All protocol member functions and
83 // EFI intrinsics are required to modify thier member functions with EFIAPI.
84 //
85 #define EFIAPI _EFIAPI
86
87 //
88 // EFI Constants. They may exist in other build structures, so #ifndef them.
89 //
90 #ifndef TRUE
91 #define TRUE ((BOOLEAN) 1 == 1)
92 #endif
93
94 #ifndef FALSE
95 #define FALSE ((BOOLEAN) 0 == 1)
96 #endif
97
98 #ifndef NULL
99 #define NULL ((VOID *) 0)
100 #endif
101 //
102 // EFI Data Types derived from other EFI data types.
103 //
104 typedef UINTN EFI_STATUS;
105
106 typedef VOID *EFI_HANDLE;
107 #define NULL_HANDLE ((VOID *) 0)
108
109 typedef VOID *EFI_EVENT;
110 typedef UINTN EFI_TPL;
111
112 typedef struct {
113 UINT32 Data1;
114 UINT16 Data2;
115 UINT16 Data3;
116 UINT8 Data4[8];
117 } EFI_GUID;
118
119 typedef union {
120 EFI_GUID Guid;
121 UINT8 Raw[16];
122 } EFI_GUID_UNION;
123
124 //
125 // EFI Time Abstraction:
126 // Year: 2000 - 20XX
127 // Month: 1 - 12
128 // Day: 1 - 31
129 // Hour: 0 - 23
130 // Minute: 0 - 59
131 // Second: 0 - 59
132 // Nanosecond: 0 - 999,999,999
133 // TimeZone: -1440 to 1440 or 2047
134 //
135 typedef struct {
136 UINT16 Year;
137 UINT8 Month;
138 UINT8 Day;
139 UINT8 Hour;
140 UINT8 Minute;
141 UINT8 Second;
142 UINT8 Pad1;
143 UINT32 Nanosecond;
144 INT16 TimeZone;
145 UINT8 Daylight;
146 UINT8 Pad2;
147 } EFI_TIME;
148
149 //
150 // Bit definitions for EFI_TIME.Daylight
151 //
152 #define EFI_TIME_ADJUST_DAYLIGHT 0x01
153 #define EFI_TIME_IN_DAYLIGHT 0x02
154
155 //
156 // Value definition for EFI_TIME.TimeZone
157 //
158 #define EFI_UNSPECIFIED_TIMEZONE 0x07FF
159
160 //
161 // Networking
162 //
163 typedef struct {
164 UINT8 Addr[4];
165 } EFI_IPv4_ADDRESS;
166
167 typedef struct {
168 UINT8 Addr[16];
169 } EFI_IPv6_ADDRESS;
170
171 typedef struct {
172 UINT8 Addr[32];
173 } EFI_MAC_ADDRESS;
174
175 typedef union {
176 UINT32 Addr[4];
177 EFI_IPv4_ADDRESS v4;
178 EFI_IPv6_ADDRESS v6;
179 } EFI_IP_ADDRESS;
180
181 typedef enum {
182 EfiReservedMemoryType,
183 EfiLoaderCode,
184 EfiLoaderData,
185 EfiBootServicesCode,
186 EfiBootServicesData,
187 EfiRuntimeServicesCode,
188 EfiRuntimeServicesData,
189 EfiConventionalMemory,
190 EfiUnusableMemory,
191 EfiACPIReclaimMemory,
192 EfiACPIMemoryNVS,
193 EfiMemoryMappedIO,
194 EfiMemoryMappedIOPortSpace,
195 EfiPalCode,
196 EfiMaxMemoryType
197 } EFI_MEMORY_TYPE;
198
199 typedef enum {
200 AllocateAnyPages,
201 AllocateMaxAddress,
202 AllocateAddress,
203 MaxAllocateType
204 } EFI_ALLOCATE_TYPE;
205
206 typedef struct {
207 UINT64 Signature;
208 UINT32 Revision;
209 UINT32 HeaderSize;
210 UINT32 CRC32;
211 UINT32 Reserved;
212 } EFI_TABLE_HEADER;
213
214 //
215 // possible caching types for the memory range
216 //
217 #define EFI_MEMORY_UC 0x0000000000000001
218 #define EFI_MEMORY_WC 0x0000000000000002
219 #define EFI_MEMORY_WT 0x0000000000000004
220 #define EFI_MEMORY_WB 0x0000000000000008
221 #define EFI_MEMORY_UCE 0x0000000000000010
222
223 //
224 // physical memory protection on range
225 //
226 #define EFI_MEMORY_WP 0x0000000000001000
227 #define EFI_MEMORY_RP 0x0000000000002000
228 #define EFI_MEMORY_XP 0x0000000000004000
229
230 //
231 // range requires a runtime mapping
232 //
233 #define EFI_MEMORY_RUNTIME 0x8000000000000000ULL
234
235 typedef UINT64 EFI_PHYSICAL_ADDRESS;
236 typedef UINT64 EFI_VIRTUAL_ADDRESS;
237
238 #define EFI_MEMORY_DESCRIPTOR_VERSION 1
239 typedef struct {
240 UINT32 Type;
241 UINT32 Pad;
242 EFI_PHYSICAL_ADDRESS PhysicalStart;
243 EFI_VIRTUAL_ADDRESS VirtualStart;
244 UINT64 NumberOfPages;
245 UINT64 Attribute;
246 } EFI_MEMORY_DESCRIPTOR;
247
248 //
249 // The EFI memory allocation functions work in units of EFI_PAGEs that are
250 // 4K. This should in no way be confused with the page size of the processor.
251 // An EFI_PAGE is just the quanta of memory in EFI.
252 //
253 #define EFI_PAGE_SIZE 4096
254 #define EFI_PAGE_MASK 0xFFF
255 #define EFI_PAGE_SHIFT 12
256
257 #define EFI_SIZE_TO_PAGES(a) (((a) >> EFI_PAGE_SHIFT) + (((a) & EFI_PAGE_MASK) ? 1 : 0))
258
259 #define EFI_PAGES_TO_SIZE(a) ( (a) << EFI_PAGE_SHIFT)
260
261 //
262 // ALIGN_POINTER - aligns a pointer to the lowest boundry
263 //
264 #define ALIGN_POINTER(p, s) ((VOID *) (p + ((s - ((UINTN) p)) & (s - 1))))
265
266 //
267 // ALIGN_VARIABLE - aligns a variable up to the next natural boundry for int size of a processor
268 //
269 #define ALIGN_VARIABLE(Value, Adjustment) \
270 (UINTN) Adjustment = 0; \
271 if ((UINTN) Value % sizeof (UINTN)) { \
272 (UINTN) Adjustment = sizeof (UINTN) - ((UINTN) Value % sizeof (UINTN)); \
273 } \
274 Value = (UINTN) Value + (UINTN) Adjustment
275
276 //
277 // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
278 //
279 #define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field)))
280
281 //
282 // CONTAINING_RECORD - returns a pointer to the structure
283 // from one of it's elements.
284 //
285 #define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
286
287 //
288 // Define macros to build data structure signatures from characters.
289 //
290 #define EFI_SIGNATURE_16(A, B) ((A) | (B << 8))
291 #define EFI_SIGNATURE_32(A, B, C, D) (EFI_SIGNATURE_16 (A, B) | (EFI_SIGNATURE_16 (C, D) << 16))
292 #define EFI_SIGNATURE_64(A, B, C, D, E, F, G, H) \
293 (EFI_SIGNATURE_32 (A, B, C, D) | ((UINT64) (EFI_SIGNATURE_32 (E, F, G, H)) << 32))
294
295 #endif