xref: /xnu-8020.121.3/pexpert/pexpert/i386/efi.h (revision fdd8201d7b966f0c3ea610489d29bd841d358941)
1 /*
2  * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _PEXPERT_I386_EFI_H
30 #define _PEXPERT_I386_EFI_H
31 
32 #include <stdint.h>
33 
34 typedef uint8_t   EFI_UINT8;
35 typedef uint16_t  EFI_UINT16;
36 typedef uint32_t  EFI_UINT32;
37 typedef uint64_t  EFI_UINT64;
38 
39 typedef uint32_t  EFI_UINTN; /* natural size for firmware, not kernel */
40 
41 typedef int8_t    EFI_INT8;
42 typedef int16_t   EFI_INT16;
43 typedef int32_t   EFI_INT32;
44 typedef int64_t   EFI_INT64;
45 
46 typedef int8_t    EFI_CHAR8;
47 typedef int16_t   EFI_CHAR16;
48 typedef int32_t   EFI_CHAR32;
49 typedef int64_t   EFI_CHAR64;
50 
51 typedef uint32_t  EFI_STATUS;
52 typedef uint8_t   EFI_BOOLEAN;
53 typedef void      VOID;
54 
55 typedef uint32_t  EFI_PTR32;
56 typedef uint32_t  EFI_HANDLE32;
57 
58 typedef uint64_t  EFI_PTR64;
59 typedef uint64_t  EFI_HANDLE64;
60 /*
61  *
62  *  Portions Copyright 2004, Intel Corporation
63  *  All rights reserved. This program and the accompanying materials
64  *  are licensed and made available under the terms and conditions of the BSD License
65  *  which accompanies this distribution.  The full text of the license may be found at
66  *   http://opensource.org/licenses/bsd-license.php
67  *
68  *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
69  *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
70  *
71  */
72 
73 
74 //
75 // Modifiers for EFI Runtime and Boot Services
76 //
77 #define EFI_RUNTIMESERVICE
78 #define EFIAPI
79 #define IN
80 #define OUT
81 #define OPTIONAL
82 
83 #define EFI_MAX_BIT       0x80000000
84 
85 //
86 // Set the upper bit to indicate EFI Error.
87 //
88 #define EFIERR(a)                 (EFI_MAX_BIT | (a))
89 
90 #define EFIWARN(a)                (a)
91 #define EFI_ERROR(a)              (((INTN) (a)) < 0)
92 
93 #define EFI_SUCCESS               0
94 #define EFI_LOAD_ERROR            EFIERR (1)
95 #define EFI_INVALID_PARAMETER     EFIERR (2)
96 #define EFI_UNSUPPORTED           EFIERR (3)
97 #define EFI_BAD_BUFFER_SIZE       EFIERR (4)
98 #define EFI_BUFFER_TOO_SMALL      EFIERR (5)
99 #define EFI_NOT_READY             EFIERR (6)
100 #define EFI_DEVICE_ERROR          EFIERR (7)
101 #define EFI_WRITE_PROTECTED       EFIERR (8)
102 #define EFI_OUT_OF_RESOURCES      EFIERR (9)
103 #define EFI_VOLUME_CORRUPTED      EFIERR (10)
104 #define EFI_VOLUME_FULL           EFIERR (11)
105 #define EFI_NO_MEDIA              EFIERR (12)
106 #define EFI_MEDIA_CHANGED         EFIERR (13)
107 #define EFI_NOT_FOUND             EFIERR (14)
108 #define EFI_ACCESS_DENIED         EFIERR (15)
109 #define EFI_NO_RESPONSE           EFIERR (16)
110 #define EFI_NO_MAPPING            EFIERR (17)
111 #define EFI_TIMEOUT               EFIERR (18)
112 #define EFI_NOT_STARTED           EFIERR (19)
113 #define EFI_ALREADY_STARTED       EFIERR (20)
114 #define EFI_ABORTED               EFIERR (21)
115 #define EFI_ICMP_ERROR            EFIERR (22)
116 #define EFI_TFTP_ERROR            EFIERR (23)
117 #define EFI_PROTOCOL_ERROR        EFIERR (24)
118 #define EFI_INCOMPATIBLE_VERSION  EFIERR (25)
119 #define EFI_SECURITY_VIOLATION    EFIERR (26)
120 #define EFI_CRC_ERROR             EFIERR (27)
121 
122 #define EFI_WARN_UNKNOWN_GLYPH    EFIWARN (1)
123 #define EFI_WARN_DELETE_FAILURE   EFIWARN (2)
124 #define EFI_WARN_WRITE_FAILURE    EFIWARN (3)
125 #define EFI_WARN_BUFFER_TOO_SMALL EFIWARN (4)
126 
127 //
128 // EFI Specification Revision information
129 //
130 #define EFI_SPECIFICATION_MAJOR_REVISION  1
131 #define EFI_SPECIFICATION_MINOR_REVISION  10
132 
133 typedef struct {
134 	EFI_UINT32  Data1;
135 	EFI_UINT16  Data2;
136 	EFI_UINT16  Data3;
137 	EFI_UINT8   Data4[8];
138 } EFI_GUID;
139 
140 #define APPLE_VENDOR_GUID \
141     {0xAC39C713, 0x7E50, 0x423D, {0x88, 0x9D, 0x27,0x8F, 0xCC, 0x34, 0x22, 0xB6} }
142 
143 #define EFI_GLOBAL_VARIABLE_GUID \
144     {0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
145 
146 typedef union {
147 	EFI_GUID  Guid;
148 	EFI_UINT8 Raw[16];
149 } EFI_GUID_UNION;
150 
151 //
152 // EFI Time Abstraction:
153 //  Year:       2000 - 20XX
154 //  Month:      1 - 12
155 //  Day:        1 - 31
156 //  Hour:       0 - 23
157 //  Minute:     0 - 59
158 //  Second:     0 - 59
159 //  Nanosecond: 0 - 999,999,999
160 //  TimeZone:   -1440 to 1440 or 2047
161 //
162 typedef struct {
163 	EFI_UINT16  Year;
164 	EFI_UINT8   Month;
165 	EFI_UINT8   Day;
166 	EFI_UINT8   Hour;
167 	EFI_UINT8   Minute;
168 	EFI_UINT8   Second;
169 	EFI_UINT8   Pad1;
170 	EFI_UINT32  Nanosecond;
171 	EFI_INT16   TimeZone;
172 	EFI_UINT8   Daylight;
173 	EFI_UINT8   Pad2;
174 } EFI_TIME;
175 
176 //
177 // Bit definitions for EFI_TIME.Daylight
178 //
179 #define EFI_TIME_ADJUST_DAYLIGHT  0x01
180 #define EFI_TIME_IN_DAYLIGHT      0x02
181 
182 //
183 // Value definition for EFI_TIME.TimeZone
184 //
185 #define EFI_UNSPECIFIED_TIMEZONE  0x07FF
186 
187 typedef enum {
188 	EfiReservedMemoryType,
189 	EfiLoaderCode,
190 	EfiLoaderData,
191 	EfiBootServicesCode,
192 	EfiBootServicesData,
193 	EfiRuntimeServicesCode,
194 	EfiRuntimeServicesData,
195 	EfiConventionalMemory,
196 	EfiUnusableMemory,
197 	EfiACPIReclaimMemory,
198 	EfiACPIMemoryNVS,
199 	EfiMemoryMappedIO,
200 	EfiMemoryMappedIOPortSpace,
201 	EfiPalCode,
202 	EfiMaxMemoryType
203 } EFI_MEMORY_TYPE;
204 
205 typedef struct {
206 	EFI_UINT64  Signature;
207 	EFI_UINT32  Revision;
208 	EFI_UINT32  HeaderSize;
209 	EFI_UINT32  CRC32;
210 	EFI_UINT32  Reserved;
211 } __attribute__((aligned(8))) EFI_TABLE_HEADER;
212 
213 //
214 // possible caching types for the memory range
215 //
216 #define EFI_MEMORY_UC   0x0000000000000001ULL
217 #define EFI_MEMORY_WC   0x0000000000000002ULL
218 #define EFI_MEMORY_WT   0x0000000000000004ULL
219 #define EFI_MEMORY_WB   0x0000000000000008ULL
220 #define EFI_MEMORY_UCE  0x0000000000000010ULL
221 
222 //
223 // physical memory protection on range
224 //
225 #define EFI_MEMORY_WP 0x0000000000001000ULL
226 #define EFI_MEMORY_RP 0x0000000000002000ULL
227 #define EFI_MEMORY_XP 0x0000000000004000ULL
228 
229 //
230 // range requires a runtime mapping
231 //
232 #define EFI_MEMORY_RUNTIME  0x8000000000000000ULL
233 #define EFI_MEMORY_KERN_RESERVED (1ULL << 59)
234 typedef EFI_UINT64  EFI_PHYSICAL_ADDRESS;
235 typedef EFI_UINT64  EFI_VIRTUAL_ADDRESS;
236 
237 #define EFI_MEMORY_DESCRIPTOR_VERSION 1
238 typedef struct {
239 	EFI_UINT32            Type;
240 	EFI_UINT32            Pad;
241 	EFI_PHYSICAL_ADDRESS  PhysicalStart;
242 	EFI_VIRTUAL_ADDRESS   VirtualStart;
243 	EFI_UINT64            NumberOfPages;
244 	EFI_UINT64            Attribute;
245 } __attribute__((aligned(8))) EFI_MEMORY_DESCRIPTOR;
246 
247 
248 typedef
249     EFI_RUNTIMESERVICE
250     EFI_STATUS
251 (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP)(
252 	IN EFI_UINTN                    MemoryMapSize,
253 	IN EFI_UINTN                    DescriptorSize,
254 	IN EFI_UINT32                   DescriptorVersion,
255 	IN EFI_MEMORY_DESCRIPTOR        * VirtualMap
256 	);
257 
258 typedef
259     EFI_RUNTIMESERVICE
260     EFI_STATUS
261 (EFIAPI *EFI_CONVERT_POINTER)(
262 	IN EFI_UINTN                DebugDisposition,
263 	IN OUT VOID                 **Address
264 	);
265 
266 //
267 // Variable attributes
268 //
269 #define EFI_VARIABLE_NON_VOLATILE       0x00000001
270 #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
271 #define EFI_VARIABLE_RUNTIME_ACCESS     0x00000004
272 #define EFI_VARIABLE_READ_ONLY          0x00000008
273 
274 typedef
275     EFI_RUNTIMESERVICE
276     EFI_STATUS
277 (EFIAPI *EFI_GET_VARIABLE)(
278 	IN EFI_CHAR16               * VariableName,
279 	IN EFI_GUID                 * VendorGuid,
280 	OUT EFI_UINT32              * Attributes OPTIONAL,
281 	IN OUT EFI_UINTN            * DataSize,
282 	OUT VOID                    * Data
283 	);
284 
285 typedef
286     EFI_RUNTIMESERVICE
287     EFI_STATUS
288 (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(
289 	IN OUT EFI_UINTN            * VariableNameSize,
290 	IN OUT EFI_CHAR16           * VariableName,
291 	IN OUT EFI_GUID             * VendorGuid
292 	);
293 
294 typedef
295     EFI_RUNTIMESERVICE
296     EFI_STATUS
297 (EFIAPI *EFI_SET_VARIABLE)(
298 	IN EFI_CHAR16               * VariableName,
299 	IN EFI_GUID                 * VendorGuid,
300 	IN EFI_UINT32               Attributes,
301 	IN EFI_UINTN                DataSize,
302 	IN VOID                     * Data
303 	);
304 
305 //
306 // EFI Time
307 //
308 typedef struct {
309 	EFI_UINT32  Resolution;
310 	EFI_UINT32  Accuracy;
311 	EFI_BOOLEAN SetsToZero;
312 } __attribute__((aligned(4))) EFI_TIME_CAPABILITIES;
313 
314 typedef
315     EFI_RUNTIMESERVICE
316     EFI_STATUS
317 (EFIAPI *EFI_GET_TIME)(
318 	OUT EFI_TIME                * Time,
319 	OUT EFI_TIME_CAPABILITIES   * Capabilities OPTIONAL
320 	);
321 
322 typedef
323     EFI_RUNTIMESERVICE
324     EFI_STATUS
325 (EFIAPI *EFI_SET_TIME)(
326 	IN EFI_TIME                 * Time
327 	);
328 
329 typedef
330     EFI_RUNTIMESERVICE
331     EFI_STATUS
332 (EFIAPI *EFI_GET_WAKEUP_TIME)(
333 	OUT EFI_BOOLEAN             * Enabled,
334 	OUT EFI_BOOLEAN             * Pending,
335 	OUT EFI_TIME                * Time
336 	);
337 
338 typedef
339     EFI_RUNTIMESERVICE
340     EFI_STATUS
341 (EFIAPI *EFI_SET_WAKEUP_TIME)(
342 	IN EFI_BOOLEAN              Enable,
343 	IN EFI_TIME                 * Time OPTIONAL
344 	);
345 
346 typedef enum {
347 	EfiResetCold,
348 	EfiResetWarm,
349 	EfiResetShutdown,
350 
351 #ifdef TIANO_EXTENSION_FLAG
352 	EfiResetUpdate
353 #endif
354 } EFI_RESET_TYPE;
355 
356 typedef
357     EFI_RUNTIMESERVICE
358     VOID
359 (EFIAPI *EFI_RESET_SYSTEM)(
360 	IN EFI_RESET_TYPE               ResetType,
361 	IN EFI_STATUS                   ResetStatus,
362 	IN EFI_UINTN                    DataSize,
363 	IN EFI_CHAR16                   * ResetData OPTIONAL
364 	);
365 
366 typedef
367     EFI_RUNTIMESERVICE
368     EFI_STATUS
369 (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT)(
370 	OUT EFI_UINT32                  * HighCount
371 	);
372 
373 //
374 // Definition of Status Code extended data header
375 //
376 //  HeaderSize    The size of the architecture. This is specified to enable
377 //                the future expansion
378 //
379 //  Size          The size of the data in bytes. This does not include the size
380 //                of the header structure.
381 //
382 //  Type          A GUID defining the type of the data
383 //
384 //
385 #ifdef TIANO_EXTENSION_FLAG
386 
387 typedef
388     EFI_RUNTIMESERVICE
389     EFI_STATUS
390 (EFIAPI *EFI_REPORT_STATUS_CODE)(
391 	IN EFI_STATUS_CODE_TYPE       Type,
392 	IN EFI_STATUS_CODE_VALUE      Value,
393 	IN EFI_UINT32                 Instance,
394 	IN EFI_GUID                   * CallerId OPTIONAL,
395 	IN EFI_STATUS_CODE_DATA       * Data OPTIONAL
396 	);
397 
398 #endif
399 //
400 // EFI Runtime Services Table
401 //
402 #define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552ULL
403 #define EFI_RUNTIME_SERVICES_REVISION   ((EFI_SPECIFICATION_MAJOR_REVISION << 16) | (EFI_SPECIFICATION_MINOR_REVISION))
404 
405 typedef struct {
406 	EFI_TABLE_HEADER              Hdr;
407 
408 	//
409 	// Time services
410 	//
411 	EFI_PTR32                     GetTime;
412 	EFI_PTR32                     SetTime;
413 	EFI_PTR32                     GetWakeupTime;
414 	EFI_PTR32                     SetWakeupTime;
415 
416 	//
417 	// Virtual memory services
418 	//
419 	EFI_PTR32                     SetVirtualAddressMap;
420 	EFI_PTR32                     ConvertPointer;
421 
422 	//
423 	// Variable services
424 	//
425 	EFI_PTR32                     GetVariable;
426 	EFI_PTR32                     GetNextVariableName;
427 	EFI_PTR32                     SetVariable;
428 
429 	//
430 	// Misc
431 	//
432 	EFI_PTR32                     GetNextHighMonotonicCount;
433 	EFI_PTR32                     ResetSystem;
434 
435 #ifdef TIANO_EXTENSION_FLAG
436 	//
437 	// ////////////////////////////////////////////////////
438 	// Extended EFI Services
439 	//////////////////////////////////////////////////////
440 	//
441 	EFI_PTR32                     ReportStatusCode;
442 #endif
443 } __attribute__((aligned(8))) EFI_RUNTIME_SERVICES_32;
444 
445 typedef struct {
446 	EFI_TABLE_HEADER              Hdr;
447 
448 	//
449 	// Time services
450 	//
451 	EFI_PTR64                     GetTime;
452 	EFI_PTR64                     SetTime;
453 	EFI_PTR64                     GetWakeupTime;
454 	EFI_PTR64                     SetWakeupTime;
455 
456 	//
457 	// Virtual memory services
458 	//
459 	EFI_PTR64                     SetVirtualAddressMap;
460 	EFI_PTR64                     ConvertPointer;
461 
462 	//
463 	// Variable services
464 	//
465 	EFI_PTR64                     GetVariable;
466 	EFI_PTR64                     GetNextVariableName;
467 	EFI_PTR64                     SetVariable;
468 
469 	//
470 	// Misc
471 	//
472 	EFI_PTR64                     GetNextHighMonotonicCount;
473 	EFI_PTR64                     ResetSystem;
474 
475 #ifdef TIANO_EXTENSION_FLAG
476 	//
477 	// ////////////////////////////////////////////////////
478 	// Extended EFI Services
479 	//////////////////////////////////////////////////////
480 	//
481 	EFI_PTR64                     ReportStatusCode;
482 #endif
483 } __attribute__((aligned(8))) EFI_RUNTIME_SERVICES_64;
484 
485 //
486 // EFI Configuration Table
487 //
488 typedef struct {
489 	EFI_GUID  VendorGuid;
490 	EFI_PTR32 VendorTable;
491 } EFI_CONFIGURATION_TABLE_32;
492 
493 typedef struct {
494 	EFI_GUID  VendorGuid;
495 	EFI_PTR64 VendorTable;
496 } __attribute__((aligned(8))) EFI_CONFIGURATION_TABLE_64;
497 
498 //
499 // EFI System Table
500 //
501 #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249ULL
502 #define EFI_SYSTEM_TABLE_REVISION       ((EFI_SPECIFICATION_MAJOR_REVISION << 16) | (EFI_SPECIFICATION_MINOR_REVISION))
503 #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | 00)
504 #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | 02)
505 #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | 10)
506 
507 typedef struct EFI_SYSTEM_TABLE_32 {
508 	EFI_TABLE_HEADER              Hdr;
509 
510 	EFI_PTR32                     FirmwareVendor;
511 	EFI_UINT32                    FirmwareRevision;
512 
513 	EFI_HANDLE32                  ConsoleInHandle;
514 	EFI_PTR32                     ConIn;
515 
516 	EFI_HANDLE32                  ConsoleOutHandle;
517 	EFI_PTR32                     ConOut;
518 
519 	EFI_HANDLE32                  StandardErrorHandle;
520 	EFI_PTR32                     StdErr;
521 
522 	EFI_PTR32                     RuntimeServices;
523 	EFI_PTR32                     BootServices;
524 
525 	EFI_UINT32                    NumberOfTableEntries;
526 	EFI_PTR32                     ConfigurationTable;
527 } __attribute__((aligned(8))) EFI_SYSTEM_TABLE_32;
528 
529 typedef struct EFI_SYSTEM_TABLE_64 {
530 	EFI_TABLE_HEADER              Hdr;
531 
532 	EFI_PTR64                     FirmwareVendor;
533 	EFI_UINT32                    FirmwareRevision;
534 
535 	EFI_UINT32                    __pad;
536 
537 	EFI_HANDLE64                  ConsoleInHandle;
538 	EFI_PTR64                     ConIn;
539 
540 	EFI_HANDLE64                  ConsoleOutHandle;
541 	EFI_PTR64                     ConOut;
542 
543 	EFI_HANDLE64                  StandardErrorHandle;
544 	EFI_PTR64                     StdErr;
545 
546 	EFI_PTR64                     RuntimeServices;
547 	EFI_PTR64                     BootServices;
548 
549 	EFI_UINT64                    NumberOfTableEntries;
550 	EFI_PTR64                     ConfigurationTable;
551 } __attribute__((aligned(8))) EFI_SYSTEM_TABLE_64;
552 
553 #if defined(XNU_KERNEL_PRIVATE)
554 extern uint64_t efi_get_rsdp_physaddr(void);
555 #endif
556 
557 #endif /* _PEXPERT_I386_EFI_H */
558