efi_loader: implement EFI_DEVICE_PATH_TO_TEXT_PROTOCOL
authorxypron.glpk@gmx.de <xypron.glpk@gmx.de>
Tue, 11 Jul 2017 20:06:25 +0000 (22:06 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Jul 2017 12:14:40 +0000 (14:14 +0200)
ConvertPathToText is implemented for
* type 4    - media device path
* subtype 4 - file path

This is the kind of device path we hand out for block devices.

All other cases may be implemented later.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
[agraf: fix whitespace]
Signed-off-by: Alexander Graf <agraf@suse.de>
cmd/bootefi.c
include/efi_api.h
include/efi_loader.h
lib/efi_loader/Makefile
lib/efi_loader/efi_device_path_to_text.c [new file with mode: 0644]

index 8453d90..dcae253 100644 (file)
@@ -84,6 +84,10 @@ static struct efi_object loaded_image_info_obj = {
                        .guid = &efi_guid_console_control,
                        .protocol_interface = (void *) &efi_console_control
                },
+               {
+                       .guid = &efi_guid_device_path_to_text_protocol,
+                       .protocol_interface = (void *) &efi_device_path_to_text
+               },
        },
 };
 
index 42cd47f..ea63e80 100644 (file)
@@ -395,6 +395,30 @@ struct efi_console_control_protocol
                        uint16_t *password);
 };
 
+#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
+       EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
+                0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
+
+struct efi_device_path_protocol
+{
+       uint8_t type;
+       uint8_t sub_type;
+       uint16_t length;
+       uint8_t data[];
+};
+
+struct efi_device_path_to_text_protocol
+{
+       uint16_t *(EFIAPI *convert_device_node_to_text)(
+                       struct efi_device_path_protocol *device_node,
+                       bool display_only,
+                       bool allow_shortcuts);
+       uint16_t *(EFIAPI *convert_device_path_to_text)(
+                       struct efi_device_path_protocol *device_path,
+                       bool display_only,
+                       bool allow_shortcuts);
+};
+
 #define EFI_GOP_GUID \
        EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
                 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
index 6ea6e9e..d7847d2 100644 (file)
@@ -28,10 +28,12 @@ extern struct efi_system_table systab;
 extern const struct efi_simple_text_output_protocol efi_con_out;
 extern const struct efi_simple_input_interface efi_con_in;
 extern const struct efi_console_control_protocol efi_console_control;
+extern const struct efi_device_path_to_text_protocol efi_device_path_to_text;
 
 extern const efi_guid_t efi_guid_console_control;
 extern const efi_guid_t efi_guid_device_path;
 extern const efi_guid_t efi_guid_loaded_image;
+extern const efi_guid_t efi_guid_device_path_to_text_protocol;
 
 extern unsigned int __efi_runtime_start, __efi_runtime_stop;
 extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
index fa8b91a..3fc2371 100644 (file)
@@ -15,7 +15,7 @@ always := $(efiprogs-y)
 
 obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o
 obj-y += efi_image_loader.o efi_boottime.o efi_runtime.o efi_console.o
-obj-y += efi_memory.o
+obj-y += efi_memory.o efi_device_path_to_text.o
 obj-$(CONFIG_LCD) += efi_gop.o
 obj-$(CONFIG_PARTITIONS) += efi_disk.o
 obj-$(CONFIG_NET) += efi_net.o
diff --git a/lib/efi_loader/efi_device_path_to_text.c b/lib/efi_loader/efi_device_path_to_text.c
new file mode 100644 (file)
index 0000000..a7a5130
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *  EFI device path interface
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+
+#define MEDIA_DEVICE_PATH 4
+#define FILE_PATH_MEDIA_DEVICE_PATH 4
+
+const efi_guid_t efi_guid_device_path_to_text_protocol =
+               EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID;
+
+uint16_t *efi_convert_device_node_to_text(
+               struct efi_device_path_protocol *device_node,
+               bool display_only,
+               bool allow_shortcuts)
+{
+       EFI_ENTRY("%p, %d, %d", device_node, display_only, allow_shortcuts);
+
+       EFI_EXIT(EFI_UNSUPPORTED);
+       return NULL;
+}
+
+uint16_t *efi_convert_device_path_to_text(
+               struct efi_device_path_protocol *device_path,
+               bool display_only,
+               bool allow_shortcuts)
+{
+       EFI_ENTRY("%p, %d, %d", device_path, display_only, allow_shortcuts);
+
+       unsigned long buffer_size;
+       efi_status_t r;
+       uint16_t *buffer = NULL;
+
+       switch (device_path->type) {
+       case MEDIA_DEVICE_PATH:
+               switch (device_path->sub_type) {
+               case FILE_PATH_MEDIA_DEVICE_PATH:
+                       buffer_size = device_path->length - 4;
+                       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES,
+                                             buffer_size, (void **) &buffer);
+                       if (r == EFI_SUCCESS)
+                               memcpy(buffer, device_path->data, buffer_size);
+                       break;
+               }
+       }
+
+       if (buffer) {
+               EFI_EXIT(EFI_SUCCESS);
+       } else {
+               debug("type %d, subtype %d\n",
+                     device_path->type, device_path->sub_type);
+               EFI_EXIT(EFI_UNSUPPORTED);
+       }
+
+       return buffer;
+}
+
+const struct efi_device_path_to_text_protocol efi_device_path_to_text = {
+       .convert_device_node_to_text = efi_convert_device_node_to_text,
+       .convert_device_path_to_text = efi_convert_device_path_to_text,
+};