summaryrefslogtreecommitdiff
path: root/Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c
diff options
context:
space:
mode:
Diffstat (limited to 'Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c')
-rw-r--r--Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c b/Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c
new file mode 100644
index 0000000000..b3b07c57f8
--- /dev/null
+++ b/Platform/Intel/AdvancedFeaturePkg/Smbios/SmbiosBasicDxe/Type1SystemManufacturerFunction.c
@@ -0,0 +1,121 @@
+/**
+ SMBIOS type 1.
+
+ Copyright (c) 2008 - 2016 Intel Corporation. All rights reserved.
+ This software and associated documentation (if any) is furnished
+ under a license and may only be used or copied in accordance
+ with the terms of the license. Except as permitted by such
+ license, no part of this software or documentation may be
+ reproduced, stored in a retrieval system, or transmitted in any
+ form or by any means without the express written consent of
+ Intel Corporation.
+
+**/
+
+
+#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;
+}