[efi] Synchronise EFI header files
[people/meteger/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 /* EFI headers rudely redefine NULL */
25 #undef NULL
26
27 /* EFI headers expect ICC to define __GNUC__ */
28 #if defined ( __ICC ) && ! defined ( __GNUC__ )
29 #define __GNUC__ 1
30 #endif
31
32 /* EFI headers think your compiler uses the MS ABI by default on X64 */
33 #if __x86_64__
34 #define EFIAPI __attribute__((ms_abi))
35 #endif
36
37 /* EFI headers assume regparm(0) on i386, but that is not the case for gPXE */
38 #if __i386__
39 #define EFIAPI __attribute__((cdecl,regparm(0)))
40 #endif
41
42 /* Include the top-level EFI header files */
43 #include <gpxe/efi/Uefi.h>
44 #include <gpxe/efi/PiDxe.h>
45 #include <gpxe/efi/Protocol/LoadedImage.h>
46
47 /* Reset any trailing #pragma pack directives */
48 #pragma pack(1)
49 #pragma pack()
50
51 #include <gpxe/tables.h>
52 #include <gpxe/uuid.h>
53
54 /** An EFI protocol used by gPXE */
55 struct efi_protocol {
56         /** GUID */
57         union {
58                 /** EFI protocol GUID */
59                 EFI_GUID guid;
60                 /** UUID structure understood by gPXE */
61                 union uuid uuid;
62         } u;
63         /** Variable containing pointer to protocol structure */
64         void **protocol;
65 };
66
67 /** EFI protocol table */
68 #define EFI_PROTOCOLS __table ( struct efi_protocol, "efi_protocols" )
69
70 /** Declare an EFI protocol used by gPXE */
71 #define __efi_protocol __table_entry ( EFI_PROTOCOLS, 01 )
72
73 /** Declare an EFI protocol to be required by gPXE
74  *
75  * @v _protocol         EFI protocol name
76  * @v _ptr              Pointer to protocol instance
77  */
78 #define EFI_REQUIRE_PROTOCOL( _protocol, _ptr )                              \
79         struct efi_protocol __ ## _protocol __efi_protocol = {               \
80                 .u.guid = _protocol ## _GUID,                                \
81                 .protocol = ( ( void ** ) ( void * )                         \
82                               ( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ?  \
83                                 (_ptr) : (_ptr) ) ),                         \
84         }
85
86 /** An EFI configuration table used by gPXE */
87 struct efi_config_table {
88         /** GUID */
89         union {
90                 /** EFI configuration table GUID */
91                 EFI_GUID guid;
92                 /** UUID structure understood by gPXE */
93                 union uuid uuid;
94         } u;
95         /** Variable containing pointer to configuration table */
96         void **table;
97         /** Table is required for operation */
98         int required;
99 };
100
101 /** EFI configuration table table */
102 #define EFI_CONFIG_TABLES \
103         __table ( struct efi_config_table, "efi_config_tables" )
104
105 /** Declare an EFI configuration table used by gPXE */
106 #define __efi_config_table __table_entry ( EFI_CONFIG_TABLES, 01 )
107
108 /** Declare an EFI configuration table to be used by gPXE
109  *
110  * @v _table            EFI configuration table name
111  * @v _ptr              Pointer to configuration table
112  * @v _required         Table is required for operation
113  */
114 #define EFI_USE_TABLE( _table, _ptr, _required )                             \
115         struct efi_config_table __ ## _table __efi_config_table = {          \
116                 .u.guid = _table ## _GUID,                                   \
117                 .table = ( ( void ** ) ( void * ) (_ptr) ),                  \
118                 .required = (_required),                                     \
119         }
120
121 /** Convert a gPXE status code to an EFI status code
122  *
123  * FIXME: actually perform some kind of conversion.  gPXE error codes
124  * will be detected as EFI error codes; both have the top bit set, and
125  * the success return code is zero for both.  Anything that just
126  * reports a numerical error will be OK, anything attempting to
127  * interpret the value or to display a text equivalent will be
128  * screwed.
129  */
130 #define RC_TO_EFIRC( rc ) (rc)
131
132 /** Convert an EFI status code to a gPXE status code
133  *
134  * FIXME: as above
135  */
136 #define EFIRC_TO_RC( efirc ) (efirc)
137
138 extern EFI_HANDLE efi_image_handle;
139 extern EFI_LOADED_IMAGE_PROTOCOL *efi_loaded_image;
140 extern EFI_SYSTEM_TABLE *efi_systab;
141
142 extern const char * efi_strerror ( EFI_STATUS efirc );
143 extern EFI_STATUS efi_init ( EFI_HANDLE image_handle,
144                              EFI_SYSTEM_TABLE *systab );
145 extern int efi_snp_install ( void );
146
147 #endif /* _EFI_H */