[efi] Define an interface operation to describe using an EFI device path

Allow arbitrary objects to support describing themselves using an EFI
device path.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/171/head
Michael Brown 2020-10-16 15:09:52 +01:00
parent 2bf0fd39ca
commit 2091288eaa
2 changed files with 31 additions and 0 deletions

View File

@ -9,6 +9,7 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/interface.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/DevicePath.h>
@ -16,4 +17,8 @@ extern EFI_DEVICE_PATH_PROTOCOL *
efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path );
extern size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path );
extern EFI_DEVICE_PATH_PROTOCOL * efi_describe ( struct interface *interface );
#define efi_describe_TYPE( object_type ) \
typeof ( EFI_DEVICE_PATH_PROTOCOL * ( object_type ) )
#endif /* _IPXE_EFI_PATH_H */

View File

@ -55,3 +55,29 @@ size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path ) {
return ( ( ( void * ) end ) - ( ( void * ) path ) );
}
/**
* Describe object as an EFI device path
*
* @v intf Interface
* @ret path EFI device path, or NULL
*
* The caller is responsible for eventually calling free() on the
* allocated device path.
*/
EFI_DEVICE_PATH_PROTOCOL * efi_describe ( struct interface *intf ) {
struct interface *dest;
efi_describe_TYPE ( void * ) *op =
intf_get_dest_op ( intf, efi_describe, &dest );
void *object = intf_object ( dest );
EFI_DEVICE_PATH_PROTOCOL *path;
if ( op ) {
path = op ( object );
} else {
path = NULL;
}
intf_put ( dest );
return path;
}