[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