mirror of https://github.com/ipxe/ipxe.git
[efi] Provide efi_devpath_len()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/41/head
parent
4a7d691697
commit
7107334391
|
@ -1492,15 +1492,14 @@ static int usbio_path ( struct usbio_device *usbio ) {
|
||||||
path = u.interface;
|
path = u.interface;
|
||||||
|
|
||||||
/* Locate end of device path and sanity check */
|
/* Locate end of device path and sanity check */
|
||||||
end = efi_devpath_end ( path );
|
len = efi_devpath_len ( path );
|
||||||
len = ( ( ( void * ) end ) - ( ( void * ) path ) );
|
|
||||||
if ( len < sizeof ( *usbpath ) ) {
|
if ( len < sizeof ( *usbpath ) ) {
|
||||||
DBGC ( usbio, "USBIO %s underlength device path\n",
|
DBGC ( usbio, "USBIO %s underlength device path\n",
|
||||||
efi_handle_name ( handle ) );
|
efi_handle_name ( handle ) );
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto err_underlength;
|
goto err_underlength;
|
||||||
}
|
}
|
||||||
usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
|
usbpath = ( ( ( void * ) path ) + len - sizeof ( *usbpath ) );
|
||||||
if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
|
if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
|
||||||
( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
|
( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
|
||||||
DBGC ( usbio, "USBIO %s not a USB device path: ",
|
DBGC ( usbio, "USBIO %s not a USB device path: ",
|
||||||
|
|
|
@ -73,8 +73,7 @@ efi_image_path ( struct image *image, EFI_DEVICE_PATH_PROTOCOL *parent ) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/* Calculate device path lengths */
|
/* Calculate device path lengths */
|
||||||
end = efi_devpath_end ( parent );
|
prefix_len = efi_devpath_len ( parent );
|
||||||
prefix_len = ( ( void * ) end - ( void * ) parent );
|
|
||||||
name_len = strlen ( image->name );
|
name_len = strlen ( image->name );
|
||||||
filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
|
filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
|
||||||
( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
|
( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
|
||||||
|
|
|
@ -15,6 +15,7 @@ struct device;
|
||||||
|
|
||||||
extern EFI_DEVICE_PATH_PROTOCOL *
|
extern EFI_DEVICE_PATH_PROTOCOL *
|
||||||
efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path );
|
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,
|
extern int efi_locate_device ( EFI_HANDLE device, EFI_GUID *protocol,
|
||||||
EFI_HANDLE *parent );
|
EFI_HANDLE *parent );
|
||||||
extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );
|
extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );
|
||||||
|
|
|
@ -359,9 +359,6 @@ const __attribute__ (( pure )) char *
|
||||||
efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
|
efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
|
||||||
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
|
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
|
||||||
static char text[256];
|
static char text[256];
|
||||||
void *start;
|
|
||||||
void *end;
|
|
||||||
size_t max_len;
|
|
||||||
size_t len;
|
size_t len;
|
||||||
CHAR16 *wtext;
|
CHAR16 *wtext;
|
||||||
|
|
||||||
|
@ -374,13 +371,8 @@ efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
|
||||||
/* If we have no DevicePathToText protocol then use a raw hex string */
|
/* If we have no DevicePathToText protocol then use a raw hex string */
|
||||||
if ( ! efidpt ) {
|
if ( ! efidpt ) {
|
||||||
DBG ( "[No DevicePathToText]" );
|
DBG ( "[No DevicePathToText]" );
|
||||||
start = path;
|
len = efi_devpath_len ( path );
|
||||||
end = efi_devpath_end ( path );
|
base16_encode ( path, len, text, sizeof ( text ) );
|
||||||
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 ) );
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1033,8 +1033,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate the new device path */
|
/* Allocate the new device path */
|
||||||
path_end = efi_devpath_end ( path.path );
|
path_prefix_len = efi_devpath_len ( path.path );
|
||||||
path_prefix_len = ( ( ( void * ) path_end ) - ( ( void * ) path.path ));
|
|
||||||
snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) +
|
snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) +
|
||||||
sizeof ( *path_end ) );
|
sizeof ( *path_end ) );
|
||||||
if ( ! snpdev->path ) {
|
if ( ! snpdev->path ) {
|
||||||
|
|
|
@ -50,6 +50,18 @@ EFI_DEVICE_PATH_PROTOCOL * efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path ) {
|
||||||
return 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
|
* Locate parent device supporting a given protocol
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue