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