blob: f4459b74751a69f507dfc44077d9001b3af8c97a [file] [log] [blame]
#ifndef _EFI_H
#define _EFI_H
/** @file
*
* EFI API
*
* The intention is to include near-verbatim copies of the EFI headers
* required by gPXE. This is achieved using the import.pl script in
* this directory. Run the import script to update the local copies
* of the headers:
*
* ./import.pl /path/to/edk2/edk2
*
* where /path/to/edk2/edk2 is the path to your local checkout of the
* EFI Development Kit.
*
* Note that import.pl will modify any #include lines in each imported
* header to reflect its new location within the gPXE tree. It will
* also tidy up the file by removing carriage return characters and
* trailing whitespace.
*
*
* At the time of writing, there are a few other modifications to
* these headers that are present in my personal edk2 tree, that are
* not yet committed back to the main edk2 repository. These
* modifications are fixes for compilation on case-dependent
* filesystems, compilation under -mrtd and -mregparm=3, etc.
*/
/* EFI headers rudely redefine NULL */
#undef NULL
/* EFI headers expect ICC to define __GNUC__ */
#if defined ( __ICC ) && ! defined ( __GNUC__ )
#define __GNUC__ 1
#endif
/* Include the top-level EFI header files */
#include <gpxe/efi/Uefi.h>
#include <gpxe/efi/PiDxe.h>
/* Reset any trailing #pragma pack directives */
#pragma pack(1)
#pragma pack()
#include <gpxe/tables.h>
#include <gpxe/uuid.h>
/** An EFI protocol used by gPXE */
struct efi_protocol {
/** GUID */
union {
/** EFI protocol GUID */
EFI_GUID guid;
/** UUID structure understood by gPXE */
union uuid uuid;
} u;
/** Variable containing pointer to protocol structure */
void **protocol;
};
/** EFI protocol table */
#define EFI_PROTOCOLS __table ( struct efi_protocol, "efi_protocols" )
/** Declare an EFI protocol used by gPXE */
#define __efi_protocol __table_entry ( EFI_PROTOCOLS, 01 )
/** Declare an EFI protocol to be required by gPXE
*
* @v _protocol EFI protocol name
* @v _ptr Pointer to protocol instance
*/
#define EFI_REQUIRE_PROTOCOL( _protocol, _ptr ) \
struct efi_protocol __ ## _protocol __efi_protocol = { \
.u.guid = _protocol ## _GUID, \
.protocol = ( ( void ** ) ( void * ) \
( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \
(_ptr) : (_ptr) ) ), \
}
/** An EFI configuration table used by gPXE */
struct efi_config_table {
/** GUID */
union {
/** EFI configuration table GUID */
EFI_GUID guid;
/** UUID structure understood by gPXE */
union uuid uuid;
} u;
/** Variable containing pointer to configuration table */
void **table;
/** Table is required for operation */
int required;
};
/** EFI configuration table table */
#define EFI_CONFIG_TABLES \
__table ( struct efi_config_table, "efi_config_tables" )
/** Declare an EFI configuration table used by gPXE */
#define __efi_config_table __table_entry ( EFI_CONFIG_TABLES, 01 )
/** Declare an EFI configuration table to be used by gPXE
*
* @v _table EFI configuration table name
* @v _ptr Pointer to configuration table
* @v _required Table is required for operation
*/
#define EFI_USE_TABLE( _table, _ptr, _required ) \
struct efi_config_table __ ## _table __efi_config_table = { \
.u.guid = _table ## _GUID, \
.table = ( ( void ** ) ( void * ) (_ptr) ), \
.required = (_required), \
}
/** Convert a gPXE status code to an EFI status code
*
* FIXME: actually perform some kind of conversion. gPXE error codes
* will be detected as EFI error codes; both have the top bit set, and
* the success return code is zero for both. Anything that just
* reports a numerical error will be OK, anything attempting to
* interpret the value or to display a text equivalent will be
* screwed.
*/
#define RC_TO_EFIRC( rc ) (rc)
/** Convert an EFI status code to a gPXE status code
*
* FIXME: as above
*/
#define EFIRC_TO_RC( efirc ) (efirc)
extern EFI_HANDLE efi_image_handle;
extern EFI_SYSTEM_TABLE *efi_systab;
extern const char * efi_strerror ( EFI_STATUS efirc );
extern EFI_STATUS efi_init ( EFI_HANDLE image_handle,
EFI_SYSTEM_TABLE *systab );
extern int efi_snp_install ( void );
#endif /* _EFI_H */