1 /**@file
2 
3 Copyright (c) 2006 - 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 Module Name:
13 
14   MiscSystemManufacturerFunction.c
15 
16 Abstract:
17 
18   This driver parses the mMiscSubclassDataTable structure and reports
19   any generated data to the DataHub.
20 
21 **/
22 
23 #include "MiscSubclassDriver.h"
24 
25 /**
26   This function makes boot time changes to the contents of the
27   MiscSystemManufacturer (Type 1).
28 
29   @param  RecordData                 Pointer to copy of RecordData from the Data Table.
30 
31   @retval EFI_SUCCESS                All parameters were valid.
32   @retval EFI_UNSUPPORTED            Unexpected RecordType value.
33   @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
34 
35 **/
MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer)36 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer)
37 {
38   CHAR8                             *OptionalStrStart;
39   UINTN                             ManuStrLen;
40   UINTN                             VerStrLen;
41   UINTN                             PdNameStrLen;
42   UINTN                             SerialNumStrLen;
43   EFI_STATUS                        Status;
44   EFI_STRING                        Manufacturer;
45   EFI_STRING                        ProductName;
46   EFI_STRING                        Version;
47   EFI_STRING                        SerialNumber;
48   STRING_REF                        TokenToGet;
49   EFI_SMBIOS_HANDLE                 SmbiosHandle;
50   SMBIOS_TABLE_TYPE1                *SmbiosRecord;
51   EFI_MISC_SYSTEM_MANUFACTURER      *ForType1InputData;
52 
53   ForType1InputData = (EFI_MISC_SYSTEM_MANUFACTURER *)RecordData;
54 
55   //
56   // First check for invalid parameters.
57   //
58   if (RecordData == NULL) {
59     return EFI_INVALID_PARAMETER;
60   }
61 
62   TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER);
63   Manufacturer = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
64   ManuStrLen = StrLen(Manufacturer);
65   if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
66     return EFI_UNSUPPORTED;
67   }
68 
69   TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);
70   ProductName = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
71   PdNameStrLen = StrLen(ProductName);
72   if (PdNameStrLen > SMBIOS_STRING_MAX_LENGTH) {
73     return EFI_UNSUPPORTED;
74   }
75 
76   TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);
77   Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
78   VerStrLen = StrLen(Version);
79   if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
80     return EFI_UNSUPPORTED;
81   }
82 
83   TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER);
84   SerialNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
85   SerialNumStrLen = StrLen(SerialNumber);
86   if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
87     return EFI_UNSUPPORTED;
88   }
89   //
90   // Two zeros following the last string.
91   //
92   SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE1) + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + 1);
93   ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE1) + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + 1);
94 
95   SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_INFORMATION;
96   SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1);
97   //
98   // Make handle chosen by smbios protocol.add automatically.
99   //
100   SmbiosRecord->Hdr.Handle = 0;
101   //
102   // Manu will be the 1st optional string following the formatted structure.
103   //
104   SmbiosRecord->Manufacturer = 1;
105   //
106   // ProductName will be the 2nd optional string following the formatted structure.
107   //
108   SmbiosRecord->ProductName = 2;
109   //
110   // Version will be the 3rd optional string following the formatted structure.
111   //
112   SmbiosRecord->Version = 3;
113   //
114   // Version will be the 4th optional string following the formatted structure.
115   //
116   SmbiosRecord->SerialNumber = 4;
117   CopyMem ((UINT8 *) (&SmbiosRecord->Uuid),&ForType1InputData->SystemUuid,16);
118   SmbiosRecord->WakeUpType = (UINT8)ForType1InputData->SystemWakeupType;
119 
120   OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
121   UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);
122   UnicodeStrToAsciiStr(ProductName, OptionalStrStart + ManuStrLen + 1);
123   UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1);
124   UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1);
125 
126   //
127   // Now we have got the full smbios record, call smbios protocol to add this record.
128   //
129   Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);
130 
131   FreePool(SmbiosRecord);
132   return Status;
133 }
134 
135 /* eof - MiscSystemManufacturerFunction.c */
136