When loading an EFI binary via the UART we assign a UART device path to it.
But we lack a handle with that device path.

Signed-off-by: Heinrich Schuchardt <[email protected]>
---
 include/efi_loader.h         |  1 +
 lib/efi_loader/efi_console.c | 52 +++++++++++++++++-------------------
 2 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index f4ae84dc89..e390d323a9 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -769,6 +769,7 @@ const struct efi_device_path *efi_dp_last_node(
 efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
                                    struct efi_device_path **device_path,
                                    struct efi_device_path **file_path);
+struct efi_device_path *efi_dp_from_uart(void);
 efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
                              const char *path,
                              struct efi_device_path **device,
diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
index 3b012e1a66..ba68a15017 100644
--- a/lib/efi_loader/efi_console.c
+++ b/lib/efi_loader/efi_console.c
@@ -25,6 +25,8 @@ struct cout_mode {
        int present;
 };
 
+__maybe_unused static struct efi_object uart_obj;
+
 static struct cout_mode efi_cout_modes[] = {
        /* EFI Mode 0 is 80x25 and always present */
        {
@@ -1258,37 +1260,33 @@ static void EFIAPI efi_key_notify(struct efi_event 
*event, void *context)
 efi_status_t efi_console_register(void)
 {
        efi_status_t r;
-       efi_handle_t console_output_handle;
-       efi_handle_t console_input_handle;
+       struct efi_device_path *dp;
 
        /* Set up mode information */
        query_console_size();
 
-       /* Create handles */
-       r = efi_create_handle(&console_output_handle);
-       if (r != EFI_SUCCESS)
-               goto out_of_memory;
-
-       r = efi_add_protocol(console_output_handle,
-                            &efi_guid_text_output_protocol, &efi_con_out);
-       if (r != EFI_SUCCESS)
-               goto out_of_memory;
-       systab.con_out_handle = console_output_handle;
-       systab.stderr_handle = console_output_handle;
-
-       r = efi_create_handle(&console_input_handle);
-       if (r != EFI_SUCCESS)
-               goto out_of_memory;
-
-       r = efi_add_protocol(console_input_handle,
-                            &efi_guid_text_input_protocol, &efi_con_in);
-       if (r != EFI_SUCCESS)
-               goto out_of_memory;
-       systab.con_in_handle = console_input_handle;
-       r = efi_add_protocol(console_input_handle,
-                            &efi_guid_text_input_ex_protocol, &efi_con_in_ex);
-       if (r != EFI_SUCCESS)
-               goto out_of_memory;
+       /* Install protocols on root node */
+       r = EFI_CALL(efi_install_multiple_protocol_interfaces
+                    (&efi_root,
+                     &efi_guid_text_output_protocol, &efi_con_out,
+                     &efi_guid_text_input_protocol, &efi_con_in,
+                     &efi_guid_text_input_ex_protocol, &efi_con_in_ex,
+                     NULL));
+
+       /* Create console node and install device path protocols */
+       if (CONFIG_IS_ENABLED(DM_SERIAL)) {
+               dp = efi_dp_from_uart();
+               if (!dp)
+                       goto out_of_memory;
+
+               /* Hook UART up to the device list */
+               efi_add_handle(&uart_obj);
+
+               /* Install device path */
+               r = efi_add_protocol(&uart_obj, &efi_guid_device_path, dp);
+               if (r != EFI_SUCCESS)
+                       goto out_of_memory;
+       }
 
        /* Create console events */
        r = efi_create_event(EVT_NOTIFY_WAIT, TPL_CALLBACK, efi_key_notify,
-- 
2.34.1

Reply via email to