[RESEND RFC PATCH v2 4/4] efi_loader: add menu-driven UEFI Boot Variable maintenance

2022-02-24 Thread Masahisa Kojima
This commit adds the menu-driven UEFI Boot Variable maintenance.
User can add and delete the Boot variable, and update the
BootOrder variable through menu operation.

Signed-off-by: Masahisa Kojima 
---
Changes in v2:
- enable utf8 user input for boot option name
- create lib/efi_loader/efi_console.c::efi_console_get_u16_string() for
  utf8 user input handling
- use u16_strlcat instead of u16_strcat
- remove the EFI_CALLs, and newly create or expose the following
  xxx_int() functions.
efi_locate_handle_buffer_int(), efi_open_volume_int(),
efi_file_open_int(), efi_file_close_int(), efi_file_read_int() and
efi_file_setpos_int().
  Note that EFI_CALLs still exist for EFI_DEVICE_PATH_TO_TEXT_PROTOCOL
  and EFI_SIMPLE_TEXT_INPUT/OUTPUT_PROTOCOL
- use efi_search_protocol() instead of calling locate_protocol() to get
  the device_path_to_text_protocol interface.
- remove unnecessary puts(ANSI_CLEAR_LINE), this patch is still depends on
  puts(ANSI_CLEAR_CONSOLE)
- skip SetVariable() if the bootorder is not changed

 include/efi_loader.h  |  27 ++
 lib/efi_loader/efi_bootmgr.c  | 687 ++
 lib/efi_loader/efi_boottime.c |  55 +--
 lib/efi_loader/efi_console.c  |  81 
 lib/efi_loader/efi_file.c |  74 ++--
 5 files changed, 876 insertions(+), 48 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index e390d323a9..0623e0a707 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -278,6 +278,7 @@ extern const efi_guid_t efi_guid_loaded_image;
 extern const efi_guid_t efi_guid_loaded_image_device_path;
 extern const efi_guid_t efi_guid_device_path_to_text_protocol;
 extern const efi_guid_t efi_simple_file_system_protocol_guid;
+extern const efi_guid_t efi_system_partition_guid;
 extern const efi_guid_t efi_file_info_guid;
 /* GUID for file system information */
 extern const efi_guid_t efi_file_system_info_guid;
@@ -310,6 +311,9 @@ extern const efi_guid_t 
efi_guid_firmware_management_protocol;
 extern const efi_guid_t efi_esrt_guid;
 /* GUID of the SMBIOS table */
 extern const efi_guid_t smbios_guid;
+/*GUID of console */
+extern const efi_guid_t efi_guid_text_input_protocol;
+extern const efi_guid_t efi_guid_text_output_protocol;
 
 extern char __efi_runtime_start[], __efi_runtime_stop[];
 extern char __efi_runtime_rel_start[], __efi_runtime_rel_stop[];
@@ -998,4 +1002,27 @@ efi_status_t efi_esrt_populate(void);
 efi_status_t efi_load_capsule_drivers(void);
 
 efi_status_t platform_get_eventlog(struct udevice *dev, u64 *addr, u32 *sz);
+
+efi_status_t efi_locate_handle_buffer_int(enum efi_locate_search_type 
search_type,
+ const efi_guid_t *protocol, void 
*search_key,
+ efi_uintn_t *no_handles, efi_handle_t 
**buffer);
+
+efi_status_t efi_open_volume_int(struct efi_simple_file_system_protocol *this,
+struct efi_file_handle **root);
+efi_status_t efi_file_open_int(struct efi_file_handle *this,
+  struct efi_file_handle **new_handle,
+  u16 *file_name, u64 open_mode,
+  u64 attributes);
+efi_status_t efi_file_close_int(struct efi_file_handle *file);
+efi_status_t efi_file_read_int(struct efi_file_handle *this,
+  efi_uintn_t *buffer_size, void *buffer);
+efi_status_t efi_file_setpos_int(struct efi_file_handle *file, u64 pos);
+
+typedef efi_status_t (*efi_console_filter_func)(struct efi_input_key *key);
+efi_status_t efi_console_get_u16_string
+   (struct efi_simple_text_input_protocol *cin,
+struct efi_simple_text_output_protocol *cout,
+u16 *buf, efi_uintn_t count, efi_console_filter_func 
filer_func,
+int row, int col);
+
 #endif /* _EFI_LOADER_H */
diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c
index bbb3fac5bd..b7d1fa6f4b 100644
--- a/lib/efi_loader/efi_bootmgr.c
+++ b/lib/efi_loader/efi_bootmgr.c
@@ -20,6 +20,9 @@
 static const struct efi_boot_services *bs;
 static const struct efi_runtime_services *rs;
 
+static struct efi_simple_text_input_protocol *cin;
+static struct efi_simple_text_output_protocol *cout;
+
 /*
  * bootmgr implements the logic of trying to find a payload to boot
  * based on the BootOrder + Boot variables, and then loading it.
@@ -30,6 +33,9 @@ static const struct efi_runtime_services *rs;
  */
 
 #define EFI_BOOTMGR_MENU_ENTRY_NUM_MAX 1024
+#define EFI_BOOTMGR_FILE_PATH_MAX 512
+#define EFI_BOOTMGR_BOOT_NAME_MAX 32
+#define EFI_BOOT_ORDER_MAX_SIZE_IN_DECIMAL 6
 
 typedef efi_status_t (*efi_bootmenu_entry_func)(void *data, bool *exit);
 
