[U-Boot] [PATCH 1/1] efi_loader: variables PlatformLang and PlatformLangCodes
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu Apr 11 05:12:59 UTC 2019
On 4/11/19 6:49 AM, AKASHI Takahiro wrote:
> On Tue, Apr 09, 2019 at 07:10:11AM +0200, Heinrich Schuchardt wrote:
>> On 4/9/19 3:18 AM, AKASHI Takahiro wrote:
>>> On Fri, Apr 05, 2019 at 03:33:54AM +0200, Heinrich Schuchardt wrote:
>>>> Since TianoCore EDK2 commit d65f2cea36d1 ("ShellPkg/CommandLib: Locate
>>>> proper UnicodeCollation instance") in edk2 the UEFI Shell crashes if EFI
>>>> variable PlatformLang is not defined.
>>>>
>>>> As this variable is anyway prescribed in the UEFI 2.7 spec let's define it
>>>> to L"en-US". Use the same value for PlatformLangCodes that defines the list
>>>> of all supported languages.
>>>>
>>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>>> ---
>>>> lib/efi_loader/efi_setup.c | 27 +++++++++++++++++++++++++++
>>>> 1 file changed, 27 insertions(+)
>>>>
>>>> diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
>>>> index 8266d06c2e..e431c1c053 100644
>>>> --- a/lib/efi_loader/efi_setup.c
>>>> +++ b/lib/efi_loader/efi_setup.c
>>>> @@ -10,6 +10,9 @@
>>>>
>>>> #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 */
>>>> @@ -24,6 +27,30 @@ efi_status_t efi_init_obj_list(void)
>>>> */
>>>> efi_save_gd();
>>>>
>>>> + /*
>>>> + * Variable PlatformLang defines the language that the machine has been
>>>> + * configured for.
>>>> + */
>>>> + ret = EFI_CALL(efi_set_variable(L"PlatformLang",
>>>> + &efi_global_variable_guid,
>>>> + EFI_VARIABLE_BOOTSERVICE_ACCESS |
>>>> + EFI_VARIABLE_RUNTIME_ACCESS,
>>>> + sizeof(EN_US), EN_US));
>>>> + if (ret != EFI_SUCCESS)
>>>> + goto out;
>>>> +
>>>> + /*
>>>> + * Variable PlatformLangCodes defines the language codes that the
>>>> + * machine can support.
>>>> + */
>>>> + 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));
>>>> + if (ret != EFI_SUCCESS)
>>>> + goto out;
>>>
>>> I don't think that it is a good idea to make a hard-coding like this
>>> in init code. Instead, we should add some kind of framework so that
>>> initial (default) variables can be configured.
>>
>> The patch is sufficient to make EFI shell happy but it does not support
>> internationalization.
>>
>> With internationalization we have several problem:
>
> The issue is not what code-set be used here, but that default variables
> should be configurable without any hard-coding in generic *.c file
> for easier customization.
>
> Something, at least, like U-Boot's include/env_default.h
>
> -Takahiro Akashi
Thanks for the clarification.
I think the value I used was anyway wrong. The spec says: The
PlatformLangCodes variable contains a null-terminated *ASCII* string. I
used UTF-16.
Best regards
Heinrich
>
>> The U-Boot video output only supports characters of code page 437.
>> The USB keyboard driver supports only US keyboards.
>> The matrix keyboard driver supports only US and German keyboards.
>> Our Unicode collation protocol supports either of codepage 1250 or
>> codepage 437 for FAT filenames.
>>
>> I have chosen EN_US because code page 437 because supports it
>> completely. CP437 has some European letters but it is a misery:
>>
>> For DE_DE U+DF (eszett) is missing.
>> For FR_FR many accented letters are missing.
>>
>> Given the restrictions above what value would you use for PlatformLangCodes?
>>
>> So to make things more flexible what we could do is:
>>
>> Define PlatformLangCodes by a Kconfig variable defaulting to EN_US.
>> Intialize PlatformLang by the first language from PlatformLangCodes only
>> if the variable is not yet set (e.g. by saving a value in the environment).
>>
>> Does this logic match your expectations? If yes, I could put it into a
>> separate patch on top of the current one.
>>
>> Best regards
>>
>> Heinrich
>>
>>>
>>> -Takahiro Akashi
>>>
>>>
>>>> /* Initialize once only */
>>>> if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
>>>> return efi_obj_list_initialized;
>>>> --
>>>> 2.20.1
>>>>
>>>
>>
>
More information about the U-Boot
mailing list