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

AKASHI Takahiro takahiro.akashi at linaro.org
Fri Apr 12 06:56:42 UTC 2019


One more comment.

On Fri, Apr 12, 2019 at 01:43:23PM +0900, AKASHI Takahiro wrote:
> 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;

With this patch, PlatformLang & PlatformLangCodes will be initialized
every time calling efi_init_obj_list(). The hunk here should be moved
after

        /* Initialize once only */
        if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
                return efi_obj_list_initialized;

-Takahiro Akashi

> > >>
> > >>--
> > >>2.20.1
> > >>
> > >
> > 


More information about the U-Boot mailing list