From 7a9b366cd9b7c1c880fda82509054a06fbac208c Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Thu, 29 Dec 2022 14:44:03 +0100 Subject: lib: add function u16_strcasecmp() Provide a function for comparing UTF-16 strings in a case insensitive manner. Signed-off-by: Heinrich Schuchardt --- lib/charset.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'lib') diff --git a/lib/charset.c b/lib/charset.c index bece4985bfc..b1842755eb1 100644 --- a/lib/charset.c +++ b/lib/charset.c @@ -350,6 +350,32 @@ s32 utf_to_upper(const s32 code) return ret; } +/* + * u16_strcasecmp() - compare two u16 strings case insensitively + * + * @s1: first string to compare + * @s2: second string to compare + * @n: maximum number of u16 to compare + * Return: 0 if the first n u16 are the same in s1 and s2 + * < 0 if the first different u16 in s1 is less than the + * corresponding u16 in s2 + * > 0 if the first different u16 in s1 is greater than the + */ +int u16_strcasecmp(const u16 *s1, const u16 *s2) +{ + int ret = 0; + s32 c1, c2; + + for (;;) { + c1 = utf_to_upper(utf16_get(&s1)); + c2 = utf_to_upper(utf16_get(&s2)); + ret = c1 - c2; + if (ret || !c1 || c1 == -1 || c2 == -1) + break; + } + return ret; +} + /* * u16_strncmp() - compare two u16 string * -- cgit v1.2.3 From 93cdb952382b3fa0110245e1fa34dadd7a52df45 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Thu, 29 Dec 2022 14:44:05 +0100 Subject: efi_loader: adjust sorting of capsules Up to now we only compared the first letter of the capsule name to sort them alphabetically. Properly sort by the Unicode alphabet. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_capsule.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c index 1163a2ee301..0997cd248fe 100644 --- a/lib/efi_loader/efi_capsule.c +++ b/lib/efi_loader/efi_capsule.c @@ -1108,10 +1108,13 @@ static efi_status_t efi_capsule_scan_dir(u16 ***files, unsigned int *num) /* ignore an error */ EFI_CALL((*dirh->close)(dirh)); - /* in ascii order */ - /* FIXME: u16 version of strcasecmp */ + /* + * Capsule files are applied in case insensitive alphabetic order + * + * TODO: special handling of rightmost period + */ qsort(tmp_files, count, sizeof(*tmp_files), - (int (*)(const void *, const void *))strcasecmp); + (int (*)(const void *, const void *))u16_strcasecmp); *files = tmp_files; *num = count; ret = EFI_SUCCESS; -- cgit v1.2.3 From 60bba6e2052c281afe401247e10aebcb4c17049b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Wed, 4 Jan 2023 05:56:09 +0100 Subject: efi_loader: populate console handles in system table The fields ConsoleInHandle, ConsoleOutHandle, ConsoleErrHandle must point to the handles with the respective console protocols. Failure to do so leads to an error in the EFI Shell: No SimpleTextInputEx was found. CTRL-based features are not usable. Signed-off-by: Heinrich Schuchardt Reviewed-by: Ilias Apalodimas --- lib/efi_loader/efi_boottime.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 253f9f75ef6..e65ca6a4cbe 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -3956,8 +3956,11 @@ efi_status_t efi_initialize_system_table(void) * These entries will be set to NULL in ExitBootServices(). To avoid * relocation in SetVirtualAddressMap(), set them dynamically. */ + systab.con_in_handle = efi_root; systab.con_in = &efi_con_in; + systab.con_out_handle = efi_root; systab.con_out = &efi_con_out; + systab.stderr_handle = efi_root; systab.std_err = &efi_con_out; systab.boottime = &efi_boot_services; -- cgit v1.2.3