2 Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
4 Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
5 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
6 Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
7 Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
8 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <Library/BaseLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/HiiLib.h>
16 #include <Library/MemoryAllocationLib.h>
17 #include <Library/OemMiscLib.h>
18 #include <Library/PrintLib.h>
19 #include <Library/UefiBootServicesTableLib.h>
21 #include "SmbiosMisc.h"
24 Get next language from language code list (with separator ';').
26 @param LangCode Input: point to first language in the list. On
27 Output: point to next language in the list, or
28 NULL if no more language in the list.
29 @param Lang The first language in the list.
35 IN OUT CHAR8
**LangCode
,
42 if ((LangCode
== NULL
) || (*LangCode
== NULL
) || (Lang
== NULL
)) {
47 StringPtr
= *LangCode
;
48 while (StringPtr
[Index
] != 0 && StringPtr
[Index
] != ';') {
52 (VOID
)CopyMem (Lang
, StringPtr
, Index
);
55 if (StringPtr
[Index
] == ';') {
59 *LangCode
= StringPtr
+ Index
;
63 This function returns the number of supported languages on HiiHandle.
65 @param HiiHandle The HII package list handle.
67 @retval The number of supported languages.
72 GetSupportedLanguageNumber (
73 IN EFI_HII_HANDLE HiiHandle
78 CHAR8
*LanguageString
;
81 Languages
= HiiGetSupportedLanguages (HiiHandle
);
82 if (Languages
== NULL
) {
87 Lang
= AllocatePool (AsciiStrSize (Languages
));
89 LanguageString
= Languages
;
90 while (*LanguageString
!= 0) {
91 GetNextLanguage (&LanguageString
, Lang
);
103 This function makes boot time changes to the contents of the
104 MiscNumberOfInstallableLanguages (Type 13) record.
106 @param RecordData Pointer to SMBIOS table with default values.
107 @param Smbios SMBIOS protocol.
109 @retval EFI_SUCCESS The SMBIOS table was successfully added.
110 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
111 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.
114 SMBIOS_MISC_TABLE_FUNCTION (MiscNumberOfInstallableLanguages
) {
116 CHAR8 CurrentLang
[SMBIOS_STRING_MAX_LENGTH
+ 1];
117 CHAR8
*OptionalStrStart
;
119 SMBIOS_TABLE_TYPE13
*SmbiosRecord
;
120 SMBIOS_TABLE_TYPE13
*InputData
;
125 // First check for invalid parameters.
127 if (RecordData
== NULL
) {
128 return EFI_INVALID_PARAMETER
;
131 InputData
= (SMBIOS_TABLE_TYPE13
*)RecordData
;
133 InputData
->InstallableLanguages
= GetSupportedLanguageNumber (mSmbiosMiscHiiHandle
);
136 // Try to check if current langcode matches with the langcodes in installed languages
138 ZeroMem (CurrentLang
, SMBIOS_STRING_MAX_LENGTH
- 1);
139 (VOID
)AsciiStrCpyS (CurrentLang
, SMBIOS_STRING_MAX_LENGTH
- 1, "en|US|iso8859-1");
140 LangStrLen
= AsciiStrLen (CurrentLang
);
143 // Two zeros following the last string.
145 SmbiosRecord
= AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE13
) + LangStrLen
+ 1 + 1);
146 if (SmbiosRecord
== NULL
) {
147 return EFI_OUT_OF_RESOURCES
;
150 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE13
));
152 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE13
);
154 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
155 (VOID
)AsciiStrCpyS (OptionalStrStart
, SMBIOS_STRING_MAX_LENGTH
- 1, CurrentLang
);
157 // Now we have got the full smbios record, call smbios protocol to add this record.
159 Status
= SmbiosMiscAddRecord ((UINT8
*)SmbiosRecord
, NULL
);
160 if (EFI_ERROR (Status
)) {
163 "[%a]:[%dL] Smbios Type13 Table Log Failed! %r \n",
170 FreePool (SmbiosRecord
);