1 /** @file
2 
3 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 **/
13 
14 #include "MiscSubclassDriver.h"
15 /**
16   This function makes boot time changes to the contents of the
17   MiscOemString (Type 11).
18 
19   @param  RecordData                 Pointer to copy of RecordData from the Data Table.
20 
21   @retval EFI_SUCCESS                All parameters were valid.
22   @retval EFI_UNSUPPORTED            Unexpected RecordType value.
23   @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
24 
25 **/
MISC_SMBIOS_TABLE_FUNCTION(SystemLanguageString)26 MISC_SMBIOS_TABLE_FUNCTION(SystemLanguageString)
27 {
28   EFI_STATUS               Status;
29   EFI_SMBIOS_HANDLE        SmbiosHandle;
30   SMBIOS_TABLE_TYPE13      *SmbiosRecord;
31   UINTN                    StrLeng;
32   CHAR8                    *OptionalStrStart;
33   EFI_STRING               Str;
34   STRING_REF               TokenToGet;
35 
36 
37   //
38   // First check for invalid parameters.
39   //
40   if (RecordData == NULL) {
41     return EFI_INVALID_PARAMETER;
42   }
43 
44   TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_LANGUAGE_STRING);
45   Str = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
46   StrLeng = StrLen(Str);
47   if (StrLeng > SMBIOS_STRING_MAX_LENGTH) {
48     return EFI_UNSUPPORTED;
49   }
50 
51   //
52   // Two zeros following the last string.
53   //
54   SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE13) + StrLeng + 1 + 1);
55   ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE13) + StrLeng + 1 + 1);
56 
57   SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION;
58   SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);
59   //
60   // Make handle chosen by smbios protocol.add automatically.
61   //
62   SmbiosRecord->Hdr.Handle    = 0;
63   SmbiosRecord->InstallableLanguages = 1;
64   SmbiosRecord->Flags   = 1;
65   SmbiosRecord->CurrentLanguages = 1;
66   OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
67   UnicodeStrToAsciiStr(Str, OptionalStrStart);
68 
69 
70   //
71   // Now we have got the full smbios record, call smbios protocol to add this record.
72   //
73   Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);
74 
75   FreePool(SmbiosRecord);
76   return Status;
77 }
78 
79