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