--- /dev/null
+/** @file\r
+ Based on files under Nt32Pkg/MiscSubClassPlatformDxe/\r
+\r
+ Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>\r
+ Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+/=#\r
+\r
+/=#\r
+//\r
+// Language String (Long Format)\r
+//\r
+#string STR_MISC_BIOS_LANGUAGES_ENG_LONG #language en-US "en|US|iso8859-1"\r
+#string STR_MISC_BIOS_LANGUAGES_FRA_LONG #language en-US "fr|CA|iso8859-1"\r
+#string STR_MISC_BIOS_LANGUAGES_CHN_LONG #language en-US "zh|TW|unicode"\r
+#string STR_MISC_BIOS_LANGUAGES_JPN_LONG #language en-US "ja|JP|unicode"\r
+#string STR_MISC_BIOS_LANGUAGES_ITA_LONG #language en-US "it|IT|iso8859-1"\r
+#string STR_MISC_BIOS_LANGUAGES_SPA_LONG #language en-US "es|ES|iso8859-1"\r
+#string STR_MISC_BIOS_LANGUAGES_GER_LONG #language en-US "de|DE|iso8859-1"\r
+#string STR_MISC_BIOS_LANGUAGES_POR_LONG #language en-US "pt|PT|iso8859-1"\r
+\r
+\r
+//\r
+// Language String (Abbreviated Format)\r
+//\r
+#string STR_MISC_BIOS_LANGUAGES_ENG_ABBREVIATE #language en-US "enUS"\r
+#string STR_MISC_BIOS_LANGUAGES_FRA_ABBREVIATE #language en-US "frCA"\r
+#string STR_MISC_BIOS_LANGUAGES_CHN_ABBREVIATE #language en-US "zhTW"\r
+#string STR_MISC_BIOS_LANGUAGES_JPN_ABBREVIATE #language en-US "jaJP"\r
+#string STR_MISC_BIOS_LANGUAGES_ITA_ABBREVIATE #language en-US "itIT"\r
+#string STR_MISC_BIOS_LANGUAGES_SPA_ABBREVIATE #language en-US "esES"\r
+#string STR_MISC_BIOS_LANGUAGES_GER_ABBREVIATE #language en-US "deDE"\r
+#string STR_MISC_BIOS_LANGUAGES_POR_ABBREVIATE #language en-US "ptPT"\r
+\r
+#string STR_MISC_BIOS_LANGUAGES_SIMPLECH_ABBREVIATE #language en-US "zhCN"\r
+#string STR_MISC_BIOS_LANGUAGES_SIMPLECH_LONG #language en-US "zh|CN|unicode"\r
+\r
+\r
--- /dev/null
+/** @file\r
+ Based on files under Nt32Pkg/MiscSubClassPlatformDxe/\r
+\r
+ Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>\r
+ Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/OemMiscLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include "SmbiosMisc.h"\r
+\r
+/**\r
+ Get next language from language code list (with separator ';').\r
+\r
+ @param LangCode Input: point to first language in the list. On\r
+ Otput: point to next language in the list, or\r
+ NULL if no more language in the list.\r
+ @param Lang The first language in the list.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+GetNextLanguage (\r
+ IN OUT CHAR8 **LangCode,\r
+ OUT CHAR8 *Lang\r
+ )\r
+{\r
+ UINTN Index;\r
+ CHAR8 *StringPtr;\r
+\r
+ if (LangCode == NULL || *LangCode == NULL || Lang == NULL) {\r
+ return;\r
+ }\r
+\r
+ Index = 0;\r
+ StringPtr = *LangCode;\r
+ while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
+ Index++;\r
+ }\r
+\r
+ (VOID)CopyMem (Lang, StringPtr, Index);\r
+ Lang[Index] = 0;\r
+\r
+ if (StringPtr[Index] == ';') {\r
+ Index++;\r
+ }\r
+ *LangCode = StringPtr + Index;\r
+}\r
+\r
+/**\r
+ This function returns the number of supported languages on HiiHandle.\r
+\r
+ @param HiiHandle The HII package list handle.\r
+\r
+ @retval The number of supported languages.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+GetSupportedLanguageNumber (\r
+ IN EFI_HII_HANDLE HiiHandle\r
+ )\r
+{\r
+ CHAR8 *Lang;\r
+ CHAR8 *Languages;\r
+ CHAR8 *LanguageString;\r
+ UINT16 LangNumber;\r
+\r
+ Languages = HiiGetSupportedLanguages (HiiHandle);\r
+ if (Languages == NULL) {\r
+ return 0;\r
+ }\r
+\r
+ LangNumber = 0;\r
+ Lang = AllocatePool (AsciiStrSize (Languages));\r
+ if (Lang != NULL) {\r
+ LanguageString = Languages;\r
+ while (*LanguageString != 0) {\r
+ GetNextLanguage (&LanguageString, Lang);\r
+ LangNumber++;\r
+ }\r
+ FreePool (Lang);\r
+ }\r
+ FreePool (Languages);\r
+ return LangNumber;\r
+}\r
+\r
+\r
+/**\r
+ This function makes boot time changes to the contents of the\r
+ MiscNumberOfInstallableLanguages (Type 13) record.\r
+\r
+ @param RecordData Pointer to SMBIOS table with default values.\r
+ @param Smbios SMBIOS protocol.\r
+\r
+ @retval EFI_SUCCESS The SMBIOS table was successfully added.\r
+ @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.\r
+\r
+**/\r
+SMBIOS_MISC_TABLE_FUNCTION(MiscNumberOfInstallableLanguages)\r
+{\r
+ UINTN LangStrLen;\r
+ CHAR8 CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];\r
+ CHAR8 *OptionalStrStart;\r
+ EFI_STATUS Status;\r
+ SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
+ SMBIOS_TABLE_TYPE13 *InputData;\r
+\r
+ InputData = NULL;\r
+\r
+ //\r
+ // First check for invalid parameters.\r
+ //\r
+ if (RecordData == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ InputData = (SMBIOS_TABLE_TYPE13 *)RecordData;\r
+\r
+ InputData->InstallableLanguages = GetSupportedLanguageNumber (mSmbiosMiscHiiHandle);\r
+\r
+ //\r
+ // Try to check if current langcode matches with the langcodes in installed languages\r
+ //\r
+ ZeroMem (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1);\r
+ (VOID)AsciiStrCpyS (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1, "en|US|iso8859-1");\r
+ LangStrLen = AsciiStrLen (CurrentLang);\r
+\r
+ //\r
+ // Two zeros following the last string.\r
+ //\r
+ SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
+ if (SmbiosRecord == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE13));\r
+\r
+ SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
+\r
+ OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
+ (VOID)AsciiStrCpyS (OptionalStrStart, SMBIOS_STRING_MAX_LENGTH - 1, CurrentLang);\r
+ //\r
+ // Now we have got the full smbios record, call smbios protocol to add this record.\r
+ //\r
+ Status = SmbiosMiscAddRecord ((UINT8*)SmbiosRecord, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type13 Table Log Failed! %r \n",\r
+ __FUNCTION__, __LINE__, Status));\r
+ }\r
+\r
+ FreePool (SmbiosRecord);\r
+ return Status;\r
+}\r