[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / include / gpxe / efi / efi.h
1 #ifndef _EFI_H
2 #define _EFI_H
3
4 /** @file
5  *
6  * EFI API
7  *
8  * The intention is to include near-verbatim copies of the EFI headers
9  * required by gPXE.  This is achieved using the import.pl script in
10  * this directory.  Run the import script to update the local copies
11  * of the headers:
12  *
13  *     ./import.pl /path/to/edk2/edk2
14  *
15  * where /path/to/edk2/edk2 is the path to your local checkout of the
16  * EFI Development Kit.
17  *
18  * Note that import.pl will modify any #include lines in each imported
19  * header to reflect its new location within the gPXE tree.  It will
20  * also tidy up the file by removing carriage return characters and
21  * trailing whitespace.
22  *
23  *
24  * At the time of writing, there are a few other modifications to
25  * these headers that are present in my personal edk2 tree, that are
26  * not yet committed back to the main edk2 repository.  These
27  * modifications are fixes for compilation on case-dependent
28  * filesystems, compilation under -mrtd and -mregparm=3, etc.
29  */
30
31 /* Include the top-level EFI header file */
32 #include <gpxe/efi/Uefi.h>
33
34 /* Reset any trailing #pragma pack directives */
35 #pragma pack()
36
37 #include <gpxe/tables.h>
38 #include <gpxe/uuid.h>
39
40 /** An EFI protocol used by gPXE */
41 struct efi_protocol {
42         union {
43                 /** EFI protocol GUID */
44                 EFI_GUID guid;
45                 /** UUID structure understood by gPXE */
46                 union uuid uuid;
47         } u;
48         /** Variable containing pointer to protocol structure */
49         void **protocol;
50 };
51
52 /** Declare an EFI protocol used by gPXE */
53 #define __efi_protocol \
54         __table ( struct efi_protocol, efi_protocols, 01 )
55
56 /** Declare an EFI protocol to be required by gPXE
57  *
58  * @v _protocol         EFI protocol name
59  * @v _ptr              Pointer to protocol instance
60  */
61 #define EFI_REQUIRE_PROTOCOL( _protocol, _ptr )                              \
62         struct efi_protocol __ ## _protocol __efi_protocol = {               \
63                 .u.guid = _protocol ## _GUID,                                \
64                 .protocol = ( ( void ** ) ( void * )                         \
65                               ( ( (_ptr) == ( ( _protocol ** ) NULL ) ) ?    \
66                                 (_ptr) : (_ptr) ) ),                         \
67         }
68
69 /** Convert a gPXE status code to an EFI status code
70  *
71  * FIXME: actually perform some kind of conversion.  gPXE error codes
72  * will be detected as EFI error codes; both have the top bit set, and
73  * the success return code is zero for both.  Anything that just
74  * reports a numerical error will be OK, anything attempting to
75  * interpret the value or to display a text equivalent will be
76  * screwed.
77  */
78 #define RC_TO_EFIRC( rc ) (rc)
79
80 /** Convert an EFI status code to a gPXE status code
81  *
82  * FIXME: as above
83  */
84 #define EFIRC_TO_RC( efirc ) (efirc)
85
86 extern EFI_HANDLE efi_image_handle;
87 extern EFI_SYSTEM_TABLE *efi_systab;
88
89 #endif /* _EFI_H */