efi_loader: add handle for UART
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Fri, 4 Feb 2022 19:47:09 +0000 (20:47 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 5 Feb 2022 19:20:01 +0000 (20:20 +0100)
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 <heinrich.schuchardt@canonical.com>
include/efi_loader.h
lib/efi_loader/efi_console.c

index f4ae84d..e390d32 100644 (file)
@@ -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,
index 3b012e1..ba68a15 100644 (file)
@@ -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,