Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147534476
D19971.id56400.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D19971.id56400.diff
View Options
Index: stand/efi/include/efidef.h
===================================================================
--- stand/efi/include/efidef.h
+++ stand/efi/include/efidef.h
@@ -63,6 +63,7 @@
#define IN
#define OUT
#define OPTIONAL
+ #define CONST const
#endif
Index: stand/efi/include/efidevp.h
===================================================================
--- stand/efi/include/efidevp.h
+++ stand/efi/include/efidevp.h
@@ -433,6 +433,9 @@
#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
{ 0x8b843e20, 0x8132, 0x4852, { 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c } }
+#define EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID \
+ { 0x05c99a21, 0xc70f, 0x4ad2, { 0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e } }
+
INTERFACE_DECL(_EFI_DEVICE_PATH_PROTOCOL);
typedef
@@ -456,6 +459,23 @@
EFI_DEVICE_PATH_TO_TEXT_PATH ConvertDevicePathToText;
} EFI_DEVICE_PATH_TO_TEXT_PROTOCOL;
+typedef
+struct _EFI_DEVICE_PATH*
+(EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_NODE) (
+ IN CONST CHAR16* TextDeviceNode
+ );
+typedef
+struct _EFI_DEVICE_PATH*
+(EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_PATH) (
+ IN CONST CHAR16* TextDevicePath
+ );
+
+
+typedef struct _EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL {
+ EFI_DEVICE_PATH_FROM_TEXT_NODE ConvertTextToDeviceNode;
+ EFI_DEVICE_PATH_FROM_TEXT_PATH ConvertTextToDevicePath;
+} EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL;
+
#pragma pack()
#endif
Index: stand/efi/include/efilib.h
===================================================================
--- stand/efi/include/efilib.h
+++ stand/efi/include/efilib.h
@@ -92,6 +92,9 @@
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);
Index: stand/efi/libefi/devpath.c
===================================================================
--- stand/efi/libefi/devpath.c
+++ stand/efi/libefi/devpath.c
@@ -28,12 +28,15 @@
#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 @@
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 @@
BS->FreePool(text);
}
+EFI_DEVICE_PATH *
+efi_name_to_devpath(const char *path)
+{
+ EFI_DEVICE_PATH *rv;
+ CHAR16 *uv;
+ size_t ul;
+
+ uv = NULL;
+ if (utf8_to_ucs2(path, &uv, &ul) != 0)
+ return (NULL);
+ rv = efi_name_to_devpath16(uv);
+ free(uv);
+ return (rv);
+}
+
+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 *dp)
+{
+
+ BS->FreePool(dp);
+}
+
EFI_DEVICE_PATH *
efi_devpath_last_node(EFI_DEVICE_PATH *devpath)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 12, 5:03 PM (4 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29556573
Default Alt Text
D19971.id56400.diff (4 KB)
Attached To
Mode
D19971: Three commits for routines to convert text to EFI_DEVICE_PATH
Attached
Detach File
Event Timeline
Log In to Comment