@ -34,17 +34,30 @@ static struct efi_device_path_file_path bootefi_image_path[] = {
}
} ;
static struct efi_device_path_file_path bootefi_device_path [ ] = {
{
. dp . type = DEVICE_PATH_TYPE_MEDIA_DEVICE ,
. dp . sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH ,
. dp . length = sizeof ( bootefi_image_path [ 0 ] ) ,
. str = { ' b ' , ' o ' , ' o ' , ' t ' , ' e ' , ' f ' , ' i ' } ,
} , {
. dp . type = DEVICE_PATH_TYPE_END ,
. dp . sub_type = DEVICE_PATH_SUB_TYPE_END ,
. dp . length = sizeof ( bootefi_image_path [ 0 ] ) ,
}
} ;
static efi_status_t bootefi_open_dp ( void * handle , efi_guid_t * protocol ,
void * * protocol_interface , void * agent_handle ,
void * controller_handle , uint32_t attributes )
{
* protocol_interface = bootefi_image_path ;
* protocol_interface = bootefi_devic e_path ;
return EFI_SUCCESS ;
}
/* The EFI loaded_image interface for the image executed via "bootefi" */
static struct efi_loaded_image loaded_image_info = {
. device_handle = bootefi_image_path ,
. device_handle = bootefi_devic e_path ,
. file_path = bootefi_image_path ,
} ;
@ -63,7 +76,7 @@ static struct efi_object loaded_image_info_obj = {
{
/*
* When asking for the device path interface , return
* bootefi_imag e_path
* bootefi_devic e_path
*/
. guid = & efi_guid_device_path ,
. open = & bootefi_open_dp ,
@ -73,11 +86,11 @@ static struct efi_object loaded_image_info_obj = {
/* The EFI object struct for the device the "bootefi" image was loaded from */
static struct efi_object bootefi_device_obj = {
. handle = bootefi_imag e_path ,
. handle = bootefi_devic e_path ,
. protocols = {
{
/* When asking for the device path interface, return
* bootefi_imag e_path */
* bootefi_devic e_path */
. guid = & efi_guid_device_path ,
. open = & bootefi_open_dp ,
}
@ -192,7 +205,7 @@ U_BOOT_CMD(
bootefi_help_text
) ;
void efi_set_bootdev ( const char * dev , const char * devnr )
void efi_set_bootdev ( const char * dev , const char * devnr , const char * path )
{
__maybe_unused struct blk_desc * desc ;
char devname [ 16 ] = { 0 } ; /* dp->str is u16[16] long */
@ -217,7 +230,12 @@ void efi_set_bootdev(const char *dev, const char *devnr)
if ( colon )
* colon = ' \0 ' ;
/* Patch the bootefi_image_path to the target device */
/* Patch bootefi_device_path to the target device */
memset ( bootefi_device_path [ 0 ] . str , 0 , sizeof ( bootefi_device_path [ 0 ] . str ) ) ;
ascii2unicode ( bootefi_device_path [ 0 ] . str , devname ) ;
/* Patch bootefi_image_path to the target file path */
memset ( bootefi_image_path [ 0 ] . str , 0 , sizeof ( bootefi_image_path [ 0 ] . str ) ) ;
snprintf ( devname , sizeof ( devname ) , " %s " , path ) ;
ascii2unicode ( bootefi_image_path [ 0 ] . str , devname ) ;
}