[U-Boot] [PATCH 1/1] efi_loader: fix setting PlatformLang

AKASHI Takahiro takahiro.akashi at linaro.org
Fri Apr 12 04:43:23 UTC 2019


On Fri, Apr 12, 2019 at 06:20:47AM +0200, Heinrich Schuchardt wrote:
> On 4/12/19 4:49 AM, AKASHI Takahiro wrote:
> >On Thu, Apr 11, 2019 at 07:23:54PM +0200, Heinrich Schuchardt wrote:
> >>The UEFI variables PlatformLang and PlatformLangCodes specify the current
> >>firmware language and the list of all available languages.
> >>
> >>Currently their values are hard coded. With the patch a new configuration
> >>variable EFI_PLATFORM_LANG_CODES is provided.
> >
> >Generally speaking, what I expect is that we should have a single place
> >where arbitrary number of UEFI variables can be configured by default.
> 
> In U-Boot the only place for configuration is Kconfig.
> 
> For most of the variables described in the UEFI spec configuration does
> not make much sense. But it may be worthwhile to look at all of them and
> think about an efficient way of initialization many via an array with
> names, values, and attributes.
> 
> I am looking forward to your suggestions.

One of difficulties here is that UEFI variable is not always
a human-readable string, but has a complex format. So
one possibility is that we will have a dedicated U-boot variable
to define a list of commands to be executed at boot time,
most of which are "env set -e".

-Takahiro Akashi

