path = u.interface;
/* Locate end of device path and sanity check */
- end = efi_devpath_end ( path );
- len = ( ( ( void * ) end ) - ( ( void * ) path ) );
+ len = efi_devpath_len ( path );
if ( len < sizeof ( *usbpath ) ) {
DBGC ( usbio, "USBIO %s underlength device path\n",
efi_handle_name ( handle ) );
rc = -EINVAL;
goto err_underlength;
}
- usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
+ usbpath = ( ( ( void * ) path ) + len - sizeof ( *usbpath ) );
if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
DBGC ( usbio, "USBIO %s not a USB device path: ",
size_t len;
/* Calculate device path lengths */
- end = efi_devpath_end ( parent );
- prefix_len = ( ( void * ) end - ( void * ) parent );
+ prefix_len = efi_devpath_len ( parent );
name_len = strlen ( image->name );
filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
extern EFI_DEVICE_PATH_PROTOCOL *
efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path );
+extern size_t efi_devpath_len ( EFI_DEVICE_PATH_PROTOCOL *path );
extern int efi_locate_device ( EFI_HANDLE device, EFI_GUID *protocol,
EFI_HANDLE *parent );
extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );
efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
static char text[256];
- void *start;
- void *end;
- size_t max_len;
size_t len;
CHAR16 *wtext;
/* If we have no DevicePathToText protocol then use a raw hex string */
if ( ! efidpt ) {
DBG ( "[No DevicePathToText]" );
- start = path;
- end = efi_devpath_end ( path );
- len = ( end - start );
- max_len = ( ( sizeof ( text ) - 1 /* NUL */ ) / 2 /* "xx" */ );
- if ( len > max_len )
- len = max_len;
- base16_encode ( start, len, text, sizeof ( text ) );
+ len = efi_devpath_len ( path );
+ base16_encode ( path, len, text, sizeof ( text ) );
return text;
}
}
/* Allocate the new device path */
- path_end = efi_devpath_end ( path.path );
- path_prefix_len = ( ( ( void * ) path_end ) - ( ( void * ) path.path ));
+ path_prefix_len = efi_devpath_len ( path.path );
snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) +
sizeof ( *path_end ) );
if ( ! snpdev->path ) {
return path;
}
+/**
+ * Find length of device path (excluding terminator)
+ *
+ * @v path Path to device
+ * @ret path_len Length of device path
+ */
+size_t efi_devpath_len ( EFI_DEVICE_PATH_PROTOCOL *path ) {
+ EFI_DEVICE_PATH_PROTOCOL *end = efi_devpath_end ( path );
+
+ return ( ( ( void * ) end ) - ( ( void * ) path ) );
+}
+
/**
* Locate parent device supporting a given protocol
*