Page MenuHomeFreeBSD

D19971.id56400.diff
No OneTemporary

D19971.id56400.diff

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

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)

Event Timeline