Skip to content

Commit

Permalink
[efi] Define an interface operation to describe using an EFI device path
Browse files Browse the repository at this point in the history
Allow arbitrary objects to support describing themselves using an EFI
device path.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Oct 16, 2020
1 parent 2bf0fd3 commit 2091288
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/include/ipxe/efi/efi_path.h
Expand Up @@ -9,11 +9,16 @@

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

#include <ipxe/interface.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/DevicePath.h>

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 */
26 changes: 26 additions & 0 deletions src/interface/efi/efi_path.c
Expand Up @@ -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;
}

0 comments on commit 2091288

Please sign in to comment.