efi_loader: add handle for UART

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>
This commit is contained in:
Heinrich Schuchardt 2022-02-04 20:47:09 +01:00
parent 915623c0d3
commit 3c95b323c7
2 changed files with 23 additions and 24 deletions

View 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, efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
struct efi_device_path **device_path, struct efi_device_path **device_path,
struct efi_device_path **file_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, efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
const char *path, const char *path,
struct efi_device_path **device, struct efi_device_path **device,

View File

@ -25,6 +25,8 @@ struct cout_mode {
int present; int present;
}; };
__maybe_unused static struct efi_object uart_obj;
static struct cout_mode efi_cout_modes[] = { static struct cout_mode efi_cout_modes[] = {
/* EFI Mode 0 is 80x25 and always present */ /* 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 efi_console_register(void)
{ {
efi_status_t r; efi_status_t r;
efi_handle_t console_output_handle; struct efi_device_path *dp;
efi_handle_t console_input_handle;
/* Set up mode information */ /* Set up mode information */
query_console_size(); query_console_size();
/* Create handles */ /* Install protocols on root node */
r = efi_create_handle(&console_output_handle); r = EFI_CALL(efi_install_multiple_protocol_interfaces
if (r != EFI_SUCCESS) (&efi_root,
goto out_of_memory; &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));
r = efi_add_protocol(console_output_handle, /* Create console node and install device path protocols */
&efi_guid_text_output_protocol, &efi_con_out); if (CONFIG_IS_ENABLED(DM_SERIAL)) {
if (r != EFI_SUCCESS) dp = efi_dp_from_uart();
goto out_of_memory; if (!dp)
systab.con_out_handle = console_output_handle; goto out_of_memory;
systab.stderr_handle = console_output_handle;
r = efi_create_handle(&console_input_handle); /* Hook UART up to the device list */
if (r != EFI_SUCCESS) efi_add_handle(&uart_obj);
goto out_of_memory;
r = efi_add_protocol(console_input_handle, /* Install device path */
&efi_guid_text_input_protocol, &efi_con_in); r = efi_add_protocol(&uart_obj, &efi_guid_device_path, dp);
if (r != EFI_SUCCESS) if (r != EFI_SUCCESS)
goto out_of_memory; 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;
/* Create console events */ /* Create console events */
r = efi_create_event(EVT_NOTIFY_WAIT, TPL_CALLBACK, efi_key_notify, r = efi_create_event(EVT_NOTIFY_WAIT, TPL_CALLBACK, efi_key_notify,