/** @file Smbios type 1. Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SmbiosBasic.h" /** This function makes boot time changes to the contents of the SystemManufacturer (Type 1). @retval EFI_SUCCESS All parameters were valid. @retval EFI_UNSUPPORTED Unexpected RecordType value. @retval EFI_INVALID_PARAMETER Invalid parameter was found. **/ EFI_STATUS EFIAPI SystemManufacturerFunction( IN EFI_SMBIOS_PROTOCOL *Smbios ) { EFI_STATUS Status; CHAR8 *ManufacturerStr; CHAR8 *ProductNameStr; CHAR8 *VersionStr; CHAR8 *SerialNumberStr; CHAR8 *SKUNumberStr; CHAR8 *FamilyStr; UINTN ManufacturerStrLen; UINTN ProductNameStrLen; UINTN VersionStrLen; UINTN SerialNumberStrLen; UINTN SKUNumberStrLen; UINTN FamilyStrLen; UINTN TableSize; SMBIOS_TABLE_TYPE1 *PcdSmbiosRecord; SMBIOS_TABLE_TYPE1 *SmbiosRecord; EFI_SMBIOS_HANDLE SmbiosHandle; UINTN StringOffset; PcdSmbiosRecord = PcdGetPtr (PcdSmbiosType1SystemInformation); ManufacturerStr = PcdGetPtr (PcdSmbiosType1StringManufacturer); ManufacturerStrLen = AsciiStrLen (ManufacturerStr); ASSERT (ManufacturerStrLen <= SMBIOS_STRING_MAX_LENGTH); ProductNameStr = PcdGetPtr (PcdSmbiosType1StringProductName); ProductNameStrLen = AsciiStrLen (ProductNameStr); ASSERT (ProductNameStrLen <= SMBIOS_STRING_MAX_LENGTH); VersionStr = PcdGetPtr (PcdSmbiosType1StringVersion); VersionStrLen = AsciiStrLen (VersionStr); ASSERT (VersionStrLen <= SMBIOS_STRING_MAX_LENGTH); SerialNumberStr = PcdGetPtr (PcdSmbiosType1StringSerialNumber); SerialNumberStrLen = AsciiStrLen (SerialNumberStr); ASSERT (SerialNumberStrLen <= SMBIOS_STRING_MAX_LENGTH); SKUNumberStr = PcdGetPtr (PcdSmbiosType1StringSKUNumber); SKUNumberStrLen = AsciiStrLen (SKUNumberStr); ASSERT (SKUNumberStrLen <= SMBIOS_STRING_MAX_LENGTH); FamilyStr = PcdGetPtr (PcdSmbiosType1StringFamily); FamilyStrLen = AsciiStrLen (FamilyStr); ASSERT (FamilyStrLen <= SMBIOS_STRING_MAX_LENGTH); // // Create table size based on string lengths // TableSize = sizeof (SMBIOS_TABLE_TYPE1) + ManufacturerStrLen + 1 + ProductNameStrLen + 1 + VersionStrLen + 1 + SerialNumberStrLen + 1 + SKUNumberStrLen + 1 + FamilyStrLen + 1 + 1; SmbiosRecord = AllocateZeroPool (TableSize); if (SmbiosRecord == NULL) { ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); return EFI_OUT_OF_RESOURCES; } CopyMem (SmbiosRecord, PcdSmbiosRecord, sizeof(SMBIOS_TABLE_TYPE1)); // // Fill in Type 1 fields // SmbiosRecord->Hdr.Type = SMBIOS_TYPE_SYSTEM_INFORMATION; SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1); SmbiosRecord->Hdr.Handle = 0; // // Add strings to bottom of data block // StringOffset = SmbiosRecord->Hdr.Length; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, ManufacturerStr, ManufacturerStrLen); StringOffset += ManufacturerStrLen + 1; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, ProductNameStr, ProductNameStrLen); StringOffset += ProductNameStrLen + 1; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, VersionStr, VersionStrLen); StringOffset += VersionStrLen + 1; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, SerialNumberStr, SerialNumberStrLen); StringOffset += SerialNumberStrLen + 1; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, SKUNumberStr, SKUNumberStrLen); StringOffset += SKUNumberStrLen + 1; CopyMem ((UINT8 *)SmbiosRecord + StringOffset, FamilyStr, FamilyStrLen); // // Now we have got the full smbios record, call smbios protocol to add this record. // Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord); FreePool(SmbiosRecord); return Status; }