]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Add efi_path_terminate() utility function
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 Jan 2023 19:07:35 +0000 (19:07 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 Jan 2023 19:27:11 +0000 (19:27 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/image/efi_image.c
src/include/ipxe/efi/efi_path.h
src/interface/efi/efi_block.c
src/interface/efi/efi_path.c
src/interface/efi/efi_snp_hii.c

index 3c98decbf61a400e607100159aba295e73cd2576..66a19524be2f2a618f333e62dc278729b4507959 100644 (file)
@@ -96,9 +96,7 @@ efi_image_path ( struct image *image, EFI_DEVICE_PATH_PROTOCOL *parent ) {
        efi_snprintf ( filepath->PathName, ( name_len + 1 /* NUL */ ),
                       "%s", image->name );
        end = ( ( ( void * ) filepath ) + filepath_len );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        return path;
 }
index 9dea74b5a3c07db71665e3a7d3f42917259816d6..98b922ac1bb7d5bd7b488e430f429828503f8d02 100644 (file)
@@ -21,6 +21,19 @@ struct fcp_description;
 struct ib_srp_device;
 struct usb_function;
 
+/**
+ * Terminate device path
+ *
+ * @v end              End of device path to fill in
+ */
+static inline void efi_path_terminate ( EFI_DEVICE_PATH_PROTOCOL *end ) {
+
+       end->Type = END_DEVICE_PATH_TYPE;
+       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
+       end->Length[0] = sizeof ( *end );
+       end->Length[1] = 0;
+}
+
 extern EFI_DEVICE_PATH_PROTOCOL *
 efi_path_next ( EFI_DEVICE_PATH_PROTOCOL *path );
 extern EFI_DEVICE_PATH_PROTOCOL *
index 74cf7c0c0766486bbc51f077f6b62eb1457e55cb..cb73260d5a59b751e96c714f6c4682a8f4c9b1b0 100644 (file)
@@ -582,9 +582,7 @@ static int efi_block_boot_image ( struct san_device *sandev, EFI_HANDLE handle,
                         sizeof ( efi_block_boot_filename ) );
        }
        end = ( ( ( void * ) filepath ) + filepath_len );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
        DBGC ( sandev, "EFIBLK %#02x trying to load %s\n",
               sandev->drive, efi_devpath_text ( boot_path ) );
 
index fb0f3059d308fe65385769ebff9bcaabd88ff009..50027b75a681bc01c08960b5ea9170f47ef7d4bb 100644 (file)
@@ -161,9 +161,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_paths ( EFI_DEVICE_PATH_PROTOCOL *first, ... ) {
        }
        va_end ( args );
        end = dst;
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        return path;
 }
@@ -223,9 +221,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path ( struct net_device *netdev ) {
        } else {
                end = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
        }
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        return path;
 }
@@ -265,9 +261,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_uri_path ( struct uri *uri ) {
        uripath->Header.Length[1] = ( uripath_len >> 8 );
        format_uri ( uri, uripath->Uri, uri_len );
        end = ( ( ( void * ) path ) + uripath_len );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        return path;
 }
@@ -324,9 +318,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_iscsi_path ( struct iscsi_session *iscsi ) {
        name = ( ( ( void * ) iscsipath ) + sizeof ( *iscsipath ) );
        memcpy ( name, iscsi->target_iqn, name_len );
        end = ( ( ( void * ) name ) + name_len );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        /* Free temporary paths */
        free ( netpath );
@@ -366,9 +358,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_aoe_path ( struct aoe_device *aoedev ) {
        satapath.sata.Header.Length[0] = sizeof ( satapath.sata );
        satapath.sata.HBAPortNumber = aoedev->major;
        satapath.sata.PortMultiplierPortNumber = aoedev->minor;
-       satapath.end.Type = END_DEVICE_PATH_TYPE;
-       satapath.end.SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       satapath.end.Length[0] = sizeof ( satapath.end );
+       efi_path_terminate ( &satapath.end );
 
        /* Construct overall device path */
        path = efi_paths ( netpath, &satapath, NULL );
@@ -409,9 +399,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_fcp_path ( struct fcp_description *desc ) {
        path->fc.Header.Length[0] = sizeof ( path->fc );
        memcpy ( path->fc.WWN, &desc->wwn, sizeof ( path->fc.WWN ) );
        memcpy ( path->fc.Lun, &desc->lun, sizeof ( path->fc.Lun ) );
-       path->end.Type = END_DEVICE_PATH_TYPE;
-       path->end.SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       path->end.Length[0] = sizeof ( path->end );
+       efi_path_terminate ( &path->end );
 
        return &path->fc.Header;
 }
@@ -463,9 +451,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_ib_srp_path ( struct ib_srp_device *ib_srp ) {
        memcpy ( &ibpath->DeviceId, &id->ib.id_ext,
                 sizeof ( ibpath->DeviceId ) );
        end = ( ( ( void * ) ibpath ) + sizeof ( *ibpath ) );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
 
        return path;
 }
@@ -511,9 +497,7 @@ EFI_DEVICE_PATH_PROTOCOL * efi_usb_path ( struct usb_function *func ) {
        /* Construct device path */
        memcpy ( path, efidev->path, prefix_len );
        end = ( ( ( void * ) path ) + len - sizeof ( *end ) );
-       end->Type = END_DEVICE_PATH_TYPE;
-       end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       end->Length[0] = sizeof ( *end );
+       efi_path_terminate ( end );
        usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
        usbpath->InterfaceNumber = func->interface[0];
        for ( ; usb ; usbpath--, usb = usb->port->hub->usb ) {
index 5d5f80cd7991e3048fa85c8273d2651886bb99a5..8b65c8a7882d03792aa0ba619fbabe8592ca8bda 100644 (file)
@@ -704,9 +704,7 @@ int efi_snp_hii_install ( struct efi_snp_device *snpdev ) {
        vendor_path->Header.Length[0] = sizeof ( *vendor_path );
        efi_snp_hii_random_guid ( &vendor_path->Guid );
        path_end = ( ( void * ) ( vendor_path + 1 ) );
-       path_end->Type = END_DEVICE_PATH_TYPE;
-       path_end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
-       path_end->Length[0] = sizeof ( *path_end );
+       efi_path_terminate ( path_end );
 
        /* Create device path and child handle for HII association */
        if ( ( efirc = bs->InstallMultipleProtocolInterfaces (