@@ -83,12 +89,49 @@ struct efi_bootmgr_boot_selection_data {
 
 static efi_status_t efi_bootmgr_process_boot_selected(void *data, bool *exit);
 static efi_status_t efi_bootmgr_process_boot_selection(void *data, bool *exit);
+static efi_status_t 

[RFC PATCH v2 4/4] efi_loader: add menu-driven UEFI Boot Variable maintenance

2022-02-22 Thread Masahisa Kojima
This commit adds the menu-driven UEFI Boot Variable maintenance.
User can add and delete the Boot variable, and update the
BootOrder variable through menu operation.

Signed-off-by: Masahisa Kojima 
---
 include/efi_loader.h  |  27 ++
 lib/efi_loader/efi_bootmgr.c  | 687 ++
 lib/efi_loader/efi_boottime.c |  55 +--
 lib/efi_loader/efi_console.c  |  81 
 lib/efi_loader/efi_file.c |  74 ++--
 5 files changed, 876 insertions(+), 48 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index e390d323a9..0623e0a707 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -278,6 +278,7 @@ extern const efi_guid_t efi_guid_loaded_image;
 extern const efi_guid_t efi_guid_loaded_image_device_path;
 extern const efi_guid_t efi_guid_device_path_to_text_protocol;
 extern const efi_guid_t efi_simple_file_system_protocol_guid;
+extern const efi_guid_t efi_system_partition_guid;
 extern const efi_guid_t efi_file_info_guid;
 /* GUID for file system information */
 extern const efi_guid_t efi_file_system_info_guid;
@@ -310,6 +311,9 @@ extern const efi_guid_t 
efi_guid_firmware_management_protocol;
 extern const efi_guid_t efi_esrt_guid;
 /* GUID of the SMBIOS table */
 extern const efi_guid_t smbios_guid;
+/*GUID of console */
+extern const efi_guid_t efi_guid_text_input_protocol;
+extern const efi_guid_t efi_guid_text_output_protocol;
 
 extern char __efi_runtime_start[], __efi_runtime_stop[];
 extern char __efi_runtime_rel_start[], __efi_runtime_rel_stop[];
@@ -998,4 +1002,27 @@ efi_status_t efi_esrt_populate(void);
 efi_status_t efi_load_capsule_drivers(void);
 
 efi_status_t platform_get_eventlog(struct udevice *dev, u64 *addr, u32 *sz);
+
+efi_status_t efi_locate_handle_buffer_int(enum efi_locate_search_type 
search_type,
+ const efi_guid_t *protocol, void 
*search_key,
+ efi_uintn_t *no_handles, efi_handle_t 
**buffer);
+
+efi_status_t efi_open_volume_int(struct efi_simple_file_system_protocol *this,
+struct efi_file_handle **root);
+efi_status_t efi_file_open_int(struct efi_file_handle *this,
+  struct efi_file_handle **new_handle,
+  u16 *file_name, u64 open_mode,
+  u64 attributes);
+efi_status_t efi_file_close_int(struct efi_file_handle *file);
+efi_status_t efi_file_read_int(struct efi_file_handle *this,
+  efi_uintn_t *buffer_size, void *buffer);
+efi_status_t efi_file_setpos_int(struct efi_file_handle *file, u64 pos);
+
+typedef efi_status_t (*efi_console_filter_func)(struct efi_input_key *key);
+efi_status_t efi_console_get_u16_string
+   (struct efi_simple_text_input_protocol *cin,
+struct efi_simple_text_output_protocol *cout,
+u16 *buf, efi_uintn_t count, efi_console_filter_func 
filer_func,
+int row, int col);
+
 #endif /* _EFI_LOADER_H */
diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c
index bbb3fac5bd..b7d1fa6f4b 100644
--- a/lib/efi_loader/efi_bootmgr.c
+++ b/lib/efi_loader/efi_bootmgr.c
@@ -20,6 +20,9 @@
 static const struct efi_boot_services *bs;
 static const struct efi_runtime_services *rs;
 
+static struct efi_simple_text_input_protocol *cin;
+static struct efi_simple_text_output_protocol *cout;
+
 /*
  * bootmgr implements the logic of trying to find a payload to boot
  * based on the BootOrder + Boot variables, and then loading it.
@@ -30,6 +33,9 @@ static const struct efi_runtime_services *rs;
  */
 
 #define EFI_BOOTMGR_MENU_ENTRY_NUM_MAX 1024
+#define EFI_BOOTMGR_FILE_PATH_MAX 512
+#define EFI_BOOTMGR_BOOT_NAME_MAX 32
+#define EFI_BOOT_ORDER_MAX_SIZE_IN_DECIMAL 6
 
 typedef efi_status_t (*efi_bootmenu_entry_func)(void *data, bool *exit);
 
@@ -83,12 +89,49 @@ struct efi_bootmgr_boot_selection_data {
 
 static efi_status_t efi_bootmgr_process_boot_selected(void *data, bool *exit);
 static efi_status_t efi_bootmgr_process_boot_selection(void *data, bool *exit);
+static efi_status_t efi_bootmgr_process_maintenance(void *data, bool *exit);
+static efi_status_t efi_bootmgr_process_add_boot_option(void *data, bool 
*exit);
+static efi_status_t efi_bootmgr_process_delete_boot_option(void *data, bool 
*exit);
+static efi_status_t efi_bootmgr_process_change_boot_order(void *data, bool 
*exit);
 
 static struct efi_bootmgr_menu_item bootmgr_menu_items[] = {
{u"Boot Manager", efi_bootmgr_process_boot_selection},
+   {u"Boot Manager maintenance", efi_bootmgr_process_maintenance},
{u"Quit", NULL},
 };
 
+static struct efi_bootmgr_menu_item maintenance_menu_items[] = {
+   {u"Add Boot Option", efi_bootmgr_process_add_boot_option},
+   {u"Delete Boot Option", efi_bootmgr_process_delete_boot_option},
+   {u"Change Boot Order", efi_bootmgr_process_change_boot_order},
+   {u"Quit", NULL},
+};
+