--- /dev/null
+/** @file\r
+\r
+Copyright (c) 2009, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ SmbiosGen.c\r
+\r
+Abstract:\r
+\r
+**/\r
+\r
+#include "SmbiosGen.h"\r
+EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
+extern UINT8 SmbiosGenDxeStrings[];\r
+EFI_SMBIOS_PROTOCOL *gSmbios;\r
+EFI_HII_HANDLE gStringHandle;\r
+\r
+VOID *\r
+GetSmbiosTablesFromHob (\r
+ VOID\r
+ )\r
+{\r
+ EFI_PHYSICAL_ADDRESS *Table;\r
+ EFI_PEI_HOB_POINTERS GuidHob;\r
+ //\r
+ // Get Hob List\r
+ //\r
+ GuidHob.Raw = GetHobList ();\r
+ GuidHob.Raw = GetNextGuidHob (&gEfiSmbiosTableGuid, GuidHob.Raw);\r
+ if (GuidHob.Raw != NULL) {\r
+ Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
+ if (Table != NULL) {\r
+ return (VOID *)(UINTN)*Table;\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+VOID\r
+InstallProcessorSmbios (\r
+ IN VOID *Smbios\r
+ )\r
+{\r
+ SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
+ CHAR8 *AString;\r
+ CHAR16 *UString;\r
+ STRING_REF Token;\r
+\r
+ //\r
+ // Processor info (TYPE 4)\r
+ // \r
+ SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
+ if (SmbiosTable.Raw == NULL) {\r
+ DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // Log Smbios Record Type4\r
+ //\r
+ LogSmbiosData(gSmbios,(UINT8*)SmbiosTable.Type4);\r
+\r
+ //\r
+ // Set ProcessorVersion string\r
+ //\r
+ AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
+ UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
+ ASSERT (UString != NULL);\r
+ AsciiStrToUnicodeStr (AString, UString);\r
+\r
+ Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+ if (Token == 0) {\r
+ gBS->FreePool (UString);\r
+ return ;\r
+ }\r
+ gBS->FreePool (UString);\r
+ return ;\r
+}\r
+\r
+VOID\r
+InstallCacheSmbios (\r
+ IN VOID *Smbios\r
+ )\r
+{\r
+ return ;\r
+}\r
+\r
+VOID\r
+InstallMemorySmbios (\r
+ IN VOID *Smbios\r
+ )\r
+{\r
+ SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
+\r
+ //\r
+ // Generate Memory Array Mapped Address info (TYPE 19)\r
+ //\r
+ SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
+ if (SmbiosTable.Raw == NULL) {\r
+ DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // Record Smbios Type 19\r
+ //\r
+ LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type19);\r
+ return ;\r
+}\r
+\r
+VOID\r
+InstallMiscSmbios (\r
+ IN VOID *Smbios\r
+ )\r
+{\r
+ SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
+ CHAR8 *AString;\r
+ CHAR16 *UString;\r
+ STRING_REF Token;\r
+\r
+ //\r
+ // BIOS information (TYPE 0)\r
+ // \r
+ SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
+ if (SmbiosTable.Raw == NULL) {\r
+ DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // Record Type 2\r
+ //\r
+ AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
+ UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
+ ASSERT (UString != NULL);\r
+ CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
+ AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
+\r
+ Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+ if (Token == 0) {\r
+ gBS->FreePool (UString);\r
+ return ;\r
+ }\r
+ gBS->FreePool (UString);\r
+\r
+ //\r
+ // Log Smios Type 0\r
+ //\r
+ LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type0);\r
+ \r
+ //\r
+ // System information (TYPE 1)\r
+ // \r
+ SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
+ if (SmbiosTable.Raw == NULL) {\r
+ DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // Record Type 3\r
+ //\r
+ AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
+ UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
+ ASSERT (UString != NULL);\r
+ CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
+ AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
+\r
+ Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+ if (Token == 0) {\r
+ gBS->FreePool (UString);\r
+ return ;\r
+ }\r
+ gBS->FreePool (UString);\r
+\r
+ //\r
+ // Log Smbios Type 1\r
+ //\r
+ LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type1);\r
+ \r
+ return ;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosGenEntrypoint (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VOID *Smbios;\r
+\r
+ Smbios = GetSmbiosTablesFromHob ();\r
+ if (Smbios == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiSmbiosProtocolGuid,\r
+ NULL,\r
+ (VOID**)&gSmbios\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiHiiDatabaseProtocolGuid,\r
+ NULL,\r
+ (VOID**)&gHiiDatabase\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ gStringHandle = HiiAddPackages (\r
+ &gEfiCallerIdGuid,\r
+ NULL,\r
+ SmbiosGenDxeStrings,\r
+ NULL\r
+ );\r
+ ASSERT (gStringHandle != NULL);\r
+\r
+ InstallProcessorSmbios (Smbios);\r
+ InstallCacheSmbios (Smbios);\r
+ InstallMemorySmbios (Smbios);\r
+ InstallMiscSmbios (Smbios);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+//\r
+// Internal function\r
+//\r
+\r
+UINTN\r
+SmbiosTableLength (\r
+ IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
+ )\r
+{\r
+ CHAR8 *AChar;\r
+ UINTN Length;\r
+\r
+ AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
+ while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
+ AChar ++;\r
+ }\r
+ Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
+ \r
+ return Length;\r
+}\r
+\r
+SMBIOS_STRUCTURE_POINTER\r
+GetSmbiosTableFromType (\r
+ IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
+ IN UINT8 Type,\r
+ IN UINTN Index\r
+ )\r
+{\r
+ SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
+ UINTN SmbiosTypeIndex;\r
+ \r
+ SmbiosTypeIndex = 0;\r
+ SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
+ if (SmbiosTable.Raw == NULL) {\r
+ return SmbiosTable;\r
+ }\r
+ while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
+ if (SmbiosTable.Hdr->Type == 127) {\r
+ SmbiosTable.Raw = NULL;\r
+ return SmbiosTable;\r
+ }\r
+ if (SmbiosTable.Hdr->Type == Type) {\r
+ SmbiosTypeIndex ++;\r
+ }\r
+ SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
+ }\r
+\r
+ return SmbiosTable;\r
+}\r
+\r
+CHAR8 *\r
+GetSmbiosString (\r
+ IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
+ IN SMBIOS_TABLE_STRING String\r
+ )\r
+{\r
+ CHAR8 *AString;\r
+ UINT8 Index;\r
+\r
+ Index = 1;\r
+ AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
+ while (Index != String) {\r
+ while (*AString != 0) {\r
+ AString ++;\r
+ }\r
+ AString ++;\r
+ if (*AString == 0) {\r
+ return AString;\r
+ }\r
+ Index ++;\r
+ }\r
+\r
+ return AString;\r
+}\r
+\r
+\r
+/**\r
+ Logs SMBIOS record.\r
+\r
+ @param Smbios Pointer to SMBIOS protocol instance.\r
+ @param Buffer Pointer to the data buffer.\r
+\r
+**/\r
+VOID\r
+LogSmbiosData (\r
+ IN EFI_SMBIOS_PROTOCOL *Smbios,\r
+ IN UINT8 *Buffer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SMBIOS_HANDLE SmbiosHandle;\r
+ \r
+ SmbiosHandle = 0;\r
+ Status = Smbios->Add (\r
+ Smbios,\r
+ NULL,\r
+ &SmbiosHandle,\r
+ (EFI_SMBIOS_TABLE_HEADER*)Buffer\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+}\r
--- /dev/null
+/** @file\r
+\r
+Copyright (c) 2009, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name: \r
+\r
+ DataHubGen.h\r
+\r
+Abstract:\r
+\r
+**/\r
+\r
+#ifndef _SMBIOS_GEN_H_\r
+#define _SMBIOS_GEN_H_\r
+\r
+#include <FrameworkDxe.h>\r
+#include <IndustryStandard/SmBios.h>\r
+\r
+#include <Guid/HobList.h>\r
+#include <Guid/SmBios.h>\r
+#include <Guid/DataHubRecords.h>\r
+\r
+#include <Protocol/Smbios.h>\r
+#include <Protocol/FrameworkHii.h>\r
+#include <Protocol/HiiDatabase.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+#define PRODUCT_NAME L"DUET"\r
+#define PRODUCT_VERSION L"Beta"\r
+\r
+#define FIRMWARE_PRODUCT_NAME (PRODUCT_NAME L": ")\r
+#ifdef EFI32\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+#define FIRMWARE_BIOS_VERSIONE (PRODUCT_NAME L"(IA32.UEFI)" PRODUCT_VERSION L": ")\r
+#else\r
+#define FIRMWARE_BIOS_VERSIONE (PRODUCT_NAME L"(IA32.EFI)" PRODUCT_VERSION L": ")\r
+#endif\r
+#else // EFIX64\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+#define FIRMWARE_BIOS_VERSIONE (PRODUCT_NAME L"(X64.UEFI)" PRODUCT_VERSION L": ")\r
+#else\r
+#define FIRMWARE_BIOS_VERSIONE (PRODUCT_NAME L"(X64.EFI)" PRODUCT_VERSION L": ")\r
+#endif\r
+#endif\r
+\r
+SMBIOS_STRUCTURE_POINTER\r
+GetSmbiosTableFromType (\r
+ IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
+ IN UINT8 Type,\r
+ IN UINTN Index\r
+ );\r
+\r
+CHAR8 *\r
+GetSmbiosString (\r
+ IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
+ IN SMBIOS_TABLE_STRING String\r
+ );\r
+\r
+/**\r
+ Logs SMBIOS record.\r
+\r
+ @param Smbios Pointer to SMBIOS protocol instance.\r
+ @param Buffer Pointer to the data buffer.\r
+\r
+**/\r
+VOID\r
+LogSmbiosData (\r
+ IN EFI_SMBIOS_PROTOCOL *Smbios,\r
+ IN UINT8 *Buffer\r
+ );\r
+\r
+#endif\r