From: Ricardo Koller <ricarkol@google.com>
To: Nikos Nikoleris <nikos.nikoleris@arm.com>
Cc: kvm@vger.kernel.org, drjones@redhat.com, pbonzini@redhat.com,
jade.alglave@arm.com, alexandru.elisei@arm.com
Subject: Re: [kvm-unit-tests PATCH v2 10/23] lib/printf: Add support for printing wide strings
Date: Tue, 21 Jun 2022 09:11:37 -0700 [thread overview]
Message-ID: <YrHtuduL5GtgSQuh@google.com> (raw)
In-Reply-To: <20220506205605.359830-11-nikos.nikoleris@arm.com>
On Fri, May 06, 2022 at 09:55:52PM +0100, Nikos Nikoleris wrote:
> This change adds support for wide strings (u16*) to printf()
> variants. This feature is used by a future change.
>
> Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> ---
> lib/printf.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 100 insertions(+), 1 deletion(-)
>
> diff --git a/lib/printf.c b/lib/printf.c
> index 724befa..14a3fed 100644
> --- a/lib/printf.c
> +++ b/lib/printf.c
> @@ -57,6 +57,102 @@ static void print_str(pstream_t *p, const char *s, strprops_t props)
> }
> }
>
> +/*
> + * Adapted from drivers/firmware/efi/libstub/vsprintf.c
> + */
> +static u32 utf16_to_utf32(const u16 **s16)
> +{
> + u16 c0, c1;
> +
> + c0 = *(*s16)++;
> + /* not a surrogate */
> + if ((c0 & 0xf800) != 0xd800)
> + return c0;
> + /* invalid: low surrogate instead of high */
> + if (c0 & 0x0400)
> + return 0xfffd;
> + c1 = **s16;
> + /* invalid: missing low surrogate */
> + if ((c1 & 0xfc00) != 0xdc00)
> + return 0xfffd;
> + /* valid surrogate pair */
> + ++(*s16);
> + return (0x10000 - (0xd800 << 10) - 0xdc00) + (c0 << 10) + c1;
> +}
> +
> +/*
> + * Adapted from drivers/firmware/efi/libstub/vsprintf.c
> + */
> +static size_t utf16s_utf8nlen(const u16 *s16, size_t maxlen)
> +{
> + size_t len, clen;
> +
> + for (len = 0; len < maxlen && *s16; len += clen) {
> + u16 c0 = *s16++;
> +
> + /* First, get the length for a BMP character */
> + clen = 1 + (c0 >= 0x80) + (c0 >= 0x800);
> + if (len + clen > maxlen)
> + break;
> + /*
> + * If this is a high surrogate, and we're already at maxlen, we
> + * can't include the character if it's a valid surrogate pair.
> + * Avoid accessing one extra word just to check if it's valid
> + * or not.
> + */
> + if ((c0 & 0xfc00) == 0xd800) {
> + if (len + clen == maxlen)
> + break;
> + if ((*s16 & 0xfc00) == 0xdc00) {
> + ++s16;
> + ++clen;
> + }
> + }
> + }
> +
> + return len;
> +}
> +
> +/*
> + * Adapted from drivers/firmware/efi/libstub/vsprintf.c
> + */
> +static void print_wstring(pstream_t *p, const u16 *s, strprops_t props)
> +{
> + const u16 *ws = (const u16 *)s;
> + size_t pos = 0, size = p->remain + 1, len = utf16s_utf8nlen(ws, props.precision);
> +
> + while (len-- > 0) {
> + u32 c32 = utf16_to_utf32(&ws);
> + u8 *s8;
> + size_t clen;
> +
> + if (c32 < 0x80) {
> + addchar(p, c32);
> + continue;
> + }
> +
> + /* Number of trailing octets */
> + clen = 1 + (c32 >= 0x800) + (c32 >= 0x10000);
> +
> + len -= clen;
> + s8 = (u8 *)(p->buffer - p->added + pos);
> +
> + /* Avoid writing partial character */
> + addchar(p, '\0');
> + pos += clen;
> + if (pos >= size)
> + continue;
> +
> + /* Set high bits of leading octet */
> + *s8 = (0xf00 >> 1) >> clen;
> + /* Write trailing octets in reverse order */
> + for (s8 += clen; clen; --clen, c32 >>= 6)
> + *s8-- = 0x80 | (c32 & 0x3f);
> + /* Set low bits of leading octet */
> + *s8 |= c32;
> + }
> +}
> +
> static char digits[16] = "0123456789abcdef";
>
> static void print_int(pstream_t *ps, long long n, int base, strprops_t props)
> @@ -302,7 +398,10 @@ int vsnprintf(char *buf, int size, const char *fmt, va_list va)
> print_unsigned(&s, (unsigned long)va_arg(args, void *), 16, props);
> break;
> case 's':
> - print_str(&s, va_arg(args, const char *), props);
> + if (nlong)
> + print_wstring(&s, va_arg(args, const u16 *), props);
> + else
> + print_str(&s, va_arg(args, const char *), props);
> break;
> default:
> addchar(&s, f);
> --
> 2.25.1
>
Reviewed-by: Ricardo Koller <ricarkol@google.com>
next prev parent reply other threads:[~2022-06-21 16:11 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-06 20:55 [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 01/23] lib: Move acpi header and implementation to lib Nikos Nikoleris
2022-05-19 13:21 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 02/23] lib: Ensure all struct definition for ACPI tables are packed Nikos Nikoleris
2022-05-19 13:17 ` Andrew Jones
2022-05-19 15:52 ` Nikos Nikoleris
2022-05-19 17:14 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 03/23] lib: Add support for the XSDT ACPI table Nikos Nikoleris
2022-05-19 13:30 ` Andrew Jones
2022-06-18 0:38 ` Ricardo Koller
2022-06-20 8:53 ` Alexandru Elisei
2022-06-20 11:06 ` Nikos Nikoleris
2022-06-21 12:25 ` Alexandru Elisei
2022-06-21 11:26 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 04/23] lib: Extend the definition of the ACPI table FADT Nikos Nikoleris
2022-05-19 13:42 ` Andrew Jones
2022-06-18 1:00 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 05/23] arm/arm64: Add support for setting up the PSCI conduit through ACPI Nikos Nikoleris
2022-05-19 13:54 ` Andrew Jones
2022-06-21 16:06 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 06/23] arm/arm64: Add support for discovering the UART " Nikos Nikoleris
2022-05-19 13:59 ` Andrew Jones
2022-06-21 16:07 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 07/23] arm/arm64: Add support for timer initialization " Nikos Nikoleris
2022-05-19 14:10 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 08/23] arm/arm64: Add support for cpu " Nikos Nikoleris
2022-05-19 14:23 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 09/23] lib/printf: Support for precision modifier in printing strings Nikos Nikoleris
2022-05-19 14:52 ` Andrew Jones
2022-05-19 16:02 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 10/23] lib/printf: Add support for printing wide strings Nikos Nikoleris
2022-06-21 16:11 ` Ricardo Koller [this message]
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 11/23] lib/efi: Add support for getting the cmdline Nikos Nikoleris
2022-06-21 16:33 ` Ricardo Koller
2022-06-27 16:12 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 12/23] arm/arm64: mmu_disable: Clean and invalidate before disabling Nikos Nikoleris
2022-05-13 13:15 ` Alexandru Elisei
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 13/23] arm/arm64: Rename etext to _etext Nikos Nikoleris
2022-06-21 16:42 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 14/23] lib: Avoid ms_abi for calls related to EFI on arm64 Nikos Nikoleris
2022-05-20 14:02 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 15/23] arm64: Add a new type of memory type flag MR_F_RESERVED Nikos Nikoleris
2022-06-21 16:44 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 16/23] arm/arm64: Add a setup sequence for systems that boot through EFI Nikos Nikoleris
2022-05-13 13:31 ` Alexandru Elisei
2022-06-27 16:36 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 17/23] arm64: Copy code from GNU-EFI Nikos Nikoleris
2022-06-21 17:59 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 18/23] arm64: Change gnu-efi imported file to use defined types Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 19/23] arm64: Use code from the gnu-efi when booting with EFI Nikos Nikoleris
2022-06-21 22:32 ` Ricardo Koller
2022-06-27 17:10 ` Nikos Nikoleris
2022-06-30 5:13 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 20/23] lib: Avoid external dependency in libelf Nikos Nikoleris
2022-06-21 22:39 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 21/23] x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile Nikos Nikoleris
2022-06-21 22:45 ` Ricardo Koller
2022-06-22 13:47 ` Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 22/23] arm64: Add support for efi in Makefile Nikos Nikoleris
2022-06-21 22:51 ` Ricardo Koller
2022-06-22 13:52 ` Nikos Nikoleris
2022-06-21 22:52 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 23/23] arm64: Add an efi/run script Nikos Nikoleris
2022-06-21 23:09 ` Ricardo Koller
2022-06-22 14:13 ` Nikos Nikoleris
2022-06-30 5:22 ` Ricardo Koller
2022-05-13 14:09 ` [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Alexandru Elisei
2022-05-18 9:00 ` Nikos Nikoleris
2022-05-20 9:58 ` Alexandru Elisei
2022-05-17 17:56 ` Ricardo Koller
2022-05-18 12:44 ` Nikos Nikoleris
2022-05-18 16:10 ` Ricardo Koller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YrHtuduL5GtgSQuh@google.com \
--to=ricarkol@google.com \
--cc=alexandru.elisei@arm.com \
--cc=drjones@redhat.com \
--cc=jade.alglave@arm.com \
--cc=kvm@vger.kernel.org \
--cc=nikos.nikoleris@arm.com \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).