Add wrapper functions to convert strings to EFI_DEVICE_PATH

In anticipation of new functionality, create routines to convert char *
and a CHAR16 * to a EFI_DEVICE_PATH
	EFI_DEVICE_PATH *efi_name_to_devpath(const char *path);
	EFI_DEVICE_PATH *efi_name_to_devpath16(CHAR16 *path);
	void efi_devpath_free(EFI_DEVICE_PATH *dp);
The first two return an EFI_DEVICE_PATH for the passed in paths. The
third frees up the storage the first two return when the caller is
done with it.

Differential Revision: https://reviews.freebsd.org/D19971
This commit is contained in:
Warner Losh 2019-04-19 19:45:19 +00:00
parent 87818fbe99
commit 16b07b25c4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=346409
2 changed files with 52 additions and 8 deletions

View File

@ -92,6 +92,9 @@ CHAR16 *efi_devpath_name(EFI_DEVICE_PATH *);
void efi_free_devpath_name(CHAR16 *);
EFI_DEVICE_PATH *efi_devpath_to_media_path(EFI_DEVICE_PATH *);
UINTN efi_devpath_length(EFI_DEVICE_PATH *);
EFI_DEVICE_PATH *efi_name_to_devpath(const char *path);
EFI_DEVICE_PATH *efi_name_to_devpath16(CHAR16 *path);
void efi_devpath_free(EFI_DEVICE_PATH *dp);
int efi_status_to_errno(EFI_STATUS);
EFI_STATUS errno_to_efi_status(int errno);

View File

@ -28,12 +28,15 @@ __FBSDID("$FreeBSD$");
#include <efi.h>
#include <efilib.h>
#include <efichar.h>
static EFI_GUID ImageDevicePathGUID =
EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID;
static EFI_GUID DevicePathGUID = DEVICE_PATH_PROTOCOL;
static EFI_GUID DevicePathToTextGUID = EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID;
static EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *textProtocol;
static EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *toTextProtocol;
static EFI_GUID DevicePathFromTextGUID = EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID;
static EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *fromTextProtocol;
EFI_DEVICE_PATH *
efi_lookup_image_devpath(EFI_HANDLE handle)
@ -63,22 +66,20 @@ efi_lookup_devpath(EFI_HANDLE handle)
CHAR16 *
efi_devpath_name(EFI_DEVICE_PATH *devpath)
{
static int once = 1;
EFI_STATUS status;
if (devpath == NULL)
return (NULL);
if (once) {
if (toTextProtocol == NULL) {
status = BS->LocateProtocol(&DevicePathToTextGUID, NULL,
(VOID **)&textProtocol);
(VOID **)&toTextProtocol);
if (EFI_ERROR(status))
textProtocol = NULL;
once = 0;
toTextProtocol = NULL;
}
if (textProtocol == NULL)
if (toTextProtocol == NULL)
return (NULL);
return (textProtocol->ConvertDevicePathToText(devpath, TRUE, TRUE));
return (toTextProtocol->ConvertDevicePathToText(devpath, TRUE, TRUE));
}
void
@ -88,6 +89,46 @@ efi_free_devpath_name(CHAR16 *text)
BS->FreePool(text);
}
EFI_DEVICE_PATH *
efi_name_to_devpath(const char *path)
{
EFI_DEVICE_PATH *devpath;
CHAR16 *uv;
size_t ul;
uv = NULL;
if (utf8_to_ucs2(path, &uv, &ul) != 0)
return (NULL);
devpath = efi_name_to_devpath16(uv);
free(uv);
return (devpath);
}
EFI_DEVICE_PATH *
efi_name_to_devpath16(CHAR16 *path)
{
EFI_STATUS status;
if (path == NULL)
return (NULL);
if (fromTextProtocol == NULL) {
status = BS->LocateProtocol(&DevicePathFromTextGUID, NULL,
(VOID **)&fromTextProtocol);
if (EFI_ERROR(status))
fromTextProtocol = NULL;
}
if (fromTextProtocol == NULL)
return (NULL);
return (fromTextProtocol->ConvertTextToDevicePath(path));
}
void efi_devpath_free(EFI_DEVICE_PATH *devpath)
{
BS->FreePool(devpath);
}
EFI_DEVICE_PATH *
efi_devpath_last_node(EFI_DEVICE_PATH *devpath)
{