1 /*++ 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 **/ 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