@ -58,8 +58,11 @@ static void *dp_alloc(size_t sz)
{
void * buf ;
if ( efi_allocate_pool ( EFI_ALLOCATE_ANY_PAGES , sz , & buf ) ! = EFI_SUCCESS )
if ( efi_allocate_pool ( EFI_ALLOCATE_ANY_PAGES , sz , & buf ) ! =
EFI_SUCCESS ) {
debug ( " EFI: ERROR: out of memory in %s \n " , __func__ ) ;
return NULL ;
}
return buf ;
}
@ -227,6 +230,8 @@ struct efi_device_path *efi_dp_dup(const struct efi_device_path *dp)
return NULL ;
ndp = dp_alloc ( sz ) ;
if ( ! ndp )
return NULL ;
memcpy ( ndp , dp , sz ) ;
return ndp ;
@ -246,6 +251,8 @@ struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
unsigned sz1 = efi_dp_size ( dp1 ) ;
unsigned sz2 = efi_dp_size ( dp2 ) ;
void * p = dp_alloc ( sz1 + sz2 + sizeof ( END ) ) ;
if ( ! p )
return NULL ;
memcpy ( p , dp1 , sz1 ) ;
memcpy ( p + sz1 , dp2 , sz2 ) ;
memcpy ( p + sz1 + sz2 , & END , sizeof ( END ) ) ;
@ -267,6 +274,8 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
} else if ( ! dp ) {
unsigned sz = node - > length ;
void * p = dp_alloc ( sz + sizeof ( END ) ) ;
if ( ! p )
return NULL ;
memcpy ( p , node , sz ) ;
memcpy ( p + sz , & END , sizeof ( END ) ) ;
ret = p ;
@ -274,6 +283,8 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
/* both dp and node are non-null */
unsigned sz = efi_dp_size ( dp ) ;
void * p = dp_alloc ( sz + node - > length + sizeof ( END ) ) ;
if ( ! p )
return NULL ;
memcpy ( p , dp , sz ) ;
memcpy ( p + sz , node , node - > length ) ;
memcpy ( p + sz + node - > length , & END , sizeof ( END ) ) ;
@ -435,6 +446,8 @@ struct efi_device_path *efi_dp_from_dev(struct udevice *dev)
void * buf , * start ;
start = buf = dp_alloc ( dp_size ( dev ) + sizeof ( END ) ) ;
if ( ! buf )
return NULL ;
buf = dp_fill ( buf , dev ) ;
* ( ( struct efi_device_path * ) buf ) = END ;
@ -576,6 +589,8 @@ struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
void * buf , * start ;
start = buf = dp_alloc ( dp_part_size ( desc , part ) + sizeof ( END ) ) ;
if ( ! buf )
return NULL ;
buf = dp_part_fill ( buf , desc , part ) ;
@ -614,6 +629,8 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
dpsize + = fpsize ;
start = buf = dp_alloc ( dpsize + sizeof ( END ) ) ;
if ( ! buf )
return NULL ;
if ( desc )
buf = dp_part_fill ( buf , desc , part ) ;
@ -648,6 +665,8 @@ struct efi_device_path *efi_dp_from_eth(void)
dpsize + = sizeof ( * ndp ) ;
start = buf = dp_alloc ( dpsize + sizeof ( END ) ) ;
if ( ! buf )
return NULL ;
# ifdef CONFIG_DM_ETH
buf = dp_fill ( buf , eth_get_dev ( ) ) ;
@ -678,6 +697,8 @@ struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
void * buf , * start ;
start = buf = dp_alloc ( sizeof ( * mdp ) + sizeof ( END ) ) ;
if ( ! buf )
return NULL ;
mdp = buf ;
mdp - > dp . type = DEVICE_PATH_TYPE_HARDWARE_DEVICE ;
@ -697,22 +718,31 @@ struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
* Helper to split a full device path ( containing both device and file
* parts ) into it ' s constituent parts .
*/
void efi_dp_split_file_path ( struct efi_device_path * full_path ,
struct efi_device_path * * device_path ,
struct efi_device_path * * file_path )
efi_status_t efi_dp_split_file_path ( struct efi_device_path * full_path ,
struct efi_device_path * * device_path ,
struct efi_device_path * * file_path )
{
struct efi_device_path * p , * dp , * fp ;
* device_path = NULL ;
* file_path = NULL ;
dp = efi_dp_dup ( full_path ) ;
if ( ! dp )
return EFI_OUT_OF_RESOURCES ;
p = dp ;
while ( ! EFI_DP_TYPE ( p , MEDIA_DEVICE , FILE_PATH ) )
while ( ! EFI_DP_TYPE ( p , MEDIA_DEVICE , FILE_PATH ) ) {
p = efi_dp_next ( p ) ;
if ( ! p )
return EFI_OUT_OF_RESOURCES ;
}
fp = efi_dp_dup ( p ) ;
if ( ! fp )
return EFI_OUT_OF_RESOURCES ;
p - > type = DEVICE_PATH_TYPE_END ;
p - > sub_type = DEVICE_PATH_SUB_TYPE_END ;
p - > length = sizeof ( * p ) ;
* device_path = dp ;
* file_path = fp ;
return EFI_SUCCESS ;
}