mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 19:34:35 +00:00
efi_loader: resequence functions in efi_boottime.c
For implementing support for the EFI_LOAD_FILE_PROTOCOL in the LoadImage() service we will have to call the LocateDevicePath() service. To avoid a forward declaration resequence the functions. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
861072b2a8
commit
0e9d2d7bc2
1 changed files with 82 additions and 82 deletions
|
@ -1769,6 +1769,88 @@ failure:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_locate_device_path() - Get the device path and handle of an device
|
||||||
|
* implementing a protocol
|
||||||
|
* @protocol: GUID of the protocol
|
||||||
|
* @device_path: device path
|
||||||
|
* @device: handle of the device
|
||||||
|
*
|
||||||
|
* This function implements the LocateDevicePath service.
|
||||||
|
*
|
||||||
|
* See the Unified Extensible Firmware Interface (UEFI) specification for
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* Return: status code
|
||||||
|
*/
|
||||||
|
static efi_status_t EFIAPI efi_locate_device_path(
|
||||||
|
const efi_guid_t *protocol,
|
||||||
|
struct efi_device_path **device_path,
|
||||||
|
efi_handle_t *device)
|
||||||
|
{
|
||||||
|
struct efi_device_path *dp;
|
||||||
|
size_t i;
|
||||||
|
struct efi_handler *handler;
|
||||||
|
efi_handle_t *handles;
|
||||||
|
size_t len, len_dp;
|
||||||
|
size_t len_best = 0;
|
||||||
|
efi_uintn_t no_handles;
|
||||||
|
u8 *remainder;
|
||||||
|
efi_status_t ret;
|
||||||
|
|
||||||
|
EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device);
|
||||||
|
|
||||||
|
if (!protocol || !device_path || !*device_path) {
|
||||||
|
ret = EFI_INVALID_PARAMETER;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find end of device path */
|
||||||
|
len = efi_dp_instance_size(*device_path);
|
||||||
|
|
||||||
|
/* Get all handles implementing the protocol */
|
||||||
|
ret = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, protocol, NULL,
|
||||||
|
&no_handles, &handles));
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (i = 0; i < no_handles; ++i) {
|
||||||
|
/* Find the device path protocol */
|
||||||
|
ret = efi_search_protocol(handles[i], &efi_guid_device_path,
|
||||||
|
&handler);
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
continue;
|
||||||
|
dp = (struct efi_device_path *)handler->protocol_interface;
|
||||||
|
len_dp = efi_dp_instance_size(dp);
|
||||||
|
/*
|
||||||
|
* This handle can only be a better fit
|
||||||
|
* if its device path length is longer than the best fit and
|
||||||
|
* if its device path length is shorter of equal the searched
|
||||||
|
* device path.
|
||||||
|
*/
|
||||||
|
if (len_dp <= len_best || len_dp > len)
|
||||||
|
continue;
|
||||||
|
/* Check if dp is a subpath of device_path */
|
||||||
|
if (memcmp(*device_path, dp, len_dp))
|
||||||
|
continue;
|
||||||
|
if (!device) {
|
||||||
|
ret = EFI_INVALID_PARAMETER;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
*device = handles[i];
|
||||||
|
len_best = len_dp;
|
||||||
|
}
|
||||||
|
if (len_best) {
|
||||||
|
remainder = (u8 *)*device_path + len_best;
|
||||||
|
*device_path = (struct efi_device_path *)remainder;
|
||||||
|
ret = EFI_SUCCESS;
|
||||||
|
} else {
|
||||||
|
ret = EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
return EFI_EXIT(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_load_image_from_path() - load an image using a file path
|
* efi_load_image_from_path() - load an image using a file path
|
||||||
*
|
*
|
||||||
|
@ -2403,88 +2485,6 @@ found:
|
||||||
return EFI_EXIT(EFI_SUCCESS);
|
return EFI_EXIT(EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* efi_locate_device_path() - Get the device path and handle of an device
|
|
||||||
* implementing a protocol
|
|
||||||
* @protocol: GUID of the protocol
|
|
||||||
* @device_path: device path
|
|
||||||
* @device: handle of the device
|
|
||||||
*
|
|
||||||
* This function implements the LocateDevicePath service.
|
|
||||||
*
|
|
||||||
* See the Unified Extensible Firmware Interface (UEFI) specification for
|
|
||||||
* details.
|
|
||||||
*
|
|
||||||
* Return: status code
|
|
||||||
*/
|
|
||||||
static efi_status_t EFIAPI efi_locate_device_path(
|
|
||||||
const efi_guid_t *protocol,
|
|
||||||
struct efi_device_path **device_path,
|
|
||||||
efi_handle_t *device)
|
|
||||||
{
|
|
||||||
struct efi_device_path *dp;
|
|
||||||
size_t i;
|
|
||||||
struct efi_handler *handler;
|
|
||||||
efi_handle_t *handles;
|
|
||||||
size_t len, len_dp;
|
|
||||||
size_t len_best = 0;
|
|
||||||
efi_uintn_t no_handles;
|
|
||||||
u8 *remainder;
|
|
||||||
efi_status_t ret;
|
|
||||||
|
|
||||||
EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device);
|
|
||||||
|
|
||||||
if (!protocol || !device_path || !*device_path) {
|
|
||||||
ret = EFI_INVALID_PARAMETER;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find end of device path */
|
|
||||||
len = efi_dp_instance_size(*device_path);
|
|
||||||
|
|
||||||
/* Get all handles implementing the protocol */
|
|
||||||
ret = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, protocol, NULL,
|
|
||||||
&no_handles, &handles));
|
|
||||||
if (ret != EFI_SUCCESS)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
for (i = 0; i < no_handles; ++i) {
|
|
||||||
/* Find the device path protocol */
|
|
||||||
ret = efi_search_protocol(handles[i], &efi_guid_device_path,
|
|
||||||
&handler);
|
|
||||||
if (ret != EFI_SUCCESS)
|
|
||||||
continue;
|
|
||||||
dp = (struct efi_device_path *)handler->protocol_interface;
|
|
||||||
len_dp = efi_dp_instance_size(dp);
|
|
||||||
/*
|
|
||||||
* This handle can only be a better fit
|
|
||||||
* if its device path length is longer than the best fit and
|
|
||||||
* if its device path length is shorter of equal the searched
|
|
||||||
* device path.
|
|
||||||
*/
|
|
||||||
if (len_dp <= len_best || len_dp > len)
|
|
||||||
continue;
|
|
||||||
/* Check if dp is a subpath of device_path */
|
|
||||||
if (memcmp(*device_path, dp, len_dp))
|
|
||||||
continue;
|
|
||||||
if (!device) {
|
|
||||||
ret = EFI_INVALID_PARAMETER;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
*device = handles[i];
|
|
||||||
len_best = len_dp;
|
|
||||||
}
|
|
||||||
if (len_best) {
|
|
||||||
remainder = (u8 *)*device_path + len_best;
|
|
||||||
*device_path = (struct efi_device_path *)remainder;
|
|
||||||
ret = EFI_SUCCESS;
|
|
||||||
} else {
|
|
||||||
ret = EFI_NOT_FOUND;
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
return EFI_EXIT(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_install_multiple_protocol_interfaces() - Install multiple protocol
|
* efi_install_multiple_protocol_interfaces() - Install multiple protocol
|
||||||
* interfaces
|
* interfaces
|
||||||
|
|
Loading…
Add table
Reference in a new issue