176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _EFI_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _EFI_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EFI API 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The intention is to include near-verbatim copies of the EFI headers 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * required by gPXE. This is achieved using the import.pl script in 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * this directory. Run the import script to update the local copies 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of the headers: 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ./import.pl /path/to/edk2/edk2 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * where /path/to/edk2/edk2 is the path to your local checkout of the 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EFI Development Kit. 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note that import.pl will modify any #include lines in each imported 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * header to reflect its new location within the gPXE tree. It will 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * also tidy up the file by removing carriage return characters and 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * trailing whitespace. 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * At the time of writing, there are a few other modifications to 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * these headers that are present in my personal edk2 tree, that are 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * not yet committed back to the main edk2 repository. These 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * modifications are fixes for compilation on case-dependent 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * filesystems, compilation under -mrtd and -mregparm=3, etc. 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* EFI headers rudely redefine NULL */ 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#undef NULL 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* EFI headers expect ICC to define __GNUC__ */ 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined ( __ICC ) && ! defined ( __GNUC__ ) 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __GNUC__ 1 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Include the top-level EFI header files */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/efi/Uefi.h> 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/efi/PiDxe.h> 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Reset any trailing #pragma pack directives */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma pack(1) 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma pack() 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/tables.h> 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/uuid.h> 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An EFI protocol used by gPXE */ 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct efi_protocol { 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** GUID */ 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** EFI protocol GUID */ 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_GUID guid; 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** UUID structure understood by gPXE */ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union uuid uuid; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } u; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Variable containing pointer to protocol structure */ 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void **protocol; 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** EFI protocol table */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_PROTOCOLS __table ( struct efi_protocol, "efi_protocols" ) 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Declare an EFI protocol used by gPXE */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __efi_protocol __table_entry ( EFI_PROTOCOLS, 01 ) 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Declare an EFI protocol to be required by gPXE 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v _protocol EFI protocol name 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v _ptr Pointer to protocol instance 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_REQUIRE_PROTOCOL( _protocol, _ptr ) \ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct efi_protocol __ ## _protocol __efi_protocol = { \ 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .u.guid = _protocol ## _GUID, \ 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .protocol = ( ( void ** ) ( void * ) \ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \ 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (_ptr) : (_ptr) ) ), \ 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An EFI configuration table used by gPXE */ 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct efi_config_table { 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** GUID */ 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** EFI configuration table GUID */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_GUID guid; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** UUID structure understood by gPXE */ 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union uuid uuid; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } u; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Variable containing pointer to configuration table */ 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void **table; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Table is required for operation */ 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int required; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** EFI configuration table table */ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_CONFIG_TABLES \ 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __table ( struct efi_config_table, "efi_config_tables" ) 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Declare an EFI configuration table used by gPXE */ 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __efi_config_table __table_entry ( EFI_CONFIG_TABLES, 01 ) 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Declare an EFI configuration table to be used by gPXE 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v _table EFI configuration table name 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v _ptr Pointer to configuration table 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v _required Table is required for operation 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_USE_TABLE( _table, _ptr, _required ) \ 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct efi_config_table __ ## _table __efi_config_table = { \ 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .u.guid = _table ## _GUID, \ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .table = ( ( void ** ) ( void * ) (_ptr) ), \ 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .required = (_required), \ 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Convert a gPXE status code to an EFI status code 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * FIXME: actually perform some kind of conversion. gPXE error codes 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * will be detected as EFI error codes; both have the top bit set, and 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the success return code is zero for both. Anything that just 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * reports a numerical error will be OK, anything attempting to 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * interpret the value or to display a text equivalent will be 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * screwed. 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define RC_TO_EFIRC( rc ) (rc) 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Convert an EFI status code to a gPXE status code 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * FIXME: as above 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFIRC_TO_RC( efirc ) (efirc) 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern EFI_HANDLE efi_image_handle; 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern EFI_SYSTEM_TABLE *efi_systab; 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern const char * efi_strerror ( EFI_STATUS efirc ); 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern EFI_STATUS efi_init ( EFI_HANDLE image_handle, 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_SYSTEM_TABLE *systab ); 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int efi_snp_install ( void ); 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _EFI_H */ 143