> Best regards
> 
> Heinrich
> 
> >
> >>When initializing the UEFI subsystem this configuration variable is used to
> >>initialize PlatformLangCodes. The value of variable PlatformLang is read.
> >>If it is not set, the first language specified in EFI_PLATFORM_LANG_CODES
> >>is used to initialize PlatformLang.
> >>
> >>Suggested-by: Takahiro Akashi <takahiro.akashi at linaro.org>
> >>Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> >>---
> >>  lib/efi_loader/Kconfig     | 10 ++++++
> >>  lib/efi_loader/efi_setup.c | 70 ++++++++++++++++++++++++++++++--------
> >>  2 files changed, 66 insertions(+), 14 deletions(-)
> >>
> >>diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
> >>index a6489ca534..50b050159c 100644
> >>--- a/lib/efi_loader/Kconfig
> >>+++ b/lib/efi_loader/Kconfig
> >>@@ -26,6 +26,16 @@ config EFI_UNICODE_CAPITALIZATION
> >>  	  set, only the the correct handling of the letters of the codepage
> >>  	  used by the FAT file system is ensured.
> >>
> >>+config EFI_PLATFORM_LANG_CODES
> >>+	string "Language codes supported by firmware"
> >>+	depends on EFI_LOADER
> >>+	default "en-US"
> >>+	help
> >>+	  This value is used to initialize the PlatformLangCodes variable. Its
> >>+	  value is a semicolon (;) separated list of language codes in native
> >>+	  RFC 4646 format, e.g. "en-US;de-DE". The first language code is used
> >>+	  to initialize the PlatformLang variable.
> >>+
> >>  config EFI_LOADER_BOUNCE_BUFFER
> >>  	bool "EFI Applications use bounce buffers for DMA operations"
> >>  	depends on EFI_LOADER && ARM64
> >>diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
> >>index 6e9d5fe5b7..8f0da35ba4 100644
> >>--- a/lib/efi_loader/efi_setup.c
> >>+++ b/lib/efi_loader/efi_setup.c
> >>@@ -10,37 +10,79 @@
> >>
> >>  #define OBJ_LIST_NOT_INITIALIZED 1
> >>
> >>-/* Language code for American English according to RFC 4646 */
> >>-#define EN_US L"en-US"
> >>-
> >>  static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
> >>
> >>-/* Initialize and populate EFI object list */
> >>-efi_status_t efi_init_obj_list(void)
> >>+/**
> >>+ * efi_init_platform_lang() - define supported languages
> >>+ *
> >>+ * Set the PlatformLangCodes and PlatformLang variables.
> >>+ *
> >>+ * Return:	status code
> >>+ */
> >>+static efi_status_t efi_init_platform_lang(void)
> >>  {
> >>-	efi_status_t ret = EFI_SUCCESS;
> >>+	efi_status_t ret;
> >>+	efi_uintn_t data_size = 0;
> >>+	char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
> >>+	char *pos;
> >>
> >>  	/*
> >>-	 * Variable PlatformLang defines the language that the machine has been
> >>-	 * configured for.
> >>+	 * Variable PlatformLangCodes defines the language codes that the
> >>+	 * machine can support.
> >>  	 */
> >>-	ret = EFI_CALL(efi_set_variable(L"PlatformLang",
> >>+	ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
> >>  					&efi_global_variable_guid,
> >>  					EFI_VARIABLE_BOOTSERVICE_ACCESS |
> >>  					EFI_VARIABLE_RUNTIME_ACCESS,
> >>-					sizeof(EN_US), EN_US));
> >>+					sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
> >>+					CONFIG_EFI_PLATFORM_LANG_CODES));
> >>  	if (ret != EFI_SUCCESS)
> >>  		goto out;
> >>
> >>  	/*
> >>-	 * Variable PlatformLangCodes defines the language codes that the
> >>-	 * machine can support.
> >>+	 * Variable PlatformLang defines the language that the machine has been
> >>+	 * configured for.
> >>  	 */
> >>-	ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
> >>+	ret = EFI_CALL(efi_get_variable(L"PlatformLang",
> >>  					&efi_global_variable_guid,
> >>+					NULL, &data_size, &pos));
> >>+	if (ret == EFI_BUFFER_TOO_SMALL) {
> >>+		/* The variable is already set. Do not change it. */
> >>+		ret = EFI_SUCCESS;
> >>+		goto out;
> >>+	}
> >>+
> >>+	/*
> >>+	 * The list of supported languages is semicolon separated. Use the first
> >>+	 * language to initialize PlatformLang.
> >>+	 */
> >>+	pos = strchr(lang, ';');
> >>+	if (pos)
> >>+		*pos = 0;
> >>+
> >>+	ret = EFI_CALL(efi_set_variable(L"PlatformLang",
> >>+					&efi_global_variable_guid,
> >>+					EFI_VARIABLE_NON_VOLATILE |
> >
> >Are you going to distinguish non-volatile from volatile from now on?
> >FYI, I have finished a prototype code with which UEFI variables
> >are managed separately from U-Boot variables (environment).
> >This will allow us to implement full semantics of non-volatile
> >(and authentication in the future) attribute easily.
> >
> >>  					EFI_VARIABLE_BOOTSERVICE_ACCESS |
> >>  					EFI_VARIABLE_RUNTIME_ACCESS,
> >>-					sizeof(EN_US), EN_US));
> >>+					1 + strlen(lang), lang));
> >>+out:
> >>+	if (ret != EFI_SUCCESS)
> >>+		printf("EFI: cannot initialize platform language settings\n");
> >>+	return ret;
> >>+}
> >>+
> >>+/**
> >>+ * efi_init_obj_list() - Initialize and populate EFI object list
> >
> >Well, efi_init_obj_list() is getting bigger and bigger.
> >The name doesn't reflect its function precisely any more.
> >
> >-Takahiro Akashi
> >
> >
> >>+ * Return:	status code
> >>+ */
> >>+efi_status_t efi_init_obj_list(void)
> >>+{
> >>+	efi_status_t ret = EFI_SUCCESS;
> >>+
> >>+	/* Define supported languages */
> >>+	ret = efi_init_platform_lang();
> >>  	if (ret != EFI_SUCCESS)
> >>  		goto out;
> >>
> >>--
> >>2.20.1
> >>
> >
> 


More information about the U-Boot mailing list