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