Commit fd0528a2 authored by Arvind Sankar's avatar Arvind Sankar Committed by Ard Biesheuvel
Browse files

efi/libstub: Buffer output of efi_puts



Use a buffer to convert the string to UTF-16. This will reduce the
number of firmware calls required to print the string from one per
character to one per string in most cases.

Cast the input char to unsigned char before converting to efi_char16_t
to avoid sign-extension in case there are any non-ASCII characters in
the input.

Signed-off-by: default avatarArvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200518190716.751506-4-nivedita@alum.mit.edu


Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent cb8c90a0
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
 */

#include <linux/efi.h>
#include <linux/kernel.h>
#include <asm/efi.h>

#include "efistub.h"
@@ -34,13 +35,19 @@ void efi_char16_puts(efi_char16_t *str)

void efi_puts(const char *str)
{
	while (*str) {
		efi_char16_t ch[] = { *str++, L'\0' };
	efi_char16_t buf[128];
	size_t pos = 0, lim = ARRAY_SIZE(buf);

		if (ch[0] == L'\n')
			efi_char16_puts(L"\r\n");
		else
			efi_char16_puts(ch);
	while (*str) {
		if (*str == '\n')
			buf[pos++] = L'\r';
		/* Cast to unsigned char to avoid sign-extension */
		buf[pos++] = (unsigned char)(*str++);
		if (*str == '\0' || pos >= lim - 2) {
			buf[pos] = L'\0';
			efi_char16_puts(buf);
			pos = 0;
		}
	}
}