]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Rename DataHubSmBiosRecordsOnPiSmBiosThunk to PiSmbiosRecordOnDataHubSmbiosRecordThun...
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Dec 2009 06:42:12 +0000 (06:42 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Dec 2009 06:42:12 +0000 (06:42 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9646 6f19259b-4bc3-4df7-8a09-765794883524

19 files changed:
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvLib.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvTable.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/DataHubSmBiosRecordsOnPiSmBiosThunk.inf [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MemoryConv.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MiscConv.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ProcessorConv.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.c [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.h [deleted file]
EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Translate.c [deleted file]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvLib.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvTable.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MiscConv.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/PiSmbiosRecordOnDataHubSmbiosRecordThunk.inf [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ProcessorConv.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Translate.c [new file with mode: 0644]
EdkCompatibilityPkg/EdkCompatibilityPkg.dsc

diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvLib.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvLib.c
deleted file mode 100644 (file)
index fac1fb7..0000000
+++ /dev/null
@@ -1,786 +0,0 @@
-/** @file\r
-  Common filling functions used in translating Datahub's record\r
-  to PI SMBIOS's record.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-/**\r
-  Field Filling Function for Cache SubClass record type 5&6 -- Cache SRAM type.\r
-  Offset is mandatory\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldCacheType5 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_CACHE_SRAM_TYPE_DATA SramData;\r
-  UINT32                   Temp;\r
-\r
-  SramData = *(EFI_CACHE_SRAM_TYPE_DATA*)RecordData;\r
-\r
-  //\r
-  // Swap two fields because of inconsistency between smbios and datahub specs\r
-  //\r
-  Temp                  = SramData.Asynchronous;\r
-  SramData.Asynchronous = SramData.Synchronous;\r
-  SramData.Synchronous  = Temp;\r
-  \r
-  //\r
-  // Truncate the data to word\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    (EFI_CACHE_SRAM_TYPE_DATA *) &SramData,\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Cache SubClass record type 10 -- Cache Config.\r
-  Offset is mandatory\r
-\r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldCacheType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-\r
-  UINT16  CacheConfig;\r
-\r
-  CopyMem (&CacheConfig, RecordData, 2);\r
-\r
-  if ((CacheConfig & 0x07) == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Truncate the data to 2 bytes and make cache level zero-based.\r
-  //\r
-  CacheConfig--;\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    &CacheConfig,\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Enlarge the structure buffer of a structure node in SMBIOS database.\r
-  The function maybe lead the structure pointer for SMBIOS record changed.\r
-  \r
-  @param StructureNode The structure node whose structure buffer is to be enlarged.\r
-  @param NewLength     The new length of SMBIOS record which does not include unformat area.\r
-  @param OldBufferSize The old size of SMBIOS record buffer.\r
-  @param NewBufferSize The new size is targeted for enlarged.\r
-  \r
-  @retval EFI_OUT_OF_RESOURCES  No more memory to allocate new record\r
-  @retval EFI_SUCCESS           Success to enlarge the record buffer size.\r
-**/\r
-EFI_STATUS\r
-SmbiosEnlargeStructureBuffer (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE *StructureNode,\r
-  UINT8                         NewLength,\r
-  UINTN                         OldBufferSize,\r
-  UINTN                         NewBufferSize\r
-  )\r
-{\r
-  EFI_SMBIOS_TABLE_HEADER   *NewRecord;\r
-  EFI_SMBIOS_PROTOCOL       *Smbios;\r
-  EFI_STATUS                Status;\r
-  UINT8                     CountOfString;\r
-  \r
-  NewRecord = NULL;\r
-  Smbios    = GetSmbiosProtocol();\r
-  ASSERT (Smbios != NULL);\r
-  \r
-  NewRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (NewBufferSize);\r
-  if (NewRecord == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  CopyMem (NewRecord, StructureNode->Structure, OldBufferSize);\r
-  \r
-  \r
-  Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
-  //\r
-  // try to use original handle to enlarge the buffer.\r
-  //\r
-  NewRecord->Length = NewLength;\r
-  Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, NewRecord);\r
-  ASSERT_EFI_ERROR (Status);\r
-  FreePool (NewRecord);\r
-  \r
-  StructureNode->Structure = GetSmbiosBufferFromHandle (\r
-                               StructureNode->SmbiosHandle, \r
-                               StructureNode->SmbiosType, \r
-                               NULL\r
-                               );\r
-  GetSmbiosStructureSize (\r
-    StructureNode->Structure,\r
-    &StructureNode->StructureSize,\r
-    &CountOfString\r
-    );\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Fill a standard Smbios string field. \r
-  \r
-  This function will convert the unicode string to single byte chars, and only\r
-  English language is supported.\r
-  This function changes the Structure pointer value of the structure node, \r
-  which should be noted by Caller.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER   RecordDataSize is too larger\r
-  @retval EFI_OUT_OF_RESOURCES    No memory to allocate new buffer for string\r
-  @retval EFI_SUCCESS             Sucess append string for a SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldString (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  UINT16                  *Data;\r
-  CHAR8                   AsciiData[SMBIOS_STRING_MAX_LENGTH];\r
-  UINT8                   CountOfStrings;\r
-  UINTN                   OrigStringNumber;\r
-  EFI_SMBIOS_PROTOCOL     *Smbios;\r
-  EFI_SMBIOS_HANDLE       SmbiosHandle;\r
-  UINT32                  OrigStructureSize;\r
-  UINTN                   NewStructureSize;\r
-  EFI_SMBIOS_TABLE_HEADER *NewRecord;\r
-  UINT32                  StringLength;\r
-  \r
-  Status            = EFI_SUCCESS;\r
-  OrigStringNumber  = 0;\r
-  OrigStructureSize = 0;\r
-\r
-  //\r
-  // if we have a NULL token,\r
-  //\r
-  if (0 == *((STRING_REF *) RecordData)) {\r
-    *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
-    return EFI_SUCCESS;\r
-  }\r
-  \r
-  //\r
-  // Get the String from the Hii Database\r
-  //\r
-  Data = HiiGetPackageString (\r
-             &(StructureNode->ProducerName),\r
-             *((EFI_STRING_ID *) RecordData),\r
-             NULL\r
-             );\r
-  if (Data == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  StringLength = (UINT32)StrLen (Data);\r
-  //\r
-  // Count the string size including the terminating 0.\r
-  //\r
-  if (StringLength == 0) {\r
-    *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
-    FreePool (Data);\r
-    return EFI_SUCCESS;\r
-  }\r
-  \r
-  if (StringLength > SMBIOS_STRING_MAX_LENGTH) {\r
-    //\r
-    // Too long a string\r
-    //\r
-    FreePool (Data);\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-    \r
-  Smbios = GetSmbiosProtocol();\r
-  ASSERT (Smbios != NULL);\r
-  \r
-  //\r
-  // Convert Unicode string to Ascii string which only supported by SMBIOS.\r
-  //\r
-  ZeroMem (AsciiData, SMBIOS_STRING_MAX_LENGTH);\r
-  UnicodeStrToAsciiStr (Data, AsciiData);\r
-  \r
-  //\r
-  // if the field at offset is already filled with some value,\r
-  // find out the string it points to\r
-  //\r
-  OrigStringNumber = *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset);\r
-  if (OrigStringNumber != 0) {\r
-    DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Update %dth string for type[%d],offset[0x%x],handle[0x%x] to [%s]\n", \r
-            OrigStringNumber, StructureNode->SmbiosType, Offset, StructureNode->SmbiosHandle, AsciiData));  \r
-    \r
-    //\r
-    // If original string number is not zero, just update string\r
-    //\r
-    Status = Smbios->UpdateString (Smbios, &StructureNode->SmbiosHandle, &OrigStringNumber, AsciiData);\r
-    if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Fail to update %dth string in offset 0x%x for handle:0x%x type:0x%x\n", \r
-             OrigStringNumber, Offset, StructureNode->SmbiosHandle, StructureNode->SmbiosType));\r
-      ASSERT_EFI_ERROR (Status);\r
-      return Status;\r
-    }\r
-  } else {\r
-    //\r
-    // If the string has not been filled in SMBIOS database, remove it and add again\r
-    // with string appended.\r
-    //\r
-    Status = GetSmbiosStructureSize (StructureNode->Structure, &OrigStructureSize, &CountOfStrings);\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    if (CountOfStrings == 0) {\r
-      NewStructureSize = OrigStructureSize + StringLength;\r
-    } else {\r
-      NewStructureSize = OrigStructureSize + StringLength + 1;\r
-    }\r
-    \r
-    NewRecord = AllocateZeroPool (NewStructureSize);\r
-    if (NewRecord == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    CopyMem (NewRecord, StructureNode->Structure, OrigStructureSize);\r
-    \r
-    //\r
-    // Copy new string into tail of original SMBIOS record buffer.\r
-    //\r
-    if (CountOfStrings == 0) {\r
-      AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 2, AsciiData);\r
-    } else {\r
-      AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 1, AsciiData);\r
-    }\r
-    DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Type(%d) offset(0x%x) StringNumber:%d\n", \r
-            StructureNode->SmbiosType, Offset, CountOfStrings + 1));\r
-    //\r
-    // Update string reference number\r
-    //\r
-    *(UINT8 *) ((UINT8 *) NewRecord + Offset) = (UINT8) (CountOfStrings + 1);\r
-    SmbiosHandle = StructureNode->SmbiosHandle;\r
-    \r
-    //\r
-    // Remove original SMBIOS record and add new one\r
-    //\r
-    Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    //\r
-    // Add new SMBIOS record\r
-    //\r
-    Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, NewRecord);\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    StructureNode->SmbiosHandle = SmbiosHandle;\r
-    \r
-    FreePool (NewRecord);\r
-  }\r
-  \r
-  //\r
-  // The SMBIOS record buffer maybe re-allocated in SMBIOS database,\r
-  // so update cached buffer pointer in DataHub structure list.\r
-  //\r
-  StructureNode->Structure = GetSmbiosBufferFromHandle (\r
-                               StructureNode->SmbiosHandle, \r
-                               StructureNode->SmbiosType,\r
-                               NULL\r
-                               );\r
-  ASSERT (StructureNode->Structure != NULL);\r
-  \r
-  //\r
-  // The string update action maybe lead the record is re-allocated in SMBIOS database\r
-  // so update cached record pointer\r
-  //\r
-  Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureNode->StructureSize, &CountOfStrings);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Find a handle that matches the Link Data and the target Smbios type.\r
-  \r
-  @param  TargetType     the Smbios type\r
-  @param  SubClass       the SubClass\r
-  @param  LinkData       Specifies Instance, SubInstance and ProducerName\r
-  @param  Handle         the HandleNum found  \r
-  \r
-  @retval EFI_NOT_FOUND Can not find the record according to handle\r
-  @retval EFI_SUCCESS   Success to find the handle\r
-**/\r
-EFI_STATUS\r
-SmbiosFindHandle (\r
-  IN      UINT8               TargetType,\r
-  IN      EFI_GUID            *SubClass,\r
-  IN      EFI_INTER_LINK_DATA *LinkData,\r
-  IN OUT  UINT16              *HandleNum\r
-  )\r
-{\r
-  LIST_ENTRY        *Link;\r
-  SMBIOS_STRUCTURE_NODE *StructureNode;\r
-\r
-  StructureNode = NULL;\r
-\r
-  //\r
-  // Find out the matching handle\r
-  //\r
-  for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
-    StructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
-    if (StructureNode->Structure->Type == TargetType &&\r
-        CompareGuid (&(StructureNode->SubClass), SubClass) &&\r
-        StructureNode->Instance == LinkData->Instance &&\r
-        StructureNode->SubInstance == LinkData->SubInstance\r
-        ) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  if (Link == &mStructureList) {\r
-    return EFI_NOT_FOUND;\r
-  } else {\r
-    *HandleNum = StructureNode->Structure->Handle;\r
-    return EFI_SUCCESS;\r
-  }\r
-}\r
-\r
-/**\r
-  Fill the inter link field for a SMBIOS recorder.\r
-  \r
-  Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
-  maybe another SMBIOS record has not been added, so put the InterLink request into\r
-  a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
-  \r
-  @param StructureNode        Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
-  @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
-  @param LinkSmbiosType       The type of SMBIOS record want to be linked.\r
-  @param InterLink            Point to EFI_INTER_LINK_DATA will be put linked list.\r
-  @param SubClassGuid         The guid of subclass for linked SMBIOS record.\r
-  \r
-  @retval EFI_SUCESS  The linked record is found and no need fixup in future.\r
-  @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldInterLink (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT16                    LinkSmbiosNodeOffset,\r
-  IN      UINT8                     LinkSmbiosType,\r
-  IN      EFI_INTER_LINK_DATA       *InterLink,\r
-  IN      EFI_GUID                  *SubClassGuid\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
-  UINT16                      StructureHandle;\r
-\r
-  Status            = EFI_SUCCESS;\r
-  LinkDataFixupNode = NULL;\r
-\r
-  Status = SmbiosFindHandle (\r
-            LinkSmbiosType, // Smbios type\r
-            SubClassGuid,\r
-            InterLink,\r
-            &StructureHandle\r
-            );\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Set the handle\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) (StructureNode->Structure) + LinkSmbiosNodeOffset,\r
-      &StructureHandle,\r
-      sizeof (EFI_SMBIOS_HANDLE)\r
-      );\r
-  } else {\r
-    //\r
-    // Hang this in the link data fixup node\r
-    //\r
-    LinkDataFixupNode = AllocateZeroPool (sizeof (SMBIOS_LINK_DATA_FIXUP_NODE));\r
-    if (LinkDataFixupNode == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    LinkDataFixupNode->Signature  = SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE;\r
-    LinkDataFixupNode->Offset     = LinkSmbiosNodeOffset;\r
-    LinkDataFixupNode->TargetType = LinkSmbiosType;\r
-    CopyMem (\r
-      &LinkDataFixupNode->SubClass,\r
-      SubClassGuid,\r
-      sizeof (EFI_GUID)\r
-      );\r
-    CopyMem (\r
-      &LinkDataFixupNode->LinkData,\r
-      InterLink,\r
-      sizeof (EFI_INTER_LINK_DATA)\r
-      );\r
-    InsertTailList (\r
-      &StructureNode->LinkDataFixup,\r
-      &(LinkDataFixupNode->Link)\r
-      );\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function. Transform an EFI_EXP_BASE10_DATA to a word, with 'Mega'\r
-  as the unit.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldBase10ToWordWithMega (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_EXP_BASE10_DATA *Base10Data;\r
-  INT16               Value;\r
-  INT16               Exponent;\r
-\r
-  if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Base10Data  = RecordData;\r
-  Value       = Base10Data->Value;\r
-  Exponent    = Base10Data->Exponent;\r
-\r
-  Exponent -= 6;\r
-  while (Exponent != 0) {\r
-    if (Exponent > 0) {\r
-      Value = (INT16) (Value * 10);\r
-      Exponent--;\r
-    } else {\r
-      Value = (INT16) (Value / 10);\r
-      Exponent++;\r
-    }\r
-  }\r
-\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    &Value,\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 'Kilo'\r
-  as the unit. Granularity implemented for Cache Size.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldBase2ToWordWithKilo (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_EXP_BASE2_DATA  *Base2Data;\r
-  UINT32              Value;\r
-  UINT16              Exponent;\r
-\r
-  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Base2Data = RecordData;\r
-  Value     = Base2Data->Value;\r
-  Exponent  = Base2Data->Exponent;\r
-\r
-  Exponent -= 10;\r
-  Value <<= Exponent;\r
-  \r
-  //\r
-  // Implement cache size granularity\r
-  //\r
-  if(Value >= 0x8000) {\r
-    Value >>= 6;\r
-    Value |=  0x8000;\r
-  }\r
-  \r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    &Value,\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
-  as the unit.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldBase2ToByteWith64K (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_EXP_BASE2_DATA  *Base2Data;\r
-  UINT16              Value;\r
-  UINT16              Exponent;\r
-\r
-  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Base2Data = RecordData;\r
-  Value     = Base2Data->Value;\r
-  Exponent  = Base2Data->Exponent;\r
-  Exponent -= 16;\r
-  Value <<= Exponent;\r
-\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    &Value,\r
-    1\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 10exp-9\r
-  as the unit.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldBase10ToByteWithNano (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_EXP_BASE10_DATA *Base10Data;\r
-  INT16               Value;\r
-  INT16               Exponent;\r
-\r
-  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Base10Data  = RecordData;\r
-  Value       = Base10Data->Value;\r
-  Exponent    = Base10Data->Exponent;\r
-\r
-  Exponent += 9;\r
-  while (Exponent != 0) {\r
-    if (Exponent > 0) {\r
-      Value = (INT16) (Value * 10);\r
-      Exponent--;\r
-    } else {\r
-      Value = (INT16) (Value / 10);\r
-      Exponent++;\r
-    }\r
-  }\r
-\r
-  * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) Value;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function: truncate record data to byte and fill in the\r
-  field as indicated by Offset.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldTruncateToByte (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  //\r
-  // Truncate the data to 8 bits\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (*(UINT8 *) RecordData);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function: truncate record data to byte and fill in the\r
-  field as indicated by Offset.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
-  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldTruncateToWord (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  //\r
-  // Truncate the data to 8 bits\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    RecordData,\r
-    2\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Check if OEM structure has included 2 trailing 0s in data record.\r
-  \r
-  @param RecordData       Point to record data will be checked.\r
-  @param RecordDataSize   The size of record data.\r
-  \r
-  @retval 0    2 trailing 0s exist in unformatted section\r
-  @retval 1    1 trailing 0 exists at the end of unformatted section\r
-  @retval -1   There is no 0 at the end of unformatted section\r
-**/\r
-INT8\r
-SmbiosCheckTrailingZero (\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  SMBIOS_STRUCTURE  *Smbios;\r
-  CHAR8             *Start;\r
-  CHAR8             *End;\r
-  \r
-  Smbios = (SMBIOS_STRUCTURE *) RecordData;\r
-  \r
-  //\r
-  // Skip over formatted section\r
-  //\r
-  Start = (CHAR8 *) ((UINT8 *) Smbios + Smbios->Length);\r
-  End   = (CHAR8 *) RecordData + RecordDataSize;\r
-  \r
-  //\r
-  // Unformatted section exists\r
-  //\r
-  while (Start < End - 1) {\r
-    //\r
-    // Avoid unaligned issue on IPF\r
-    //\r
-    if ((*Start == 0) && (*(Start + 1) == 0)) {\r
-      //\r
-      // 2 trailing 0s exist in unformatted section\r
-      //\r
-      return 0;\r
-    }\r
-    Start++;\r
-  }\r
-  \r
-  if (Start == End - 1) {\r
-    //\r
-    // Check if there has been already 1 trailing 0\r
-    //\r
-    if (*Start == 0) {\r
-      return 1;\r
-    } \r
-  }\r
-  \r
-  //\r
-  // There is no 0 at the end of unformatted section\r
-  //\r
-  return -1;\r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvTable.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ConvTable.c
deleted file mode 100644 (file)
index 2809748..0000000
+++ /dev/null
@@ -1,1235 +0,0 @@
-/** @file\r
-  The conversion table that guides the generation of the Smbios struture list.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-///\r
-/// The minimal length includes last two zero bytes.\r
-///\r
-SMBIOS_TYPE_INFO_TABLE_ENTRY  mTypeInfoTable[] = {\r
-  //\r
-  // Type 0: Bios Information\r
-  //\r
-  {\r
-    0,\r
-    0x1a,\r
-    TRUE,\r
-    FALSE\r
-  },  // size includes wo extension bytes\r
-  //\r
-  // Type 1: System Information\r
-  //\r
-  {\r
-    1,\r
-    0x1d,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 2: Base Board Information\r
-  //\r
-  {\r
-    2,\r
-    0x12,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 3: System Enclosure or Chassis\r
-  //\r
-  {\r
-    3,\r
-    0x17, // 0x13 covers till OEM-defined, not right\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 4: Processor\r
-  //\r
-  {\r
-    4,\r
-    0x25,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 5: Memory Controller\r
-  //\r
-  {\r
-    5,\r
-    0x12,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 6: Memory\r
-  //\r
-  {\r
-    6,\r
-    0x0E,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 7: Cache\r
-  //\r
-  {\r
-    7,\r
-    0x15,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 8: Port Connector Information\r
-  //\r
-  {\r
-    8,\r
-    0x0B,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 9: System Slots\r
-  //\r
-  {\r
-    9,\r
-    0x0f,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 10: On Board Device Information\r
-  //\r
-  {\r
-    10,\r
-    0x8,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 11: OEM Strings\r
-  //\r
-  {\r
-    11, \r
-    0x7, \r
-    FALSE, \r
-    FALSE\r
-  },\r
-  //\r
-  // Type 12: System Configuration Options\r
-  //\r
-  {\r
-    12,\r
-    0x7,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 13: BIOS Language Information\r
-  //\r
-  {\r
-    13,\r
-    0x18,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 15: System Event Log\r
-  //\r
-  {\r
-    15,\r
-    0x19,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 16: Physical Memory Array\r
-  //\r
-  {\r
-    16,\r
-    0x11,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 17: Memory Device\r
-  //\r
-  {\r
-    17,\r
-    0x1d,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 18: 32 bit Memory Error Information\r
-  //\r
-  {\r
-    18,\r
-    0x19,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 19: Memory Array Mapped Address\r
-  //\r
-  {\r
-    19,\r
-    0x11,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 20: Memory Device Mapped Address\r
-  //\r
-  {\r
-    20,\r
-    0x15,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 21: Pointing Device\r
-  //\r
-  {\r
-    21,\r
-    0x9,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 22: Portable Battery\r
-  //\r
-  {\r
-    22,\r
-    0x1c,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 23: System Reset\r
-  //\r
-  {\r
-    23,\r
-    0x0f,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 24: Hardware Security\r
-  //\r
-  {\r
-    24,\r
-    0x07,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 25: System Power Controls\r
-  //\r
-  {\r
-    25,\r
-    0x0b,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 26: Voltage Probe\r
-  //\r
-  {\r
-    26,\r
-    0x18,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 27: Cooling Device\r
-  //\r
-  {\r
-    27,\r
-    0x10,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 28: Temperature Probe\r
-  //\r
-  {\r
-    28,\r
-    0x18,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 29: Electrical Current Probe\r
-  //\r
-  {\r
-    29,\r
-    0x18,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 30: Out-of-Band Remote Access\r
-  //\r
-  {\r
-    30,\r
-    0x08,\r
-    FALSE,\r
-    FALSE\r
-  },         \r
-  //\r
-  // Type 31: BIS Entry Point\r
-  //\r
-  {\r
-    31,\r
-    0x1c,\r
-    FALSE,\r
-    FALSE\r
-  },   \r
-  //\r
-  // Type 32: System Boot Information\r
-  //\r
-  {\r
-    32,\r
-    0x16,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 33: 64 bit Memory Error Information\r
-  //\r
-  {\r
-    33,\r
-    0x21,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 34: Management Device\r
-  //\r
-  {\r
-    34,\r
-    0x0d,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 36: Management Device Threshold\r
-  //\r
-  {\r
-    36,\r
-    0x12,\r
-    FALSE,\r
-    FALSE\r
-  },        \r
-  //\r
-  // Type 37: Memory Channel\r
-  //\r
-  {\r
-    37,\r
-    0x0c,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 38: IPMI device info\r
-  //\r
-  {\r
-    38,\r
-    0x12,\r
-    TRUE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 39: Power supply\r
-  //\r
-  {\r
-    39,\r
-    0x18,\r
-    FALSE,\r
-    FALSE\r
-  },  \r
-  //\r
-  // Type 0x80-0xFF: OEM type\r
-  //\r
-  {\r
-    0x80,\r
-    0x6,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Type 127: End of Table\r
-  //\r
-  {\r
-    127,\r
-    0x6,\r
-    FALSE,\r
-    FALSE\r
-  },\r
-  //\r
-  // Terminator\r
-  //\r
-  {\r
-    0,\r
-    0\r
-  }\r
-};\r
-\r
-SMBIOS_CONVERSION_TABLE_ENTRY mConversionTable[] = {\r
-\r
-  {\r
-    //\r
-    // Processor Sub Class -- Record Type 1: Frequency\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorCoreFrequencyRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x16,\r
-    SmbiosFldBase10ToWordWithMega\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 2: Bus Frequency\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorFsbFrequencyRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x12,\r
-    SmbiosFldBase10ToWordWithMega\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 3: Version\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorVersionRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x10,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 4: Manufacturor\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorManufacturerRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x7,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 5: Serial Number\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorSerialNumberRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x20,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 6: ID\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorIdRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x08,\r
-    SmbiosFldProcessorType6\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 7: Type\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorTypeRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x05,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 8: Family\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorFamilyRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x06,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 9: Voltage\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorVoltageRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x11,\r
-    SmbiosFldProcessorType9\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 14: Status\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorStatusRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x18,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 15: Socket Type\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorSocketTypeRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x19,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 16: Socket Name\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorSocketNameRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x04,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 17: Cache Associtation\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    CacheAssociationRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
-    0,\r
-    SmbiosFldProcessorType17\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor Sub Class -- Record Type 18: MaxFrequency\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorMaxCoreFrequencyRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x14,\r
-    SmbiosFldBase10ToWordWithMega\r
-  },\r
-\r
-  {\r
-    //\r
-    // Processor SubClass -- Record Type 19: Asset Tag\r
-    //\r
-    EFI_PROCESSOR_SUBCLASS_GUID,\r
-    ProcessorAssetTagRecordType,\r
-    4,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x21,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 1: Size\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheSizeRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x09,\r
-    SmbiosFldBase2ToWordWithKilo\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 2: Max Size\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    MaximumSizeCacheRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x07,\r
-    SmbiosFldBase2ToWordWithKilo\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 3: Speed\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheSpeedRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x0f,\r
-    SmbiosFldBase10ToByteWithNano\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 4: Socket\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheSocketRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x04,\r
-    SmbiosFldString\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 5: Supported SRAM type\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheSramTypeRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x0b,\r
-    SmbiosFldCacheType5  // Asynchronous and Synchronous are reversed\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 6: Installed SRAM type\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheInstalledSramTypeRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x0d,\r
-    SmbiosFldCacheType5\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 7: error correction type\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheErrorTypeRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x10,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 8: cache type\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheTypeRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x11,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 9: Associativity\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheAssociativityRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x12,\r
-    SmbiosFldTruncateToByte\r
-  },\r
-\r
-  {\r
-    //\r
-    // Cache SubClass -- Record Type 10: Cache configuration\r
-    //\r
-    EFI_CACHE_SUBCLASS_GUID,\r
-    CacheConfigRecordType,\r
-    7,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-    0x05,\r
-    SmbiosFldCacheType10\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 2: Physical Memory Array\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER,\r
-    16,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType2\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 6\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
-    6,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldSMBIOSType6\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 17\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
-    17,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType3\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 4: Memory Array Mapped Address\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER,\r
-    19,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType4\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 5: Memory Device Mapped Address\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER,\r
-    20,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType5\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 6: Memory Channel Type\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER,\r
-    37,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType6\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 7: Memory Channel Device\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER,\r
-    37,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType7\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 8: Memory Controller information\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER,\r
-    5,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType8\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 9: Memory 32 Bit Error Information\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
-    18,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType9\r
-  },\r
-\r
-  {\r
-    //\r
-    // Memory SubClass -- Record Type 10: Memory 64 Bit Error Information\r
-    //\r
-    EFI_MEMORY_SUBCLASS_GUID,\r
-    EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
-    33,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMemoryType10\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 2: Bios Information (SMBIOS Type 0)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_BIOS_VENDOR_RECORD_NUMBER, // 0,\r
-    0,                                  // smbios Type 0\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType0\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 3: System Information (SMBIOS Type 1)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER, // 1,\r
-    1,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType1\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 4: Base Board Manufacturer (SMBIOS Type 2)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER, // 2,\r
-    2,  // SMBIOS Type 2\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType2\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 5: System Enclosure or Chassis (SMBIOS Type 3)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER,  // 3,\r
-    3,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType3\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 6: Port Connector (SMBIOS Type 8)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER,  // 8,\r
-    8,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType8\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 7: System Slots (SMBIOS Type 9)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER, // 9,\r
-    9,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType9\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 8: Onboard Device (SMBIOS Type 10)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER,  // 10,\r
-    10,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType10\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc Subclass -- Record Type 9: OEM strings (SMBIOS Type 11)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_OEM_STRING_RECORD_NUMBER,  // 11,\r
-    11,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType11\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0A: System Options (SMBIOS Type 12)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER,  // 12,\r
-    12,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType12\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0B: Number of Installable Languages (SMBIOS Type 13)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER, // 13,\r
-    13,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType13\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0C: Installable Languages (SMBIOS Type 13)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER, // 13,\r
-    13,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType14\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 20: System Event Log (SMBIOS Type 15)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER, // 15,\r
-    15,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType15\r
-  },  \r
-  \r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0F: Pointing Device (SMBIOS Type 21)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER,  // 21,\r
-    21,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType21\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 10: Portable Battery (SMBIOS Type 22)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER, // 22,\r
-    22,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType22\r
-  },  \r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x11: Reset Capabilities (SMBIOS Type 23)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER,  // 23,\r
-    23,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType23\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x12: Hardware Security (SMBIOS Type 24)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER,  // 24,\r
-    24,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType24\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x13: System Power Controls (SMBIOS Type 25)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER,  // 25,\r
-    25,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType25\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x14: System Power Controls (SMBIOS Type 26)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER,  // 26,\r
-    26,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType26\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x15: Cooling Device (SMBIOS Type 27)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER,  // 27,\r
-    27,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType27\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x16: Temperature Probe (SMBIOS Type 28)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER,  // 28,\r
-    28,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType28\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x17: Electrical Current Probe (SMBIOS Type 29)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER,  // 29,\r
-    29,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType29\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x18: Temperature Probe (SMBIOS Type 30)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER,  // 30,\r
-    30,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType30\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x1A: Boot Information (SMBIOS Type 32)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER, // 32,\r
-    32,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType32\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x1B: Management Device (SMBIOS Type 34)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER, // 34,\r
-    34,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType34\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x21: Management Device Threshold (SMBIOS Type 36)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER, // 36,\r
-    36,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType36\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x1D: Boot Information (SMBIOS Type 38)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER, // 38,\r
-    38,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType38\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x1E: Power supply (SMBIOS Type 39)\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER, // 39,\r
-    39,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType39\r
-  },\r
-\r
-  {\r
-    //\r
-    // Misc SubClass -- Record Type 0x80-0xFF: OEM type\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER, // 0x80,\r
-    0x80,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscTypeOEM\r
-  },\r
-\r
-  {\r
-    //\r
-    // End-of-Table -- Record Type 127\r
-    //\r
-    EFI_MISC_SUBCLASS_GUID,\r
-    127,\r
-    127,\r
-    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-    BY_FUNCTION,\r
-    0,\r
-    SmbiosFldMiscType127\r
-  },\r
-  //\r
-  // Table Terminator\r
-  //\r
-  {\r
-    {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}},\r
-    0,\r
-    0,\r
-    (SMBIOS_STRUCTURE_LOCATING_METHOD) 0,\r
-    (SMBIOS_FIELD_FILLING_METHOD) 0,\r
-    0,\r
-    0\r
-  }\r
-};\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/DataHubSmBiosRecordsOnPiSmBiosThunk.inf b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/DataHubSmBiosRecordsOnPiSmBiosThunk.inf
deleted file mode 100644 (file)
index 782d64a..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#/** @file\r
-#  This thunk driver register a filter for DataHub protocol, once a data hub record\r
-#  is added via EFI_DATA_HUB_PROTOCOL->LogData(), this filter will be invoked to \r
-#  translate the datahub's record to SMBIOS record.\r
-#\r
-#  Copyright (c) 2009, Intel Corporation\r
-#\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
-#  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
-#\r
-#**/\r
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = Datahub2SmbiosThunk\r
-  FILE_GUID                      = 9F8B12CF-E796-408f-9D59-3ACDDC0AFBE3\r
-  MODULE_TYPE                    = DXE_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  EDK_RELEASE_VERSION            = 0x00020000\r
-  EFI_SPECIFICATION_VERSION      = 0x00020000\r
-\r
-  ENTRY_POINT                    = ThunkEntry\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources.common]\r
-  Thunk.c\r
-  Thunk.h\r
-  Translate.c\r
-  ConvLib.c\r
-  ConvTable.c\r
-  ProcessorConv.c\r
-  MemoryConv.c\r
-  MiscConv.c\r
-  \r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-  IntelFrameworkPkg/IntelFrameworkPkg.dec\r
-  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
-  \r
-  \r
-[LibraryClasses]\r
-  UefiBootServicesTableLib\r
-  MemoryAllocationLib\r
-  UefiDriverEntryPoint\r
-  BaseMemoryLib\r
-  HiiLib\r
-  DebugLib\r
-  BaseLib\r
-  PcdLib\r
-\r
-[Protocols]\r
-  gEfiDataHubProtocolGuid     ## CONSUMES\r
-  gEfiSmbiosProtocolGuid      ## CONSUMES\r
-\r
-[Guids]  \r
-  gEfiMemorySubClassGuid      ## CONSUMES\r
-  gEfiMiscSubClassGuid        ## CONSUMES\r
-  gEfiCacheSubClassGuid       ## CONSUMES\r
-  \r
-[FeaturePcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport\r
-    \r
-[Depex]\r
-  gEfiDataHubProtocolGuid AND gEfiSmbiosProtocolGuid
\ No newline at end of file
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MemoryConv.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MemoryConv.c
deleted file mode 100644 (file)
index 9200738..0000000
+++ /dev/null
@@ -1,1089 +0,0 @@
-/** @file\r
-  Routines that support Memory SubClass data records translation.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 2 -- Physical Memory\r
-  Array.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType2 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                            Status;\r
-  EFI_MEMORY_ARRAY_LOCATION_DATA        *PhyMemArray;\r
-  FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA  *FrameworkPhyMemArray;\r
-  UINT32                                MemoryCapacity;\r
-  UINT16                                NumberMemoryDevices;\r
-  UINT16                                Test16;\r
-\r
-  Status      = EFI_SUCCESS;\r
-  PhyMemArray = (EFI_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
-  FrameworkPhyMemArray = (FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
-\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Location))  = (UINT8) (PhyMemArray->MemoryArrayLocation);\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Use))  = (UINT8) (PhyMemArray->MemoryArrayUse);\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorCorrection))  = (UINT8) (PhyMemArray->MemoryErrorCorrection);\r
-\r
-  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
-    MemoryCapacity = (UINT32) (((UINTN) PhyMemArray->MaximumMemoryCapacity.Value) << PhyMemArray->MaximumMemoryCapacity.Exponent);\r
-    NumberMemoryDevices = PhyMemArray->NumberMemoryDevices;\r
-  } else {\r
-    //\r
-    // Support EDk/Framework defined Data strucutre.\r
-    //\r
-    MemoryCapacity      = FrameworkPhyMemArray->MaximumMemoryCapacity;\r
-    NumberMemoryDevices = FrameworkPhyMemArray->NumberMemoryDevices;\r
-  }\r
-\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE16, MaximumCapacity),\r
-    &MemoryCapacity,\r
-    4\r
-    );\r
-\r
-  Test16 = 0xfffe;\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorInformationHandle),\r
-    &Test16,\r
-    2\r
-    );\r
-  \r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, NumberOfMemoryDevices),\r
-    &NumberMemoryDevices,\r
-    2\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 3 -\r
-  - Memory Device: SMBIOS Type 17\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType3 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_ARRAY_LINK_DATA       *MemDevice;\r
-  FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
-  UINT64                           MemoryDeviceSize;\r
-  BOOLEAN                          MemoryDeviceSizeUnitMega;\r
-  UINT16                           MemoryDeviceSpeed;\r
-  UINT16                           MemoryDeviceExponent;\r
-  UINT16                           Test16;\r
-\r
-  MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
-  FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
-  MemoryDeviceSpeed  = 0;\r
-  MemoryDeviceExponent = 0;\r
-\r
-  //\r
-  // Memory Device Locator\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceLocator),\r
-    &(MemDevice->MemoryDeviceLocator),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Bank Locator\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, BankLocator),\r
-    &(MemDevice->MemoryBankLocator),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Manufacturer\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, Manufacturer),\r
-    &(MemDevice->MemoryManufacturer),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Serial Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, SerialNumber),\r
-    &(MemDevice->MemorySerialNumber),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Asset Tag\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, AssetTag),\r
-    &(MemDevice->MemoryAssetTag),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Part Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE17, PartNumber),\r
-    &(MemDevice->MemoryPartNumber),\r
-    sizeof (STRING_REF)\r
-    );\r
-\r
-  //\r
-  // Memory Array Link\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryArrayHandle),\r
-    16, // SMBIOS type 16\r
-    &MemDevice->MemoryArrayLink,\r
-    &gEfiMemorySubClassGuid\r
-    );\r
-\r
-  //\r
-  // Set Memory Error Information Handle to Not supported\r
-  //\r
-  Test16 = 0xfffe;\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryErrorInformationHandle),\r
-    &Test16,\r
-    sizeof (EFI_SMBIOS_HANDLE)\r
-    ); \r
-     \r
-  //\r
-  // Total width\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TotalWidth),\r
-    &MemDevice->MemoryTotalWidth,\r
-    2\r
-    );\r
-\r
-  //\r
-  // Data Width\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DataWidth),\r
-    &MemDevice->MemoryDataWidth,\r
-    2\r
-    );\r
-\r
-  //\r
-  // Device Size\r
-  //\r
-  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
-    //\r
-    // Form Factor\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
-      &MemDevice->MemoryFormFactor,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Device Set\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
-      &MemDevice->MemoryDeviceSet,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Type\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
-      &MemDevice->MemoryType,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Type Detail\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
-      &MemDevice->MemoryTypeDetail,\r
-      2\r
-      );\r
-  \r
-    //\r
-    // Speed\r
-    //\r
-    MemoryDeviceSpeed    = MemDevice->MemorySpeed.Value;\r
-    MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
-    while (MemoryDeviceExponent-- > 0) {\r
-      MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
-    }\r
-\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
-      &MemoryDeviceSpeed,\r
-      2\r
-      );\r
-\r
-    MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
-  } else {\r
-    //\r
-    // Form Factor\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
-      &FrameworkMemDevice->MemoryFormFactor,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Device Set\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
-      &FrameworkMemDevice->MemoryDeviceSet,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Type\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
-      &FrameworkMemDevice->MemoryType,\r
-      1\r
-      );\r
-  \r
-    //\r
-    // Type Detail\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
-      &FrameworkMemDevice->MemoryTypeDetail,\r
-      2\r
-      );\r
-  \r
-    //\r
-    // Speed\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
-      &FrameworkMemDevice->MemorySpeed,\r
-      2\r
-      );\r
-\r
-    MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
-  }\r
-\r
-  MemoryDeviceSizeUnitMega  = FALSE;\r
-  MemoryDeviceSize          = RShiftU64 (MemoryDeviceSize, 10);\r
-  //\r
-  // kilo as unit\r
-  //\r
-  if (MemoryDeviceSize > 0xffff) {\r
-    MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
-    //\r
-    // Mega as unit\r
-    //\r
-    MemoryDeviceSizeUnitMega = TRUE;\r
-  }\r
-\r
-  MemoryDeviceSize = MemoryDeviceSize & 0x7fff;\r
-  if (MemoryDeviceSize != 0 && !MemoryDeviceSizeUnitMega) {\r
-    MemoryDeviceSize |= 0x8000;\r
-  }\r
-\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Size),\r
-    &MemoryDeviceSize,\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 3 -\r
-  - Memory Device: SMBIOS Type 6\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldSMBIOSType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_ARRAY_LINK_DATA       *MemDevice;\r
-  UINT64                           MemoryDeviceSize;\r
-  UINT8                            MemSize;\r
-  UINT16                           MemType;\r
-  UINT8                            MemSpeed;\r
-  FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
-  UINT16                           MemoryDeviceSpeed;\r
-  UINT16                           MemoryDeviceExponent;\r
-\r
-  MemDevice            = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
-  FrameworkMemDevice   = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
-  MemoryDeviceExponent = 0;\r
-\r
-  //\r
-  // Memory Device Locator\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE6, SocketDesignation),\r
-    &(MemDevice->MemoryDeviceLocator),\r
-    2\r
-    );\r
-  \r
-  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
-    MemoryDeviceSpeed    = MemDevice->MemorySpeed.Value;\r
-    MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
-    while (MemoryDeviceExponent-- > 0) {\r
-      MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
-    }\r
-    MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
-  } else {\r
-    //\r
-    // Support EDk/Framework defined Data strucutre.\r
-    //\r
-    MemoryDeviceSpeed = FrameworkMemDevice->MemorySpeed;\r
-    MemoryDeviceSize  = FrameworkMemDevice->MemoryDeviceSize;\r
-  }\r
-  \r
-  if (MemoryDeviceSpeed == 0) {\r
-    MemSpeed = 0;\r
-  } else {\r
-    //\r
-    // Memory speed is in ns unit\r
-    //\r
-    MemSpeed = (UINT8)(1000 / MemoryDeviceSpeed);\r
-  }\r
-\r
-  CopyMem (\r
-   (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentSpeed),\r
-   &MemSpeed,\r
-   1\r
-  );\r
-\r
-\r
-  //\r
-  // Device Size\r
-  //\r
-  MemSize = 0;\r
-  if (MemoryDeviceSize == 0) {\r
-    MemSize = 0x7F;\r
-  } else {\r
-    MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 21);\r
-    while (MemoryDeviceSize != 0) {\r
-      MemSize++;\r
-      MemoryDeviceSize = RShiftU64(MemoryDeviceSize,1);\r
-    }\r
-  }\r
-\r
-  CopyMem (\r
-    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, InstalledSize),\r
-    &MemSize,\r
-    1\r
-    );\r
-\r
-  CopyMem (\r
-    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, EnabledSize),\r
-    &MemSize,\r
-    1\r
-    );\r
-\r
-  //\r
-  // According SMBIOS SPEC Type 6 definition\r
-  //\r
-  MemType = 0;\r
-  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
-    if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
-        MemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
-      MemType |= 1<<8;\r
-    }\r
-    \r
-    if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
-      MemType |= 1<<7;\r
-    }\r
-    \r
-    if (MemDevice->MemoryType == EfiMemoryTypeSdram) {\r
-      MemType |= 1<<10;\r
-    }\r
-    \r
-    if (MemDevice->MemoryTypeDetail.Edo == 1) {\r
-      MemType |= 1<<4;\r
-    }\r
-    \r
-    if (MemDevice->MemoryTypeDetail.FastPaged == 1) {\r
-      MemType |= 1<<3;\r
-    }\r
-  } else {\r
-    //\r
-    // Support EDk/Framework defined Data strucutre.\r
-    //\r
-    if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
-        FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
-      MemType |= 1<<8;\r
-    }\r
-    \r
-    if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
-      MemType |= 1<<7;\r
-    }\r
-    \r
-    if (FrameworkMemDevice->MemoryType == EfiMemoryTypeSdram) {\r
-      MemType |= 1<<10;\r
-    }\r
-    \r
-    if (FrameworkMemDevice->MemoryTypeDetail.Edo == 1) {\r
-      MemType |= 1<<4;\r
-    }\r
-    \r
-    if (FrameworkMemDevice->MemoryTypeDetail.FastPaged == 1) {\r
-      MemType |= 1<<3;\r
-    }\r
-  }\r
-  //\r
-  // Form Factor\r
-  //\r
-  CopyMem (\r
-    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentMemoryType),\r
-    &MemType,\r
-    2\r
-    );\r
-\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 4\r
-  -- Memory Array Mapped Address: SMBIOS Type 19\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType4 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_ARRAY_START_ADDRESS_DATA  *Masa;\r
-  EFI_PHYSICAL_ADDRESS                 TempData;\r
-\r
-  Masa = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) RecordData;\r
-\r
-  //\r
-  // Starting Address\r
-  //\r
-  TempData = RShiftU64 (Masa->MemoryArrayStartAddress, 10);\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, StartingAddress),\r
-    &TempData,\r
-    4\r
-    );\r
-\r
-  //\r
-  // Ending Address\r
-  //\r
-  TempData = RShiftU64 (Masa->MemoryArrayEndAddress, 10);\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, EndingAddress),\r
-    &TempData,\r
-    4\r
-    );\r
-\r
-  //\r
-  // Partition Width\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, PartitionWidth),\r
-    &Masa->MemoryArrayPartitionWidth,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Physical Memory Array Link\r
-  //\r
-  return SmbiosFldInterLink (\r
-          StructureNode,\r
-          (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE19, MemoryArrayHandle),\r
-          16, // SMBIOS type 16\r
-          &Masa->PhysicalMemoryArrayLink,\r
-          &gEfiMemorySubClassGuid\r
-          );\r
-\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 5\r
-  -- Memory Device Mapped Address: SMBIOS Type 20\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType5 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_DEVICE_START_ADDRESS_DATA *Mdsa;\r
-  EFI_PHYSICAL_ADDRESS                 TempData;\r
-\r
-  Mdsa = (EFI_MEMORY_DEVICE_START_ADDRESS_DATA *) RecordData;\r
-\r
-  //\r
-  // Starting Address\r
-  //\r
-  TempData = RShiftU64 (Mdsa->MemoryDeviceStartAddress, 10);\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, StartingAddress),\r
-    &TempData,\r
-    4\r
-    );\r
-\r
-  //\r
-  // Ending Address\r
-  //\r
-  TempData = RShiftU64 (Mdsa->MemoryDeviceEndAddress, 10);\r
-  CopyMem (\r
-    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, EndingAddress),\r
-    &TempData,\r
-    4\r
-    );\r
-\r
-  //\r
-  // Memory Device Link\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryDeviceHandle),\r
-    17, // SMBIOS type 17\r
-    &Mdsa->PhysicalMemoryDeviceLink,\r
-    &gEfiMemorySubClassGuid\r
-    );\r
-\r
-  //\r
-  // Memory Array Mapped Address Link\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryArrayMappedAddressHandle),\r
-    19, // SMBIOS type 19\r
-    &Mdsa->PhysicalMemoryArrayLink,\r
-    &gEfiMemorySubClassGuid\r
-    );\r
-\r
-  //\r
-  // Memory Device Partition Row Position\r
-  //\r
-  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, PartitionRowPosition)) = (UINT8) Mdsa->MemoryDevicePartitionRowPosition;\r
-\r
-  //\r
-  // Memory Device Interleave Position\r
-  //\r
-  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavePosition)) = (UINT8) Mdsa->MemoryDeviceInterleavePosition;\r
-\r
-  //\r
-  // Memory Device Interleave Data Depth\r
-  //\r
-  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavedDataDepth)) = (UINT8) Mdsa->MemoryDeviceInterleaveDataDepth;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 6\r
-  -- Memory Channel Type: SMBIOS Type 37\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_CHANNEL_TYPE_DATA  *McTa;\r
-  EFI_STATUS                    Status;\r
-\r
-  McTa  = (EFI_MEMORY_CHANNEL_TYPE_DATA *) RecordData;\r
-\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, ChannelType))  = (UINT8) (McTa->MemoryChannelType);\r
-\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MaximumChannelLoad))  = (UINT8) (McTa->MemoryChannelMaximumLoad);\r
-\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDeviceCount))  = (UINT8) (McTa->MemoryChannelDeviceCount);\r
-\r
-  //\r
-  // Update the length field\r
-  // Multiple device loads are filled through SmbiosFldMemoryType7\r
-  //\r
-  StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
-                                       sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount);\r
-  Status = SmbiosEnlargeStructureBuffer(\r
-             StructureNode, \r
-             StructureNode->Structure->Length,\r
-             StructureNode->StructureSize,\r
-             StructureNode->StructureSize + sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount\r
-             );\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 7\r
-  -- Memory Channel Device: SMBIOS Type 37\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType7 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_CHANNEL_DEVICE_DATA  *Mcdd;\r
-  UINTN                           DeviceLoadOffset;\r
-  UINTN                           DeviceLoadHandleOffset;\r
-\r
-  Mcdd = (EFI_MEMORY_CHANNEL_DEVICE_DATA *) RecordData;\r
-\r
-  if (Mcdd->DeviceId < 1) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  DeviceLoadOffset        = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[0]) + 3 * (Mcdd->DeviceId - 1);\r
-  DeviceLoadHandleOffset  = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[1]) + 3 * (Mcdd->DeviceId - 1);\r
-\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + DeviceLoadOffset) = (UINT8) (Mcdd->MemoryChannelDeviceLoad);\r
-\r
-  //\r
-  // Memory Device Handle Link\r
-  //\r
-  return SmbiosFldInterLink (\r
-          StructureNode,\r
-          (UINT16) DeviceLoadHandleOffset,\r
-          17, // Smbios type 17 -- Physical Memory Device\r
-          &Mcdd->DeviceLink,\r
-          &gEfiMemorySubClassGuid\r
-          );\r
-\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type 8\r
-  -- Memory Controller information: SMBIOS Type 5\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType8 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_CONTROLLER_INFORMATION_DATA *MemoryController;\r
-  UINT32                                 NewMinimalSize;\r
-  UINT16                                 Count;\r
-  EFI_INTER_LINK_DATA                    *Link; \r
-  EFI_STATUS                             Status;\r
-  \r
-  NewMinimalSize   = 0;\r
-\r
-  //\r
-  // There is an update from EFI_MEMORY_CONTROLLER_INFORMATION to\r
-  // EFI_MEMORY_CONTROLLER_INFORMATION_DATA. Multiple MemoryModuleConfig\r
-  // handles are filled.\r
-  //\r
-  MemoryController = (EFI_MEMORY_CONTROLLER_INFORMATION_DATA *)RecordData;\r
-  \r
-  //\r
-  // ErrorDetectingMethod\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrDetectMethod),\r
-    &MemoryController->ErrorDetectingMethod,\r
-    1\r
-    );  \r
-\r
-  //\r
-  // ErrorCorrectingCapability\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrCorrectCapability),\r
-    &MemoryController->ErrorCorrectingCapability,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // MemorySupportedInterleave\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportInterleave),\r
-    &MemoryController->MemorySupportedInterleave,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // MemoryCurrentInterleave\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, CurrentInterleave),\r
-    &MemoryController->MemoryCurrentInterleave,\r
-    1\r
-    );  \r
-    \r
-  //\r
-  // MaxMemoryModuleSize\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MaxMemoryModuleSize),\r
-    &MemoryController->MaxMemoryModuleSize,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // MemorySpeedType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportSpeed),\r
-    &MemoryController->MemorySpeedType,\r
-    2\r
-    );                             \r
-\r
-  //\r
-  // MemorySupportedType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportMemoryType),\r
-    &MemoryController->MemorySupportedType,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // MemoryModuleVoltage\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleVoltage),\r
-    &MemoryController->MemoryModuleVoltage,\r
-    1\r
-    ); \r
-\r
-  //\r
-  // NumberofMemorySlot\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, AssociatedMemorySlotNum),\r
-    &MemoryController->NumberofMemorySlot,\r
-    1\r
-    ); \r
-  \r
-  if (MemoryController->NumberofMemorySlot == 0) {\r
-    //\r
-    // EnabledCorrectingCapability\r
-    //\r
-    CopyMem (\r
-      (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles),\r
-      &MemoryController->EnabledCorrectingCapability,\r
-      1\r
-      );     \r
-  } else {\r
-    //\r
-    // Memory module configuration handles exist\r
-    // we should enlarge smbios entry buffer from minimal size\r
-    //\r
-    NewMinimalSize = (MemoryController->NumberofMemorySlot) * sizeof(UINT16) + StructureNode->StructureSize;\r
-    StructureNode->Structure->Length = (UINT8) (NewMinimalSize - 2);\r
-    Status = SmbiosEnlargeStructureBuffer (StructureNode, StructureNode->Structure->Length, StructureNode->StructureSize, NewMinimalSize);\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    //\r
-    // MemoryModuleConfigHandles\r
-    //\r
-    for (Count = 0, Link = MemoryController->MemoryModuleConfig; \r
-         Count < MemoryController->NumberofMemorySlot; \r
-         Count++, Link++) {\r
-      SmbiosFldInterLink (\r
-        StructureNode,\r
-        (UINT16) (OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + Count * sizeof(UINT16)),\r
-        6, // SMBIOS type 6\r
-        Link,\r
-        &gEfiMemorySubClassGuid\r
-        );\r
-    }\r
-         \r
-    //\r
-    // EnabledCorrectingCapability\r
-    //  \r
-    CopyMem (\r
-      (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + (MemoryController->NumberofMemorySlot) * sizeof(UINT16),\r
-      &MemoryController->EnabledCorrectingCapability,\r
-      1\r
-      );\r
-  }\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type \r
-  -- Memory 32 Bit Error Information: SMBIOS Type 18\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_32BIT_ERROR_INFORMATION *MemoryInfo;\r
-  \r
-  MemoryInfo = (EFI_MEMORY_32BIT_ERROR_INFORMATION *)RecordData;\r
-  \r
-  //\r
-  // MemoryErrorType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorType),\r
-    &MemoryInfo->MemoryErrorType,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // MemoryErrorGranularity\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorGranularity),\r
-    &MemoryInfo->MemoryErrorGranularity,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // MemoryErrorOperation\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorOperation),\r
-    &MemoryInfo->MemoryErrorOperation,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // VendorSyndrome\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, VendorSyndrome),\r
-    &MemoryInfo->VendorSyndrome,\r
-    4\r
-    );    \r
-\r
-  //\r
-  // MemoryArrayErrorAddress\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, MemoryArrayErrorAddress),\r
-    &MemoryInfo->MemoryArrayErrorAddress,\r
-    4\r
-    ); \r
-\r
-  //\r
-  // DeviceErrorAddress\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, DeviceErrorAddress),\r
-    &MemoryInfo->DeviceErrorAddress,\r
-    4\r
-    ); \r
-\r
-  //\r
-  // DeviceErrorResolution\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorResolution),\r
-    &MemoryInfo->DeviceErrorResolution,\r
-    4\r
-    ); \r
-    \r
-  return EFI_SUCCESS;    \r
-}\r
-\r
-/**\r
-  Field Filling Function for Memory SubClass record type \r
-  -- Memory 64 Bit Error Information: SMBIOS Type 33\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MEMORY_64BIT_ERROR_INFORMATION *MemoryInfo;\r
-  \r
-  MemoryInfo = (EFI_MEMORY_64BIT_ERROR_INFORMATION *)RecordData;\r
-  \r
-  //\r
-  // MemoryErrorType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorType),\r
-    &MemoryInfo->MemoryErrorType,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // MemoryErrorGranularity\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorGranularity),\r
-    &MemoryInfo->MemoryErrorGranularity,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // MemoryErrorOperation\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorOperation),\r
-    &MemoryInfo->MemoryErrorOperation,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // VendorSyndrome\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, VendorSyndrome),\r
-    &MemoryInfo->VendorSyndrome,\r
-    4\r
-    );    \r
-\r
-  //\r
-  // MemoryArrayErrorAddress\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, MemoryArrayErrorAddress),\r
-    &MemoryInfo->MemoryArrayErrorAddress,\r
-    8\r
-    ); \r
-\r
-  //\r
-  // DeviceErrorAddress\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, DeviceErrorAddress),\r
-    &MemoryInfo->DeviceErrorAddress,\r
-    8\r
-    ); \r
-\r
-  //\r
-  // DeviceErrorResolution\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorResolution),\r
-    &MemoryInfo->DeviceErrorResolution,\r
-    4\r
-    ); \r
-    \r
-  return EFI_SUCCESS;    \r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MiscConv.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MiscConv.c
deleted file mode 100644 (file)
index 3ffbbe5..0000000
+++ /dev/null
@@ -1,2444 +0,0 @@
-/** @file\r
-  Routines that support Misc SubClass data records translation.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 0 -- Bios Information.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType0 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                 Status;\r
-  EFI_MISC_BIOS_VENDOR_DATA  *BiosInfo;\r
-\r
-  Status    = EFI_SUCCESS;\r
-  BiosInfo  = NULL;\r
-\r
-  BiosInfo  = (EFI_MISC_BIOS_VENDOR_DATA *) RecordData;\r
-\r
-  //\r
-  // Bios Vendor\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE0, Vendor),\r
-    &(BiosInfo->BiosVendor),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Bios Version\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosVersion),\r
-    &(BiosInfo->BiosVersion),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Bios Release Date\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosReleaseDate),\r
-    &(BiosInfo->BiosReleaseDate),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Bios Starting Address Segment\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSegment),\r
-    &BiosInfo->BiosStartingAddress,\r
-    2\r
-    );\r
-\r
-  //\r
-  // Bios Physical device size\r
-  //\r
-  SmbiosFldBase2ToByteWith64K (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize),\r
-    &BiosInfo->BiosPhysicalDeviceSize,\r
-    sizeof (EFI_EXP_BASE2_DATA)\r
-    );\r
-  (*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize)))--;\r
-\r
-  //\r
-  // Bios Characteristics\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics),\r
-    &BiosInfo->BiosCharacteristics1,\r
-    4\r
-    );\r
-  \r
-  //\r
-  // Bios Characteristics higher four bytes\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics) + 4,\r
-    &BiosInfo->BiosCharacteristics2,\r
-    4\r
-    ); \r
-\r
-  //\r
-  // Bios Characteristics Extension1/2\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BIOSCharacteristicsExtensionBytes),\r
-    (UINT8 *) &BiosInfo->BiosCharacteristics1 + 4,\r
-    2\r
-    );\r
-\r
-  //\r
-  // System BIOS Major Release\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMajorRelease),\r
-    (UINT8 *) &BiosInfo->BiosMajorRelease,\r
-    1\r
-    );\r
-\r
-  //\r
-  // System BIOS Minor Release\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMinorRelease),\r
-    (UINT8 *) &BiosInfo->BiosMinorRelease,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Embedded Controller Firmware Major Release\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMajorRelease),\r
-    (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMajorRelease,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Embedded Controller Firmware Minor Release\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMinorRelease),\r
-    (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMinorRelease,\r
-    1\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 1 -- System Information.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType1 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                         Status;\r
-  EFI_MISC_SYSTEM_MANUFACTURER_DATA  *SystemInfo;\r
-\r
-  Status      = EFI_SUCCESS;\r
-  SystemInfo  = NULL;\r
-\r
-  SystemInfo  = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) RecordData;\r
-\r
-  //\r
-  // System Manufacturer\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, Manufacturer),\r
-    &(SystemInfo->SystemManufacturer),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // System Product Name\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, ProductName),\r
-    &(SystemInfo->SystemProductName),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // System Version\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, Version),\r
-    &(SystemInfo->SystemVersion),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // System Serial Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, SerialNumber),\r
-    &(SystemInfo->SystemSerialNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Uuid\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, Uuid),\r
-    &SystemInfo->SystemUuid,\r
-    16\r
-    );\r
-\r
-  //\r
-  // Wakeup Type\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, WakeUpType),\r
-    &SystemInfo->SystemWakeupType,\r
-    1\r
-    );\r
-\r
-  //\r
-  // System SKU Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, SKUNumber),\r
-    &(SystemInfo->SystemSKUNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // System Family\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE1, Family),\r
-    &(SystemInfo->SystemFamily),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for record type 2 -- Base Board Manufacture.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType2 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                             Status;\r
-  EFI_MISC_BASE_BOARD_MANUFACTURER_DATA  *Bbm;\r
-  Status  = EFI_SUCCESS;\r
-  Bbm     = (EFI_MISC_BASE_BOARD_MANUFACTURER_DATA *) RecordData;\r
-\r
-  //\r
-  // Manufacturer\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, Manufacturer),\r
-    &(Bbm->BaseBoardManufacturer),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Product\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, ProductName),\r
-    &(Bbm->BaseBoardProductName),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Version\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, Version),\r
-    &(Bbm->BaseBoardVersion),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Serial Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, SerialNumber),\r
-    &(Bbm->BaseBoardSerialNumber),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Asset Tag\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, AssetTag),\r
-    &(Bbm->BaseBoardAssetTag),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Location in Chassis\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE2, LocationInChassis),\r
-    &(Bbm->BaseBoardChassisLocation),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Feature Flags\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, FeatureFlag),\r
-    &Bbm->BaseBoardFeatureFlags,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Board Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, BoardType)) = (UINT8) Bbm->BaseBoardType;\r
-\r
-  //\r
-  // Chassis Handle\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE2, ChassisHandle),\r
-    3,  // SMBIOS type 3 - System Enclosure or Chassis\r
-    &Bbm->BaseBoardChassisLink,\r
-    &gEfiMiscSubClassGuid\r
-    );\r
-\r
-  //\r
-  // Number of Contained Object Handles\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, NumberOfContainedObjectHandles)) = (UINT8) Bbm->BaseBoardNumberLinks;\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 3 -\r
-  - System Enclosure or Chassis.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType3 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                         Status;\r
-  EFI_MISC_CHASSIS_MANUFACTURER_DATA *Ec;\r
-  EFI_MISC_ELEMENTS                  *Element;\r
-  UINT16                             Index;\r
-  UINT8                              ContainedElementType;\r
-  Status  = EFI_SUCCESS;\r
-  Ec      = (EFI_MISC_CHASSIS_MANUFACTURER_DATA *) RecordData;\r
-\r
-  //\r
-  // Chassis Type\r
-  //\r
-  *(UINT8*)((UINT8 *) (StructureNode->Structure) + \r
-            OFFSET_OF (SMBIOS_TABLE_TYPE3, Type)) \r
-            = (UINT8) (Ec->ChassisType.ChassisType | Ec->ChassisType.ChassisLockPresent << 7);\r
-\r
-\r
-  //\r
-  // Chassis Bootup State\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, BootupState),\r
-    &Ec->ChassisBootupState,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Chassis Power Supply State\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, PowerSupplyState),\r
-    &Ec->ChassisPowerSupplyState,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Chassis Thermal State\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, ThermalState),\r
-    &Ec->ChassisThermalState,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Chassis Security State\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, SecurityStatus),\r
-    &Ec->ChassisSecurityState,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Chassis Oem Defined\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, OemDefined),\r
-    &Ec->ChassisOemDefined,\r
-    4\r
-    );\r
-\r
-  //\r
-  // Chassis Height\r
-  //\r
-  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-            OFFSET_OF (SMBIOS_TABLE_TYPE3, Height)) \r
-            = (UINT8)Ec->ChassisHeight;\r
-\r
-  //\r
-  // Chassis Number Power Cords\r
-  //\r
-  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-            OFFSET_OF (SMBIOS_TABLE_TYPE3, NumberofPowerCords)) \r
-            = (UINT8)Ec->ChassisNumberPowerCords;\r
-  \r
-  //\r
-  // Chassis Element Count\r
-  //\r
-  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-            OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementCount)) \r
-            = (UINT8)Ec->ChassisElementCount;\r
-\r
-  if( Ec->ChassisElementCount ) {\r
-    //\r
-    // Element Record Length\r
-    // Current solution covers first 3 bytes; user can extend to meet its requirements.\r
-    //\r
-    *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-              OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementRecordLength)) \r
-              = (UINT8)sizeof(CONTAINED_ELEMENT);\r
-\r
-    //\r
-    // Update the structure's length and StructureSize\r
-    //\r
-    StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
-                                               Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT));\r
-    Status = SmbiosEnlargeStructureBuffer (\r
-               StructureNode,\r
-               StructureNode->Structure->Length,\r
-               StructureNode->StructureSize,\r
-               StructureNode->StructureSize + Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT)\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    \r
-    //\r
-    // Contained Elements\r
-    //\r
-    for (Index=0, Element = &Ec->ChassisElements; \r
-         Index < Ec->ChassisElementCount; \r
-         Index += 1, Element ++) {\r
-\r
-      //\r
-      // ContainedElementType\r
-      //\r
-      ContainedElementType = (UINT8)((Element->ChassisElementType.RecordType == 1)\r
-                                      ? (UINT8)(Element->ChassisElementType.RecordType << 7 | Element->ChassisElementType.Type)\r
-                                      : (UINT8)(Element->ChassisBaseBoard));\r
-      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
-                Index * sizeof(CONTAINED_ELEMENT) + \r
-                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementType)) \r
-                = ContainedElementType;\r
-\r
-      //\r
-      // ContainedElementMinimum\r
-      //\r
-      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
-                Index * sizeof(CONTAINED_ELEMENT) + \r
-                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMinimum))\r
-                = (UINT8)Element->ChassisElementMinimum;\r
-\r
-      //\r
-      // ContainedElementMaximum\r
-      //\r
-      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
-                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
-                Index * sizeof(CONTAINED_ELEMENT) + \r
-                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMaximum)) \r
-                = (UINT8)Element->ChassisElementMaximum;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Move the filling of following four String fields after Contained Elements \r
-  // because they would break SMBIOS table.\r
-  // Chassis Manufacturer\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE3, Manufacturer),\r
-    &(Ec->ChassisManufacturer),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Chassis Version\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE3, Version),\r
-    &(Ec->ChassisVersion),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Chassis Serial Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE3, SerialNumber),\r
-    &(Ec->ChassisSerialNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Chassis Asset Tag\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE3, AssetTag),\r
-    &(Ec->ChassisAssetTag),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-  \r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 8 -- Port Connector.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType8 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                                       Status;\r
-  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *Picd;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Picd    = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData;\r
-\r
-  //\r
-  // Internal Connector Designator\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalReferenceDesignator),\r
-    &(Picd->PortInternalConnectorDesignator),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Internal Connector Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalConnectorType)) = (UINT8) Picd->PortInternalConnectorType;\r
-\r
-  //\r
-  // External Connector Designator\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalReferenceDesignator),\r
-    &(Picd->PortExternalConnectorDesignator),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Internal Connector Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalConnectorType)) = (UINT8) Picd->PortExternalConnectorType;\r
-\r
-  //\r
-  // Internal Connector Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, PortType)) = (UINT8) Picd->PortType;\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 9 -- System slot.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                             Status;\r
-  EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA  *Slot;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Slot    = (EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA *) RecordData;\r
-\r
-  //\r
-  // Slot Designation\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDesignation),\r
-    &(Slot->SlotDesignation),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Slot Type\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotType),\r
-    &Slot->SlotType,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Slot Data Bus Width\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDataBusWidth),\r
-    &Slot->SlotDataBusWidth,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Slot Usage\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, CurrentUsage),\r
-    &Slot->SlotUsage,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Slot Length\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotLength),\r
-    &Slot->SlotLength,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Slot Id\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotID),\r
-    &Slot->SlotId,\r
-    2\r
-    );\r
-\r
-  //\r
-  // Slot Characteristics\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotCharacteristics1),\r
-    &Slot->SlotCharacteristics,\r
-    2\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 10 - Onboard Device.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  EFI_MISC_ONBOARD_DEVICE_DATA *OnboardDevice;\r
-  UINTN                        NumberOfDevices;\r
-  UINTN                        Index;\r
-  UINT8                        StatusAndType;\r
-\r
-  Status          = EFI_SUCCESS;\r
-  OnboardDevice   = (EFI_MISC_ONBOARD_DEVICE_DATA *) RecordData;\r
-\r
-  NumberOfDevices = (StructureNode->Structure->Length - 4) / 2;\r
-  for (Index = 0; Index < NumberOfDevices; Index += 1) {\r
-    //\r
-    // OnBoard Device Description\r
-    //\r
-    SmbiosFldString (\r
-      StructureNode,\r
-      (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + 1 + (2 * Index)),\r
-      &(OnboardDevice->OnBoardDeviceDescription),\r
-      2 // 64 * sizeof(CHAR16)\r
-      );\r
-\r
-    //\r
-    // Status & Type: Bit 7    Devicen Status, Bits 6:0 Type of Device\r
-    //\r
-    StatusAndType = (UINT8) OnboardDevice->OnBoardDeviceStatus.DeviceType;\r
-    if (OnboardDevice->OnBoardDeviceStatus.DeviceEnabled != 0) {\r
-      StatusAndType |= 0x80;\r
-    } else {\r
-      StatusAndType &= 0x7F;\r
-    }\r
-\r
-    * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + (2 * Index))) = StatusAndType;\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 11 - OEM Strings.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType11 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_OEM_STRING_DATA *OemString;\r
-\r
-  OemString = (EFI_MISC_OEM_STRING_DATA *)RecordData;\r
-  //\r
-  // OEM String data\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE11, StringCount),\r
-    &(OemString->OemStringRef[0]),\r
-    2\r
-    );\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 12 - System Options.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType12 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                         Status;\r
-  EFI_MISC_SYSTEM_OPTION_STRING_DATA *Sos;\r
-  UINTN                              NumberOfInstallableLanguages;\r
-  UINTN                              Index;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Sos     = (EFI_MISC_SYSTEM_OPTION_STRING_DATA *) RecordData;\r
-\r
-  //\r
-  // As MiscDataHub spec defines,\r
-  // NumberOfInstallableLanguages should retrieve from Type 13.\r
-  //\r
-  NumberOfInstallableLanguages = (StructureNode->Structure->Length - 4);\r
-  for (Index = 0; Index < NumberOfInstallableLanguages; Index += 1) {\r
-    //\r
-    // OnBoard Device Description\r
-    //\r
-    SmbiosFldString (\r
-      StructureNode,\r
-      (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE12, StringCount) + (Index)),\r
-      &(Sos->SystemOptionStringRef[Index]),\r
-      2\r
-      );\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 13 - BIOS Language.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType13 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA  *InstallableLanguage;\r
-\r
-  InstallableLanguage = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA *) RecordData;\r
-\r
-  //\r
-  // Number Of Installable Languages\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, InstallableLanguages)) = (UINT8) (InstallableLanguage->NumberOfInstallableLanguages);\r
-\r
-  //\r
-  // Language Flags\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, Flags),\r
-    &InstallableLanguage->LanguageFlags,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Current Language Number\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
-    &(InstallableLanguage->CurrentLanguageNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 14 - System Language String\r
-  Current solution assumes that EFI_MISC_SYSTEM_LANGUAGE_STRINGs are logged with\r
-  their LanguageId having ascending orders.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType14 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  UINT16                           CurrentLanguageNumber;\r
-  EFI_MISC_SYSTEM_LANGUAGE_STRING  *LanguageString;\r
-  \r
-  LanguageString = (EFI_MISC_SYSTEM_LANGUAGE_STRING *) RecordData;\r
-\r
-  //\r
-  // Backup CurrentLanguage\r
-  //\r
-  CopyMem (\r
-    &CurrentLanguageNumber,\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Clear the field so that SmbiosFldString can be reused\r
-  //\r
-  *(UINT8 *)((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages)) = 0;\r
-  \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
-    &(LanguageString->SystemLanguageString),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // Restore CurrentLanguage\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
-    &CurrentLanguageNumber,\r
-    1\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 15 -- System Event Log.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType15 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  EFI_MISC_SYSTEM_EVENT_LOG_DATA  *SystemEventLog;\r
-\r
-  Status          = EFI_SUCCESS;\r
-  SystemEventLog  = NULL;\r
-\r
-  SystemEventLog  = (EFI_MISC_SYSTEM_EVENT_LOG_DATA *) RecordData;\r
-\r
-  //\r
-  // Log Area Length\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogAreaLength),\r
-    &(SystemEventLog->LogAreaLength),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Log Header Start Offset\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderStartOffset),\r
-    &(SystemEventLog->LogHeaderStartOffset),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Log Data Start Offset\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogDataStartOffset),\r
-    &(SystemEventLog->LogDataStartOffset),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Access Method\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethod),\r
-    &(SystemEventLog->AccessMethod),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Log Status\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogStatus),\r
-    &(SystemEventLog->LogStatus),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Log Change Token\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogChangeToken),\r
-    &(SystemEventLog->LogChangeToken),\r
-    4\r
-    );\r
-\r
-  //\r
-  // Access Method Address\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethodAddress),\r
-    &(SystemEventLog->AccessMethodAddress),\r
-    4\r
-    );\r
-\r
-  //\r
-  // Log Header Format\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderFormat),\r
-    &(SystemEventLog->LogHeaderFormat),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Number of Supported Log Type Descriptors\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, NumberOfSupportedLogTypeDescriptors),\r
-    &(SystemEventLog->NumberOfSupportedLogType),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Length of each Log Type Descriptor\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LengthOfLogTypeDescriptor),\r
-    &(SystemEventLog->LengthOfLogDescriptor),\r
-    1\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 21 - Pointing Device.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType21 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_POINTING_DEVICE_TYPE_DATA *PointingDeviceData;\r
-\r
-  PointingDeviceData = (EFI_MISC_POINTING_DEVICE_TYPE_DATA *) RecordData;\r
-\r
-  //\r
-  // Pointing Device Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Type)) = (UINT8) (PointingDeviceData->PointingDeviceType);\r
-\r
-  //\r
-  // Pointing Device Interface\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Interface)) = (UINT8) (PointingDeviceData->PointingDeviceInterface);\r
-\r
-  //\r
-  // Number Pointing Device Buttons\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, NumberOfButtons)) = (UINT8) (PointingDeviceData->NumberPointingDeviceButtons);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 22 - Portable Battery.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType22 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_PORTABLE_BATTERY *PortableBattery;\r
-  STRING_REF                Chemistry;\r
-  PortableBattery = (EFI_MISC_PORTABLE_BATTERY *)RecordData;\r
-  \r
-  //\r
-  // Location\r
-  // \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, Location),\r
-    &(PortableBattery->Location),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-  \r
-  //\r
-  // Manufacturer\r
-  // \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, Manufacturer),\r
-    &(PortableBattery->Manufacturer),\r
-    2 \r
-    );  \r
-\r
-  //\r
-  // ManufactureDate\r
-  // \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, ManufactureDate),\r
-    &(PortableBattery->ManufactureDate),\r
-    2 \r
-    );    \r
-\r
-  //\r
-  // SerialNumber\r
-  // \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, SerialNumber),\r
-    &(PortableBattery->SerialNumber),\r
-    2 \r
-    );\r
-\r
-  //\r
-  // DeviceName\r
-  // \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceName),\r
-    &(PortableBattery->DeviceName),\r
-    2 \r
-  );   \r
-  \r
-  //\r
-  // DeviceChemistry\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceChemistry),\r
-    &PortableBattery->DeviceChemistry,\r
-    1\r
-    );\r
-\r
-  //\r
-  // DesignCapacity\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceCapacity),\r
-    &PortableBattery->DesignCapacity,\r
-    2\r
-    );\r
-    \r
-  //\r
-  // DesignVoltage\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignVoltage),\r
-    &PortableBattery->DesignVoltage,\r
-    2\r
-    );    \r
\r
-  //\r
-  // SBDSVersionNumber\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSVersionNumber),\r
-    &(PortableBattery->SBDSVersionNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-\r
-  //\r
-  // MaximumError\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, MaximumErrorInBatteryData),\r
-    &PortableBattery->MaximumError,\r
-    1\r
-    ); \r
-    \r
-  //\r
-  // SBDSSerialNumber\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSSerialNumber),\r
-    &PortableBattery->SBDSSerialNumber,\r
-    2\r
-    );      \r
-\r
-  //\r
-  // SBDSManufactureDate\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSManufactureDate),\r
-    &PortableBattery->SBDSManufactureDate,\r
-    2\r
-    );\r
-\r
-  //\r
-  // Avoid alignment issue on IPF\r
-  //\r
-  CopyMem (\r
-    &Chemistry, \r
-    &PortableBattery->SBDSDeviceChemistry,\r
-    2\r
-    );\r
-\r
-  //\r
-  // SBDSDeviceChemistry\r
-  //    \r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSDeviceChemistry),\r
-    &Chemistry,\r
-    2 // 64 * sizeof(CHAR16)\r
-    ); \r
-    \r
-  //\r
-  // DesignCapacityMultiplier\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignCapacityMultiplier),\r
-    &PortableBattery->DesignCapacityMultiplier,\r
-    1\r
-    );             \r
\r
-  //\r
-  // OEMSpecific\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, OEMSpecific),\r
-    &PortableBattery->OEMSpecific,\r
-    4\r
-    );\r
-    \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 23 - System Reset.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType23 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_RESET_CAPABILITIES_DATA  *SystemResetData;\r
-\r
-  SystemResetData = (EFI_MISC_RESET_CAPABILITIES_DATA *) RecordData;\r
-\r
-  //\r
-  // Reset Capabilities\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Capabilities),\r
-    &(SystemResetData->ResetCapabilities),\r
-    1\r
-    );\r
-\r
-  //\r
-  // Reset Count\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetCount),\r
-    &(SystemResetData->ResetCount),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Reset Limit\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetLimit),\r
-    &(SystemResetData->ResetLimit),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Reset Timer Interval\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, TimerInterval),\r
-    &(SystemResetData->ResetTimerInterval),\r
-    2\r
-    );\r
-\r
-  //\r
-  // Reset Timeout\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Timeout),\r
-    &(SystemResetData->ResetTimeout),\r
-    2\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 24 - Hardware Security.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType24 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *HardwareSecurity;\r
-  \r
-  HardwareSecurity = (EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *)RecordData;\r
-  \r
-  //\r
-  // Hardware Security Settings\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE24, HardwareSecuritySettings),\r
-    &HardwareSecurity->HardwareSecuritySettings,\r
-    1\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 25 - System Power Controls.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType25 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_SCHEDULED_POWER_ON_MONTH *PowerOnMonth;\r
-  \r
-  PowerOnMonth = (EFI_MISC_SCHEDULED_POWER_ON_MONTH *)RecordData;\r
-  \r
-  //\r
-  // ScheduledPoweronMonth\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMonth),\r
-    &PowerOnMonth->ScheduledPoweronMonth,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // ScheduledPoweronDayOfMonth\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnDayOfMonth),\r
-    &PowerOnMonth->ScheduledPoweronDayOfMonth,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // ScheduledPoweronHour\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnHour),\r
-    &PowerOnMonth->ScheduledPoweronHour,\r
-    1\r
-    );   \r
-\r
-  //\r
-  // ScheduledPoweronMinute\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMinute),\r
-    &PowerOnMonth->ScheduledPoweronMinute,\r
-    1\r
-    );   \r
-\r
-  //\r
-  // ScheduledPoweronSecond\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnSecond),\r
-    &PowerOnMonth->ScheduledPoweronSecond,\r
-    1\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 26 - Voltage Probe.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType26 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *VoltageProbe;\r
-  \r
-  VoltageProbe = (EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *)RecordData;\r
-  \r
-  //\r
-  // VoltageProbe Description\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE26, Description),\r
-    &(VoltageProbe->VoltageProbeDescription),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );  \r
-    \r
-  //\r
-  // VoltageProbeLocation\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, LocationAndStatus),\r
-    &VoltageProbe->VoltageProbeLocation,\r
-    1\r
-    );    \r
-    \r
-  //\r
-  // VoltageProbeMaximumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MaximumValue),\r
-    &VoltageProbe->VoltageProbeMaximumValue,\r
-    2\r
-    );    \r
-    \r
-  //\r
-  // VoltageProbeMinimumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MinimumValue),\r
-    &VoltageProbe->VoltageProbeMinimumValue,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // VoltageProbeResolution\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Resolution),\r
-    &VoltageProbe->VoltageProbeResolution,\r
-    2\r
-    );    \r
-\r
-  //\r
-  // VoltageProbeTolerance\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Tolerance),\r
-    &VoltageProbe->VoltageProbeTolerance,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // VoltageProbeAccuracy\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Accuracy),\r
-    &VoltageProbe->VoltageProbeAccuracy,\r
-    2\r
-    );  \r
-    \r
-  //\r
-  // VoltageProbeNominalValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, NominalValue),\r
-    &VoltageProbe->VoltageProbeNominalValue,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // VoltageProbeOemDefined\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, OEMDefined),\r
-    &VoltageProbe->VoltageProbeOemDefined,\r
-    4\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 27 - Cooling Device.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType27 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_COOLING_DEVICE_TEMP_LINK *CoolingDevice;\r
-  \r
-  CoolingDevice = (EFI_MISC_COOLING_DEVICE_TEMP_LINK *)RecordData;\r
-  \r
-  //\r
-  // Device Type\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, DeviceTypeAndStatus),\r
-    &CoolingDevice->CoolingDeviceType,\r
-    1\r
-    );\r
-  \r
-  //\r
-  // Temperature Probe\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE27, TemperatureProbeHandle),\r
-    28,  // SMBIOS type 28 - Temperature Probe\r
-    &CoolingDevice->CoolingDeviceTemperatureLink,\r
-    &gEfiMiscSubClassGuid\r
-    );\r
-  \r
-  //\r
-  // CoolingDeviceUnitGroup\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, CoolingUnitGroup),\r
-    &CoolingDevice->CoolingDeviceUnitGroup,\r
-    1\r
-    );\r
-\r
-  //\r
-  // CoolingDeviceUnitGroup\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, OEMDefined),\r
-    &CoolingDevice->CoolingDeviceOemDefined,\r
-    4\r
-    );\r
-\r
-  //\r
-  // CoolingDeviceNominalSpeed\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, NominalSpeed),\r
-    &CoolingDevice->CoolingDeviceNominalSpeed,\r
-    2\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 28 -- Temperature Probe.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType28 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *TemperatureProbe;\r
-  \r
-  TemperatureProbe = (EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *)RecordData;\r
-  \r
-  //\r
-  // TemperatureProbeDescription\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE28, Description),\r
-    &(TemperatureProbe->TemperatureProbeDescription),\r
-    2\r
-    );\r
-    \r
-  //\r
-  // TemperatureProbeLocation\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, LocationAndStatus),\r
-    &TemperatureProbe->TemperatureProbeLocation,\r
-    1\r
-    ); \r
-    \r
-  //\r
-  // TemperatureProbeMaximumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MaximumValue),\r
-    &TemperatureProbe->TemperatureProbeMaximumValue,\r
-    2\r
-    );        \r
-\r
-  //\r
-  // TemperatureProbeMinimumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MinimumValue),\r
-    &TemperatureProbe->TemperatureProbeMinimumValue,\r
-    2\r
-    );  \r
-\r
-  //\r
-  // TemperatureProbeResolution\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Resolution),\r
-    &TemperatureProbe->TemperatureProbeResolution,\r
-    2\r
-    );  \r
-  \r
-\r
-  //\r
-  // TemperatureProbeTolerance\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Tolerance),\r
-    &TemperatureProbe->TemperatureProbeTolerance,\r
-    2\r
-    );  \r
-\r
-  //\r
-  // TemperatureProbeAccuracy\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Accuracy),\r
-    &TemperatureProbe->TemperatureProbeAccuracy,\r
-    2\r
-    );\r
-\r
-  //\r
-  // TemperatureProbeNominalValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, NominalValue),\r
-    &TemperatureProbe->TemperatureProbeNominalValue,\r
-    2\r
-    );\r
-\r
-  //\r
-  // TemperatureProbeOemDefined\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, OEMDefined),\r
-    &TemperatureProbe->TemperatureProbeOemDefined,\r
-    4\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}  \r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 29 -- Electrical Current Probe.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType29 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *ElectricalProbe;\r
-  \r
-  ElectricalProbe = (EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *)RecordData;\r
-  \r
-  //\r
-  // ElectricalCurrentProbeDescription\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE29, Description),\r
-    &(ElectricalProbe->ElectricalCurrentProbeDescription),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );\r
-    \r
-  //\r
-  // ElectricalCurrentProbeLocation\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, LocationAndStatus),\r
-    &ElectricalProbe->ElectricalCurrentProbeLocation,\r
-    1\r
-    );\r
-    \r
-  //\r
-  // ElectricalCurrentProbeMaximumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MaximumValue),\r
-    &ElectricalProbe->ElectricalCurrentProbeMaximumValue,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // ElectricalCurrentProbeMinimumValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MinimumValue),\r
-    &ElectricalProbe->ElectricalCurrentProbeMinimumValue,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // ElectricalCurrentProbeResolution\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Resolution),\r
-    &ElectricalProbe->ElectricalCurrentProbeResolution,\r
-    2\r
-    );     \r
-\r
-  //\r
-  // ElectricalCurrentProbeTolerance\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Tolerance),\r
-    &ElectricalProbe->ElectricalCurrentProbeTolerance,\r
-    2\r
-    );     \r
-\r
-  //\r
-  // ElectricalCurrentProbeAccuracy\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Accuracy),\r
-    &ElectricalProbe->ElectricalCurrentProbeAccuracy,\r
-    2\r
-    );   \r
-  //\r
-  // ElectricalCurrentProbeNominalValue\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, NominalValue),\r
-    &ElectricalProbe->ElectricalCurrentProbeNominalValue,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // ElectricalCurrentProbeOemDefined\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, OEMDefined),\r
-    &ElectricalProbe->ElectricalCurrentProbeOemDefined,\r
-    4\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 30 -- Out-of-Band Remote Access.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType30 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *RemoteData;\r
-  \r
-  RemoteData = (EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *)RecordData;\r
-  \r
-  //\r
-  // ManufacturerNameDescription\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE30, ManufacturerName),\r
-    &(RemoteData->RemoteAccessManufacturerNameDescription),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );  \r
-    \r
-  //\r
-  // RemoteAccessConnections\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE30, Connections),\r
-    &RemoteData->RemoteAccessConnections,\r
-    1\r
-    );\r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 32 -- System Boot Information.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType32 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                             Status;\r
-  EFI_MISC_BOOT_INFORMATION_STATUS_DATA  *BootInfo;\r
-\r
-  Status    = EFI_SUCCESS;\r
-  BootInfo  = (EFI_MISC_BOOT_INFORMATION_STATUS_DATA *) RecordData;\r
-\r
-  //\r
-  // Set reserved bytes\r
-  //\r
-  ZeroMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, Reserved), 6);\r
-\r
-  //\r
-  // Set BootInformation Status\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus),\r
-    &BootInfo->BootInformationStatus,\r
-    1\r
-    );\r
-\r
-  //\r
-  // Set Additional Data\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus) + 1,\r
-    &BootInfo->BootInformationData,\r
-    9\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 34 -- Management Device.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType34 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *ManagementDevice;\r
-  \r
-  ManagementDevice = (EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *)RecordData;\r
-  \r
-  //\r
-  // ManagementDeviceDescription\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE34, Description),\r
-    &(ManagementDevice->ManagementDeviceDescription),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );  \r
-    \r
-  //\r
-  // ManagementDeviceType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Type),\r
-    &ManagementDevice->ManagementDeviceType,\r
-    1\r
-    );    \r
-\r
-  //\r
-  // ManagementDeviceAddress\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Address),\r
-    &ManagementDevice->ManagementDeviceAddress,\r
-    4\r
-    );    \r
-\r
-  //\r
-  // ManagementDeviceAddressType\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, AddressType),\r
-    &ManagementDevice->ManagementDeviceAddressType,\r
-    1\r
-    );  \r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 36 -- Management Device Threshold.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType36 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *DeviceThreshold;\r
-  \r
-  DeviceThreshold = (EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *)RecordData;\r
-\r
-  //\r
-  // LowerThresNonCritical\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonCritical),\r
-    &DeviceThreshold->LowerThresNonCritical,\r
-    2\r
-    );    \r
-\r
-  //\r
-  // UpperThresNonCritical\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonCritical),\r
-    &DeviceThreshold->UpperThresNonCritical,\r
-    2\r
-    );\r
-    \r
-  //\r
-  // LowerThresCritical\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdCritical),\r
-    &DeviceThreshold->LowerThresCritical,\r
-    2\r
-    );          \r
-\r
-  //\r
-  // UpperThresCritical\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdCritical),\r
-    &DeviceThreshold->UpperThresCritical,\r
-    2\r
-    );   \r
-\r
-  //\r
-  // LowerThresNonRecover\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonRecoverable),\r
-    &DeviceThreshold->LowerThresNonRecover,\r
-    2\r
-    );\r
-\r
-  //\r
-  // UpperThresNonRecover\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonRecoverable),\r
-    &DeviceThreshold->UpperThresNonRecover,\r
-    2\r
-    );          \r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 38 -- IPMI device info.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType38 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_IPMI_INTERFACE_TYPE_DATA  *IpmiInfo;\r
-\r
-  IpmiInfo  = (EFI_MISC_IPMI_INTERFACE_TYPE_DATA *) RecordData;\r
-\r
-  //\r
-  // Interface Type\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, InterfaceType)) = (UINT8) (IpmiInfo->IpmiInterfaceType);\r
-\r
-  //\r
-  // IPMI specification revision\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, IPMISpecificationRevision)) = \r
-  (UINT8) ((IpmiInfo->IpmiSpecificationRevision.IpmiSpecLeastSignificantDigit) + \\r
-           (IpmiInfo->IpmiSpecificationRevision.IpmiSpecMostSignificantDigit << 4));\r
-\r
-  //\r
-  // I2C slave address\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, I2CSlaveAddress)) = (UINT8) (IpmiInfo->IpmiI2CSlaveAddress);\r
-\r
-  //\r
-  // NV storage device address\r
-  //\r
-  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, NVStorageDeviceAddress)) = (UINT8) (IpmiInfo->IpmiNvDeviceAddress);\r
-\r
-  //\r
-  // Base address\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, BaseAddress),\r
-    &IpmiInfo->IpmiBaseAddress,\r
-    8\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 39 -- Power supply.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType39 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_MISC_SYSTEM_POWER_SUPPLY *PowerSupply;\r
-  \r
-  PowerSupply = (EFI_MISC_SYSTEM_POWER_SUPPLY *)RecordData;\r
-  \r
-  //\r
-  // PowerUnitGroup\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerUnitGroup),\r
-    &PowerSupply->PowerUnitGroup,\r
-    1\r
-    );  \r
-    \r
-  //\r
-  // PowerSupplyLocation\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, Location),\r
-    &(PowerSupply->PowerSupplyLocation),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );    \r
-\r
-  //\r
-  // PowerSupplyDeviceName\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, DeviceName),\r
-    &(PowerSupply->PowerSupplyDeviceName),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );   \r
-\r
-  //\r
-  // PowerSupplyManufacturer\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, Manufacturer),\r
-    &(PowerSupply->PowerSupplyManufacturer),\r
-    2 // 64 * sizeof(CHAR16)\r
-    ); \r
-\r
-  //\r
-  // PowerSupplySerialNumber\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, SerialNumber),\r
-    &(PowerSupply->PowerSupplySerialNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );  \r
-    \r
-  //\r
-  // PowerSupplyAssetTagNumber\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, AssetTagNumber),\r
-    &(PowerSupply->PowerSupplyAssetTagNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );      \r
-\r
-  //\r
-  // PowerSupplyModelPartNumber\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, ModelPartNumber),\r
-    &(PowerSupply->PowerSupplyModelPartNumber),\r
-    2 // 64 * sizeof(CHAR16)\r
-    ); \r
-    \r
-  //\r
-  // PowerSupplyRevisionLevel\r
-  //\r
-  SmbiosFldString (\r
-    StructureNode,\r
-    OFFSET_OF (SMBIOS_TABLE_TYPE39, RevisionLevel),\r
-    &(PowerSupply->PowerSupplyRevisionLevel),\r
-    2 // 64 * sizeof(CHAR16)\r
-    );      \r
-\r
-  //\r
-  // PowerSupplyMaxPowerCapacity\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, MaxPowerCapacity),\r
-    &PowerSupply->PowerSupplyMaxPowerCapacity,\r
-    2\r
-    );\r
-\r
-  //\r
-  // PowerSupplyCharacteristics\r
-  //\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerSupplyCharacteristics),\r
-    &PowerSupply->PowerSupplyCharacteristics,\r
-    2\r
-    );\r
-    \r
-  //\r
-  // PowerSupplyInputVoltageProbeLink\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputVoltageProbeHandle),\r
-    26,  // SMBIOS type 26 - Voltage Probe\r
-    &PowerSupply->PowerSupplyInputVoltageProbeLink,\r
-    &gEfiMiscSubClassGuid\r
-    );    \r
-\r
-  //\r
-  // PowerSupplyCoolingDeviceLink\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, CoolingDeviceHandle),\r
-    27,  // SMBIOS type 27 - Cooling Device\r
-    &PowerSupply->PowerSupplyCoolingDeviceLink,\r
-    &gEfiMiscSubClassGuid\r
-    );   \r
-\r
-  //\r
-  // PowerSupplyInputCurrentProbeLink\r
-  //\r
-  SmbiosFldInterLink (\r
-    StructureNode,\r
-    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputCurrentProbeHandle),\r
-    29,  // SMBIOS type 29 - Electrical Current Probe\r
-    &PowerSupply->PowerSupplyInputCurrentProbeLink,\r
-    &gEfiMiscSubClassGuid\r
-    );  \r
-  \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 0x80-0xFF -- OEM.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscTypeOEM (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_STATUS                            Status;\r
-  UINT8                                 *NewRecordData;\r
-  UINT32                                IncrementDataSize;\r
-  UINT16                                Handle;\r
-  INT8                                  Result;\r
-  UINT32                                StructureSize;\r
-  UINT8                                 CountOfString;\r
-  \r
-  Status             = EFI_SUCCESS;\r
-  NewRecordData      = NULL;\r
-\r
-  //\r
-  // Check if OEM structure has included 2 trailing 0s in data record, if not, \r
-  // we append them at the end to ensure OEM structure is always correct with 2 trailing 0s.\r
-  //\r
-  Result = SmbiosCheckTrailingZero (RecordData, RecordDataSize);\r
-  \r
-  if (Result != 0) {\r
-    DEBUG ((EFI_D_ERROR, "OEM SMBIOS type %x is not valid!!\n", ((SMBIOS_STRUCTURE *) RecordData) -> Type));\r
-    if (Result == -1) {\r
-      //\r
-      // No 2 trailing 0s exist\r
-      //\r
-      DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has NO 2 trailing 0s!!\n"));\r
-      IncrementDataSize = 2;\r
-    } else {\r
-      //\r
-      // Only 1 trailing 0 exist at the end\r
-      //\r
-      DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has only 1 trailing 0!!\n"));\r
-      IncrementDataSize = 1;\r
-    }\r
-    NewRecordData = AllocateZeroPool (RecordDataSize + IncrementDataSize);\r
-    ASSERT (NewRecordData != NULL);\r
-    CopyMem (NewRecordData, RecordData, RecordDataSize);\r
-    RecordData = NewRecordData;\r
-    RecordDataSize += IncrementDataSize;\r
-  }\r
-  \r
-  Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureSize, &CountOfString);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
-  if (StructureSize < RecordDataSize) {\r
-    Status = SmbiosEnlargeStructureBuffer (\r
-               StructureNode,\r
-               ((EFI_SMBIOS_TABLE_HEADER *)RecordData)->Length,\r
-               StructureSize,\r
-               RecordDataSize\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Copy the entire data (including the Smbios structure header),\r
-  // but preserve the handle that is already allocated.\r
-  //\r
-  Handle = StructureNode->Structure->Handle;\r
-  CopyMem (\r
-    StructureNode->Structure,\r
-    RecordData,\r
-    RecordDataSize\r
-    );\r
-  StructureNode->Structure->Handle = Handle;\r
-  StructureNode->StructureSize = RecordDataSize;\r
-  \r
-  if (NewRecordData != NULL) {\r
-    FreePool (NewRecordData);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Misc SubClass record type 127 - End-of-Table.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMiscType127 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  return EFI_SUCCESS;\r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ProcessorConv.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/ProcessorConv.c
deleted file mode 100644 (file)
index 5bd3207..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/** @file\r
-  Routines that support Processor SubClass data records translation.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-/**\r
-  Field Filling Function for Processor SubClass record type 17 -- Cache association.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldProcessorType17 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
-  EFI_INTER_LINK_DATA       *LinkData;\r
-  UINT16                    FieldOffset;\r
-  UINT8                     *Pointer;\r
-\r
-  DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *) RecordData;\r
-  LinkData    = (EFI_INTER_LINK_DATA *) (DataHeader + 1);\r
-  if (RecordDataSize != sizeof (EFI_INTER_LINK_DATA) + sizeof (EFI_SUBCLASS_TYPE1_HEADER)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Determine the cache level\r
-  //\r
-  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
-  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
-    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle), 2, 0xFF);\r
-  }\r
-\r
-  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
-  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
-    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle), 2, 0xFF);\r
-  }\r
-\r
-  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
-  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
-    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle), 2, 0xFF);\r
-  }\r
-\r
-  if (LinkData->SubInstance == 1) {\r
-    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
-  } else if (LinkData->SubInstance == 2) {\r
-    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
-  } else if (LinkData->SubInstance == 3) {\r
-    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
-  } else {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  return SmbiosFldInterLink (\r
-          StructureNode,\r
-          FieldOffset,\r
-          7,                  // Smbios type 7 -- Cache Information\r
-          LinkData,\r
-          &gEfiCacheSubClassGuid // gProcessorSubClassName\r
-          );\r
-}\r
-\r
-/**\r
-  Field Filling Function for Processor SubClass record type 6 -- ProcessorID.\r
-  Offset is mandatory.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldProcessorType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_PROCESSOR_ID_DATA *ProcessorIdData;\r
-\r
-  ProcessorIdData = RecordData;\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset,\r
-    &(ProcessorIdData->Signature),\r
-    4\r
-    );\r
-\r
-  CopyMem (\r
-    (UINT8 *) (StructureNode->Structure) + Offset + 4,\r
-    &(ProcessorIdData->FeatureFlags),\r
-    4\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Field Filling Function for Processor SubClass record type 9 -- Voltage.\r
-  Offset is mandatory.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldProcessorType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-{\r
-  EFI_EXP_BASE10_DATA *Base10Data;\r
-  INT16               Value;\r
-  INT16               Exponent;\r
-\r
-  if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Base10Data  = RecordData;\r
-  Value       = Base10Data->Value;\r
-  Exponent    = Base10Data->Exponent;\r
-\r
-  Exponent += 1;\r
-  while (Exponent != 0) {\r
-    if (Exponent > 0) {\r
-      Value = (INT16) (Value * 10);\r
-      Exponent--;\r
-    } else {\r
-      Value = (INT16) (Value / 10);\r
-      Exponent++;\r
-    }\r
-  }\r
-\r
-  * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (Value | BIT7);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.c
deleted file mode 100644 (file)
index 797f803..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/** @file\r
-  Thunk driver's entry that install filter for DataRecord.\r
-  \r
-Copyright (c) 2009 Intel Corporation. <BR>\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-//\r
-// Global variables\r
-//\r
-LIST_ENTRY  mStructureList;\r
-\r
-/**\r
-  Entry Point of thunk driver.\r
-\r
-  @param[in] ImageHandle  Image handle of this driver.\r
-  @param[in] SystemTable  Pointer to EFI system table.\r
-\r
-  @retval EFI_SUCCESS          The event handlers were registered.\r
-  @retval EFI_DEVICE_ERROR     Failed to register the event handlers\r
-**/  \r
-EFI_STATUS\r
-EFIAPI\r
-ThunkEntry (\r
-  IN EFI_HANDLE         ImageHandle,\r
-  IN EFI_SYSTEM_TABLE   *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS            Status;\r
-  EFI_DATA_HUB_PROTOCOL *DataHub;\r
-  EFI_EVENT             FilterEvent;\r
-    \r
-  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**) &DataHub);\r
-  ASSERT_EFI_ERROR (Status);\r
-  ASSERT (DataHub != NULL);\r
-\r
-  InitializeListHead (&mStructureList);\r
-\r
-  //\r
-  // Register SmBios Data Filter Function.\r
-  // This function is notified at TPL_CALLBACK.\r
-  //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_NOTIFY_SIGNAL,\r
-                  TPL_CALLBACK,\r
-                  SmbiosDataFilter,\r
-                  NULL,\r
-                  &FilterEvent\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = DataHub->RegisterFilterDriver (\r
-                      DataHub,\r
-                      FilterEvent,\r
-                      TPL_APPLICATION,\r
-                      EFI_DATA_RECORD_CLASS_DATA,\r
-                      NULL\r
-                      );\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (FilterEvent);\r
-    return Status;\r
-  }\r
-\r
-  return Status;\r
-\r
-} \r
-\r
-/**\r
-  Smbios data filter function. This function is invoked when there is data records\r
-  available in the Data Hub. \r
-\r
-  @param Event         The event that is signaled.\r
-  @param Context       not used here.\r
-**/\r
-VOID\r
-EFIAPI\r
-SmbiosDataFilter (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_DATA_HUB_PROTOCOL   *DataHub;\r
-  EFI_HANDLE              DataHubHandle;\r
-  UINTN                   HandleSize;\r
-  UINT64                  MonotonicCount;\r
-  EFI_DATA_RECORD_HEADER  *Record;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  DataHub = NULL;\r
-\r
-  //\r
-  // Get the Data Hub Protocol. Assume only one instance\r
-  // of Data Hub Protocol is availabe in the system.\r
-  //\r
-  HandleSize = sizeof (EFI_HANDLE);\r
-\r
-  Status = gBS->LocateHandle (\r
-                  ByProtocol,\r
-                  &gEfiDataHubProtocolGuid,\r
-                  NULL,\r
-                  &HandleSize,\r
-                  &DataHubHandle\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto Done;\r
-  }\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  DataHubHandle,\r
-                  &gEfiDataHubProtocolGuid,\r
-                  (VOID **) &DataHub\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Get all available data records from data hub\r
-  //\r
-  MonotonicCount  = 0;\r
-  Record          = NULL;\r
-\r
-  do {\r
-\r
-    Status = DataHub->GetNextRecord (\r
-                        DataHub,\r
-                        &MonotonicCount,\r
-                        &Event,\r
-                        &Record\r
-                        );\r
-\r
-    if (!EFI_ERROR (Status)) {\r
-      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
-      \r
-        //\r
-        // It's of expected Data Type. Process it.\r
-        //\r
-        SmbiosProcessDataRecord (Record);\r
-      }\r
-    }\r
-  } while (!EFI_ERROR (Status) && (MonotonicCount != 0));\r
-\r
-Done:\r
-\r
-  return ;\r
-\r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.h b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Thunk.h
deleted file mode 100644 (file)
index 2069fa9..0000000
+++ /dev/null
@@ -1,842 +0,0 @@
-/** @file\r
-  The common header file for the thunk driver.\r
-  \r
-Copyright (c) 2009 Intel Corporation. <BR>\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
-**/\r
-\r
-#ifndef _DATAHUB_TO_SMBIOS_THUNK_\r
-#define _DATAHUB_TO_SMBIOS_THUNK_\r
-\r
-#include <FrameworkDxe.h>\r
-#include <IndustryStandard/SmBios.h>\r
-\r
-#include <Guid/EventGroup.h>\r
-#include <Guid/SmBios.h>\r
-#include <Protocol/DataHub.h>\r
-#include <Guid/DataHubRecords.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/Smbios.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/ReportStatusCodeLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-\r
-//\r
-// Conversion Table that describes the translation method for\r
-// Data Hub Data Records of certain SubClass and RecordNumber\r
-//\r
-typedef enum {\r
-  BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
-  BY_SUBCLASS_INSTANCE_PRODUCER,\r
-  MAX_LOCATING_METHOD\r
-} SMBIOS_STRUCTURE_LOCATING_METHOD;\r
-\r
-typedef enum {\r
-  RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED,\r
-  BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
-  BY_FUNCTION,\r
-  BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
-  MAX_FIELD_FILLING_METHOD\r
-} SMBIOS_FIELD_FILLING_METHOD;\r
-\r
-typedef struct _SMBIOS_STRUCTURE_NODE SMBIOS_STRUCTURE_NODE;\r
-\r
-typedef struct {\r
-  UINT8   Type;\r
-  UINT8   Length;\r
-  UINT16  Handle;\r
-  UINT8   Tailing[2];\r
-} EFI_SMBIOS_TABLE_TYPE127;\r
-\r
-typedef\r
-EFI_STATUS\r
-(*SMBIOS_FIELD_FILLING_FUNCTION) (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE                     * StructureNode,\r
-  IN      UINT32                                    Offset          OPTIONAL,\r
-  IN      VOID                                      *RecordData,\r
-  IN      UINT32                                    RecordDataSize\r
-  );\r
-\r
-typedef struct {\r
-  //\r
-  // Data Hub Data Record's SubClass and RecordNumber\r
-  //\r
-  EFI_GUID                          SubClass;\r
-  UINT32                            RecordType;\r
-\r
-  //\r
-  // Translation method applied\r
-  //\r
-  UINT8                             SmbiosType;\r
-  SMBIOS_STRUCTURE_LOCATING_METHOD  StructureLocatingMethod;\r
-  SMBIOS_FIELD_FILLING_METHOD       FieldFillingMethod;\r
-  UINT32                            FieldOffset;\r
-  SMBIOS_FIELD_FILLING_FUNCTION     FieldFillingFunction;\r
-\r
-} SMBIOS_CONVERSION_TABLE_ENTRY;\r
-\r
-//\r
-// SMBIOS_LINK_DATA_FIXUP nodes indicate the Link fields that\r
-// need to be fixed up when creating the resulting Smbios image.\r
-//\r
-#define SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'l', 'n')\r
-\r
-typedef struct {\r
-\r
-  UINT32              Signature;\r
-  LIST_ENTRY          Link;\r
-\r
-  UINT32              Offset;\r
-  UINT8               TargetType;\r
-  EFI_GUID            SubClass;\r
-  EFI_INTER_LINK_DATA LinkData;\r
-\r
-} SMBIOS_LINK_DATA_FIXUP_NODE;\r
-\r
-//\r
-// The global Structure List node.\r
-// The Structure List is populated as more and more\r
-// Structures (of various types) are discovered and inserted.\r
-// The nodes in the Structure List will be concatenated\r
-// to form the ultimate SMBIOS table.\r
-//\r
-#define SMBIOS_STRUCTURE_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'b', 's')\r
-\r
-struct _SMBIOS_STRUCTURE_NODE {\r
-\r
-  UINT32            Signature;\r
-  LIST_ENTRY        Link;\r
-\r
-  //\r
-  // Tags\r
-  //\r
-  EFI_GUID          SubClass;\r
-  UINT16            Instance;\r
-  UINT16            SubInstance;\r
-  EFI_GUID          ProducerName;\r
-\r
-  //\r
-  // the Smbios structure\r
-  //\r
-  UINT32            StructureSize;        // Actual structure size including strings\r
-\r
-  EFI_SMBIOS_TABLE_HEADER *Structure;\r
-  \r
-  \r
-  EFI_SMBIOS_HANDLE SmbiosHandle;         // Smbios Handle in SMBIOS database.\r
-  \r
-  EFI_SMBIOS_TYPE   SmbiosType;\r
-  \r
-  LIST_ENTRY    LinkDataFixup;\r
-  \r
-};\r
-\r
-//\r
-// Smbios type info table. Indicates minimum length\r
-// for each Smbios type as the indicator of the initial size of buffer\r
-// allocated for the structure instance of a specific type.\r
-//\r
-typedef struct {\r
-\r
-  UINT8   Type;\r
-  UINT8   MinLength;  // Minimal structure size including\r
-  // TWO trailing bytes of 0x00\r
-  //\r
-  BOOLEAN IsRequired; // Required structure type defined by Smbios Spec\r
-  BOOLEAN IsCreated;  // Created in this run\r
-} SMBIOS_TYPE_INFO_TABLE_ENTRY;\r
-\r
-//\r
-// EDK framwork Memory Data hub definition to support EDK/Framework driver.\r
-//\r
-typedef struct {\r
-  STRING_REF                  MemoryDeviceLocator;\r
-  STRING_REF                  MemoryBankLocator;\r
-  STRING_REF                  MemoryManufacturer;\r
-  STRING_REF                  MemorySerialNumber;\r
-  STRING_REF                  MemoryAssetTag;\r
-  STRING_REF                  MemoryPartNumber;\r
-  EFI_INTER_LINK_DATA         MemoryArrayLink;\r
-  EFI_INTER_LINK_DATA         MemorySubArrayLink;\r
-  UINT16                      MemoryTotalWidth;\r
-  UINT16                      MemoryDataWidth;\r
-  UINT64                      MemoryDeviceSize;\r
-  EFI_MEMORY_FORM_FACTOR      MemoryFormFactor;\r
-  UINT8                       MemoryDeviceSet;\r
-  EFI_MEMORY_ARRAY_TYPE       MemoryType;\r
-  EFI_MEMORY_TYPE_DETAIL      MemoryTypeDetail;\r
-  UINT16                      MemorySpeed;\r
-  EFI_MEMORY_STATE            MemoryState;\r
-  UINT8                       MemoryAttributes;\r
-} FRAMEWORK_MEMORY_ARRAY_LINK_DATA;\r
-\r
-typedef struct {\r
-  EFI_MEMORY_ARRAY_LOCATION   MemoryArrayLocation;\r
-  EFI_MEMORY_ARRAY_USE        MemoryArrayUse;\r
-  EFI_MEMORY_ERROR_CORRECTION MemoryErrorCorrection;\r
-  UINT32                      MaximumMemoryCapacity;\r
-  UINT16                      NumberMemoryDevices;\r
-} FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA;\r
-\r
-//\r
-// Global variables\r
-//\r
-extern SMBIOS_CONVERSION_TABLE_ENTRY  mConversionTable[];\r
-extern SMBIOS_TYPE_INFO_TABLE_ENTRY   mTypeInfoTable[];\r
-extern LIST_ENTRY                     mStructureList;\r
-\r
-//\r
-// Function Prototypes\r
-//\r
-/**\r
-  Smbios data filter function. This function is invoked when there is data records\r
-  available in the Data Hub. \r
-\r
-  @param Event         The event that is signaled.\r
-  @param Context       not used here.\r
-**/\r
-VOID\r
-EFIAPI\r
-SmbiosDataFilter (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
-  );\r
-\r
-//\r
-// Function prototypes\r
-//\r
-/**\r
-  Process a datahub's record and find corresponding translation way to translate\r
-  to SMBIOS record.\r
-  \r
-  @param Record  Point to datahub record.\r
-**/\r
-VOID\r
-SmbiosProcessDataRecord (\r
-  IN EFI_DATA_RECORD_HEADER  *Record\r
-  )\r
-;\r
-\r
-/**\r
-  Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
-  to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
-  \r
-  @param Type  SMBIOS's type.\r
-  \r
-  @return the minimal length of a smbios record.\r
-**/\r
-UINT32\r
-SmbiosGetTypeMinimalLength (\r
-  IN UINT8  Type\r
-  )\r
-;\r
-\r
-/**\r
-  Enlarge the structure buffer of a structure node in SMBIOS database.\r
-  The function maybe lead the structure pointer for SMBIOS record changed.\r
-  \r
-  @param StructureNode The structure node whose structure buffer is to be enlarged.\r
-  @param NewLength     The new length of SMBIOS record which does not include unformat area.\r
-  @param OldBufferSize The old size of SMBIOS record buffer.\r
-  @param NewBufferSize The new size is targeted for enlarged.\r
-  \r
-  @retval EFI_OUT_OF_RESOURCES  No more memory to allocate new record\r
-  @retval EFI_SUCCESS           Success to enlarge the record buffer size.\r
-**/\r
-EFI_STATUS\r
-SmbiosEnlargeStructureBuffer (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE *StructureNode,\r
-  UINT8                         NewLength,\r
-  UINTN                         OldBufferSize,\r
-  UINTN                         NewBufferSize\r
-  );\r
-\r
-/**\r
-  Field Filling Function. Fill a standard Smbios string field. \r
-  Convert the unicode string to single byte chars.\r
-  Only English language is supported.\r
-\r
-  This function changes the Structure pointer value of the structure node, \r
-  which should be noted by Caller.\r
-  \r
-  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
-  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
-  @param RecordData       RecordData buffer will be filled.\r
-  @param RecordDataSize   The size of RecordData buffer.\r
-  \r
-  @retval EFI_INVALID_PARAMETER   RecordDataSize is too larger\r
-  @retval EFI_OUT_OF_RESOURCES    No memory to allocate new buffer for string\r
-  @retval EFI_SUCCESS             Sucess append string for a SMBIOS record.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldString (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-/**\r
-  Fill the inter link field for a SMBIOS recorder.\r
-  \r
-  Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
-  maybe another SMBIOS record has not been added, so put the InterLink request into\r
-  a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
-  \r
-  @param StructureNode        Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
-  @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
-  @param LinkSmbiosType       The type of SMBIOS record want to be linked.\r
-  @param InterLink            Point to EFI_INTER_LINK_DATA will be put linked list.\r
-  @param SubClassGuid         The guid of subclass for linked SMBIOS record.\r
-  \r
-  @retval EFI_SUCESS  The linked record is found and no need fixup in future.\r
-  @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldInterLink (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT16                    LinkSmbiosNodeOffset,\r
-  IN      UINT8                     LinkSmbiosType,\r
-  IN      EFI_INTER_LINK_DATA       *InterLink,\r
-  IN      EFI_GUID                  *SubClassGuid\r
-  )\r
-;\r
-\r
-/**\r
-  Find a handle that matches the Link Data and the target Smbios type.\r
-  \r
-  @param  TargetType     the Smbios type\r
-  @param  SubClass       the SubClass\r
-  @param  LinkData       Specifies Instance, SubInstance and ProducerName\r
-  @param  Handle         the HandleNum found  \r
-  \r
-  @retval EFI_NOT_FOUND Can not find the record according to handle\r
-  @retval EFI_SUCCESS   Success to find the handle\r
-**/\r
-EFI_STATUS\r
-SmbiosFindHandle (\r
-  IN      UINT8               TargetType,\r
-  IN      EFI_GUID            *SubClass,\r
-  IN      EFI_INTER_LINK_DATA *LinkData,\r
-  IN OUT  UINT16              *HandleNum\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldBase10ToWordWithMega (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldBase2ToWordWithKilo (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldTruncateToByte (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldProcessorType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldProcessorType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldProcessorType17 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldBase10ToByteWithNano (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldTruncateToWord (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldCacheType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-INT8\r
-SmbiosCheckTrailingZero (\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldCacheType5 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType2 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType3 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType4 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType5 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType7 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType8 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMemoryType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType0 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldBase2ToByteWith64K (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType1 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType2 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType3 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType8 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType9 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType10 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType11 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType12 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType13 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType14 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType15 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType21 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType32 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType38 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  );\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscTypeOEM (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldSMBIOSType6 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset, \r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType22 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType22 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType23 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType24 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType25 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType26 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType27 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType28 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType29 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType30 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType34 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType36 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType38 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType39 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-SmbiosFldMiscType127 (\r
-  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
-  IN      UINT32                    Offset,\r
-  IN      VOID                      *RecordData,\r
-  IN      UINT32                    RecordDataSize\r
-  )\r
-;\r
-    \r
-EFI_STATUS\r
-SmbiosProtocolCreateRecord (\r
-  IN      EFI_HANDLE              ProducerHandle, OPTIONAL\r
-  IN      SMBIOS_STRUCTURE_NODE   *StructureNode\r
-  );\r
-  \r
-EFI_SMBIOS_PROTOCOL*\r
-GetSmbiosProtocol (\r
-  VOID\r
-  );\r
-    \r
-EFI_SMBIOS_TABLE_HEADER*\r
-GetSmbiosBufferFromHandle (\r
-  IN  EFI_SMBIOS_HANDLE  Handle,\r
-  IN  EFI_SMBIOS_TYPE    Type,\r
-  IN  EFI_HANDLE         ProducerHandle  OPTIONAL\r
-  );\r
-          \r
-EFI_STATUS\r
-EFIAPI\r
-GetSmbiosStructureSize (\r
-  IN   EFI_SMBIOS_TABLE_HEADER          *Head,\r
-  OUT  UINT32                           *Size,\r
-  OUT  UINT8                            *NumberOfStrings\r
-  );\r
-            \r
-#endif\r
diff --git a/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Translate.c b/EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/Translate.c
deleted file mode 100644 (file)
index 3230d96..0000000
+++ /dev/null
@@ -1,591 +0,0 @@
-/** @file\r
-  Translate the DataHub records via EFI_DATA_HUB_PROTOCOL to Smbios recorders \r
-  via EFI_SMBIOS_PROTOCOL.\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
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-EFI_GUID  ZeroGuid = { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } };\r
-EFI_SMBIOS_PROTOCOL  *mSmbiosProtocol = NULL;\r
-\r
-/**\r
-  Release the structure Node. \r
-  \r
-  @param StructureNode  Point to SMBIOS_STRUCTURE_NODE which will be removed.\r
-**/\r
-VOID\r
-ReleaseStructureNode (\r
-  SMBIOS_STRUCTURE_NODE  *StructureNode\r
-  )\r
-{\r
-  EFI_SMBIOS_PROTOCOL *Smbios;\r
-  \r
-  RemoveEntryList (&(StructureNode->Link));\r
-  Smbios = GetSmbiosProtocol();\r
-  ASSERT (Smbios != NULL);\r
-  Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
-  gBS->FreePool (StructureNode);\r
-}\r
-\r
-/**\r
-  Process a datahub's record and find corresponding translation way to translate\r
-  to SMBIOS record.\r
-  \r
-  @param Record  Point to datahub record.\r
-**/\r
-VOID\r
-SmbiosProcessDataRecord (\r
-  IN EFI_DATA_RECORD_HEADER  *Record\r
-  )\r
-{\r
-  EFI_DATA_RECORD_HEADER        *RecordHeader;\r
-  EFI_SUBCLASS_TYPE1_HEADER     *DataHeader;\r
-  UINTN                         Index;\r
-  SMBIOS_CONVERSION_TABLE_ENTRY *Conversion;\r
-  UINT8                         *SrcData;\r
-  UINTN                         SrcDataSize;\r
-  LIST_ENTRY                    *Link;\r
-  SMBIOS_STRUCTURE_NODE         *StructureNode;\r
-  BOOLEAN                       StructureCreated;\r
-  EFI_STATUS                    Status;\r
-  \r
-  Conversion        = NULL;\r
-  StructureNode     = NULL;\r
-  StructureCreated  = FALSE;\r
-  RecordHeader      = Record;\r
-  DataHeader        = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
-  SrcData           = (UINT8 *) (DataHeader + 1);\r
-  SrcDataSize       = RecordHeader->RecordSize - RecordHeader->HeaderSize - sizeof (EFI_SUBCLASS_TYPE1_HEADER);\r
-\r
-  if (DataHeader->HeaderSize != sizeof (EFI_SUBCLASS_TYPE1_HEADER) ||\r
-      DataHeader->Instance == EFI_SUBCLASS_INSTANCE_RESERVED ||\r
-      DataHeader->SubInstance == EFI_SUBCLASS_INSTANCE_RESERVED\r
-      ) {\r
-    //\r
-    // Invalid Data Record\r
-    //\r
-    goto Done;\r
-  }\r
-\r
-  Index = 0;\r
-  while(TRUE) {\r
-    //\r
-    // Find a matching entry in the conversion table for this\r
-    // (SubClass, RecordNumber) pair\r
-    //\r
-    for (; !CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid); Index++) {\r
-      if (CompareGuid (\r
-            &(mConversionTable[Index].SubClass),\r
-            &(RecordHeader->DataRecordGuid)\r
-            )) {\r
-        if (mConversionTable[Index].RecordType == DataHeader->RecordType) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    if (CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid)) {\r
-      //\r
-      // We cannot find a matching entry in conversion table,\r
-      // this means this data record cannot be used for SMBIOS.\r
-      // Just skip it.\r
-      //\r
-      goto Done;\r
-    }\r
-\r
-    Conversion = &mConversionTable[Index++];\r
-\r
-    //\r
-    // Find corresponding structure in the Structure List\r
-    //\r
-    for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
-\r
-      StructureNode = CR (\r
-                        Link,\r
-                        SMBIOS_STRUCTURE_NODE,\r
-                        Link,\r
-                        SMBIOS_STRUCTURE_NODE_SIGNATURE\r
-                        );\r
-\r
-      if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
-        //\r
-        // Look at SubClass, Instance, SubInstance and ProducerName for a matching\r
-        // node\r
-        //\r
-        if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
-            StructureNode->Instance == DataHeader->Instance &&\r
-            StructureNode->SubInstance == DataHeader->SubInstance &&\r
-            CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
-              ) {\r
-          if (Conversion->SmbiosType >= 0X80) {\r
-            if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
-              break;\r
-            }\r
-          } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
-            break;\r
-          }\r
-        }\r
-\r
-      } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
-        //\r
-        // Look at SubClass, Instance and ProducerName for a matching node\r
-        //\r
-        if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
-            StructureNode->Instance == DataHeader->Instance &&\r
-            CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
-              ) {\r
-          if (Conversion->SmbiosType >= 0X80) {\r
-            if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
-              break;\r
-            }\r
-          } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
-            break;\r
-          }\r
-        }\r
-\r
-      } else {\r
-        //\r
-        // Invalid conversion table entry\r
-        //\r
-        goto Done;\r
-      }\r
-    }\r
-\r
-    if (Link == &mStructureList) {\r
-\r
-      //\r
-      // Not found, create a new structure\r
-      //\r
-      StructureNode = AllocateZeroPool (sizeof (SMBIOS_STRUCTURE_NODE));\r
-\r
-      if (StructureNode == NULL) {\r
-        goto Done;\r
-      }\r
-\r
-      if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
-        //\r
-        // Fill in SubClass, Instance, SubInstance and ProducerName\r
-        //\r
-        CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
-        StructureNode->Instance     = DataHeader->Instance;\r
-        StructureNode->SubInstance  = DataHeader->SubInstance;\r
-        CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
-\r
-      } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
-        //\r
-        // Fill in at SubClass, Instance and ProducerName, mark SubInstance as Non\r
-        // Applicable\r
-        //\r
-        CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
-        StructureNode->Instance     = DataHeader->Instance;\r
-        StructureNode->SubInstance  = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
-        CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
-\r
-      }\r
-      //\r
-      // Allocate the structure instance\r
-      //\r
-      StructureNode->StructureSize = SmbiosGetTypeMinimalLength (Conversion->SmbiosType);\r
-      StructureNode->SmbiosType    = Conversion->SmbiosType;\r
-      \r
-      //\r
-      // StructureSize include the TWO trailing zero byte.\r
-      //\r
-      if (StructureNode->StructureSize < (sizeof(SMBIOS_STRUCTURE) + 2)) {\r
-        //\r
-        // Invalid Type\r
-        //\r
-        gBS->FreePool (StructureNode);\r
-        goto Done;\r
-      }\r
-\r
-      StructureNode->SmbiosType          = Conversion->SmbiosType;\r
-      StructureNode->SmbiosHandle        = 0;\r
-      Status = SmbiosProtocolCreateRecord (\r
-                 NULL, \r
-                 StructureNode\r
-                 );\r
-      if (EFI_ERROR (Status)) {\r
-        goto Done;\r
-      }\r
-      //\r
-      // Temporary cache the structrue pointer to Smbios database.\r
-      //\r
-      StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
-      \r
-      InitializeListHead (&StructureNode->LinkDataFixup);\r
-\r
-      //\r
-      // Insert the Structure Node into the Strucutre List\r
-      //\r
-      StructureNode->Signature = SMBIOS_STRUCTURE_NODE_SIGNATURE;\r
-      InsertTailList (&mStructureList, &(StructureNode->Link));\r
-\r
-      StructureCreated = TRUE;\r
-\r
-    }\r
-    \r
-    \r
-    //\r
-    // Re-calculate the structure pointer to Smbios database.\r
-    //\r
-    StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
-    \r
-    //\r
-    // Fill the Structure's field corresponding to this data record\r
-    //\r
-    if (Conversion->FieldFillingMethod == RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED) {\r
-      //\r
-      // Field data is just the record data without transforming and\r
-      // offset is specified directly in the conversion table entry\r
-      //\r
-      if (Conversion->FieldOffset + SrcDataSize > StructureNode->Structure->Length) {\r
-        //\r
-        // Invalid Conversion Table Entry\r
-        //\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-      \r
-      CopyMem ((UINT8 *) (StructureNode->Structure) + Conversion->FieldOffset, SrcData, SrcDataSize);\r
-\r
-    } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_OFFSET_SPECIFIED) {\r
-      //\r
-      // Field offfset is specified in the conversion table entry, but\r
-      // record data needs to be transformed to be filled into the field,\r
-      // so let the FieldFillingFunction do it.\r
-      //\r
-      if (Conversion->FieldFillingFunction == NULL) {\r
-        //\r
-        // Invalid Conversion Table Entry\r
-        //\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-\r
-      Status = Conversion->FieldFillingFunction (\r
-                            StructureNode,\r
-                            Conversion->FieldOffset,\r
-                            SrcData,\r
-                            (UINT32) SrcDataSize\r
-                            );\r
-      if (EFI_ERROR (Status)) {\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-    } else if (Conversion->FieldFillingMethod == BY_FUNCTION) {\r
-      //\r
-      // Both field offset and field content are determined by\r
-      // FieldFillingFunction\r
-      //\r
-      if (Conversion->FieldFillingFunction == NULL) {\r
-        //\r
-        // Invalid Conversion Table Entry\r
-        //\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-\r
-      Status = Conversion->FieldFillingFunction (\r
-                            StructureNode,\r
-                            0,\r
-                            SrcData,\r
-                            (UINT32) SrcDataSize\r
-                            );\r
-      if (EFI_ERROR (Status)) {\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-    } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_WHOLE_DATA_RECORD) {\r
-      //\r
-      // Both field offset and field content are determined by\r
-      // FieldFillingFunction and the function accepts the whole data record\r
-      // including the data header\r
-      //\r
-      if (Conversion->FieldFillingFunction == NULL) {\r
-        //\r
-        // Invalid Conversion Table Entry\r
-        //\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-\r
-      Status = Conversion->FieldFillingFunction (\r
-                            StructureNode,\r
-                            0,\r
-                            DataHeader,\r
-                            RecordHeader->RecordSize - RecordHeader->HeaderSize\r
-                            );\r
-      if (EFI_ERROR (Status)) {\r
-        if (StructureCreated) {\r
-          ReleaseStructureNode (StructureNode);\r
-        }\r
-\r
-        goto Done;\r
-      }\r
-    } else {\r
-      //\r
-      // Invalid Conversion Table Entry\r
-      //\r
-      if (StructureCreated) {\r
-        ReleaseStructureNode (StructureNode);\r
-      }\r
-\r
-      goto Done;\r
-    }\r
-  }\r
-Done:\r
-  return ;\r
-}\r
-\r
-/**\r
-  Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
-  to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
-  \r
-  @param Type  SMBIOS's type.\r
-  \r
-  @return the minimal length of a smbios record.\r
-**/\r
-UINT32\r
-SmbiosGetTypeMinimalLength (\r
-  IN UINT8  Type\r
-  )\r
-{\r
-  UINTN Index;\r
-\r
-  for (Index = 0; mTypeInfoTable[Index].MinLength != 0; Index++) {\r
-    if (mTypeInfoTable[Index].Type == Type) {\r
-      return mTypeInfoTable[Index].MinLength;\r
-    }\r
-  }\r
-\r
-  return 0;\r
-}\r
-\r
-/**\r
-  Get pointer of EFI_SMBIOS_PROTOCOL.\r
-  \r
-  @return pointer of EFI_SMBIOS_PROTOCOL.\r
-**/\r
-EFI_SMBIOS_PROTOCOL*\r
-GetSmbiosProtocol(\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  \r
-  if (mSmbiosProtocol == NULL) {\r
-    Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID*) &mSmbiosProtocol);\r
-    ASSERT_EFI_ERROR (Status);\r
-  } \r
-  \r
-  ASSERT (mSmbiosProtocol != NULL);\r
-  return mSmbiosProtocol; \r
-}  \r
-\r
-/**\r
-  Create a blank smbios record. The datahub record is only a field of smbios record.\r
-  So before fill any field from datahub's record. A blank smbios record need to be \r
-  created.\r
-  \r
-  @param ProducerHandle   The produce handle for a datahub record\r
-  @param StructureNode    Point to SMBIOS_STRUCTURE_NODE\r
-  \r
-  @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for new blank SMBIOS record.\r
-  @retval EFI_SUCCESS          Success to create blank smbios record.\r
-**/\r
-EFI_STATUS\r
-SmbiosProtocolCreateRecord (\r
-  IN      EFI_HANDLE              ProducerHandle, OPTIONAL\r
-  IN      SMBIOS_STRUCTURE_NODE   *StructureNode\r
-  )\r
-{\r
-  EFI_SMBIOS_PROTOCOL         *Smbios;\r
-  EFI_SMBIOS_TABLE_HEADER     *BlankRecord;\r
-  EFI_STATUS                  Status;\r
-  SMBIOS_STRUCTURE_NODE       *RefStructureNode;\r
-  LIST_ENTRY                  *Link;\r
-  LIST_ENTRY                  *Link1;\r
-  LIST_ENTRY                  *Link2;  \r
-  SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
-  UINT8                       *BufferPointer;\r
-  \r
-  Smbios = GetSmbiosProtocol();\r
-  ASSERT (Smbios != NULL);\r
-  \r
-  //\r
-  // Prepare a blank smbios record.\r
-  //\r
-  BlankRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (StructureNode->StructureSize);\r
-  if (BlankRecord == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  BlankRecord->Type   = StructureNode->SmbiosType;\r
-  BlankRecord->Length = (UINT8) (StructureNode->StructureSize - 2);\r
-  \r
-  //\r
-  // Add blank record into SMBIOS database.\r
-  //\r
-  Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, BlankRecord);\r
-  FreePool (BlankRecord);\r
-  \r
-  //\r
-  // Fix up the InterLink node for new added smbios record if some other\r
-  // existing smbios record want to link this new record's handle.\r
-  //\r
-  for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
-    RefStructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
-    for (Link1 = RefStructureNode->LinkDataFixup.ForwardLink; Link1 != &RefStructureNode->LinkDataFixup;) {\r
-      LinkDataFixupNode = CR (Link1, SMBIOS_LINK_DATA_FIXUP_NODE, Link, SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE);\r
-      Link2 = Link1;\r
-      Link1 = Link1->ForwardLink;\r
-            \r
-      if ((StructureNode->SmbiosType != LinkDataFixupNode->TargetType) ||\r
-          !(CompareGuid (&StructureNode->SubClass, &LinkDataFixupNode->SubClass)) ||\r
-          (StructureNode->Instance != LinkDataFixupNode->LinkData.Instance) ||\r
-          (StructureNode->SubInstance != LinkDataFixupNode->LinkData.SubInstance)) {\r
-        continue;\r
-      }\r
-      \r
-      //\r
-      // Fill the field with the handle found\r
-      //\r
-      BufferPointer         = (UINT8 *) (RefStructureNode->Structure) + LinkDataFixupNode->Offset;\r
-      *BufferPointer        = (UINT8) (StructureNode->SmbiosHandle & 0xFF);\r
-      *(BufferPointer + 1)  = (UINT8) ((StructureNode->SmbiosHandle >> 8) & 0xFF);\r
-      BufferPointer         = NULL;\r
-\r
-      RemoveEntryList (Link2);\r
-      FreePool (LinkDataFixupNode);\r
-    }\r
-  }\r
-  \r
-  return Status;\r
-}  \r
-\r
-/**\r
-  Get pointer of a SMBIOS record's buffer according to its handle.\r
-  \r
-  @param Handle         The handle of SMBIOS record want to be searched.\r
-  @param Type           The type of SMBIOS record want to be searched.\r
-  @param ProducerHandle The producer handle of SMBIOS record.\r
-  \r
-  @return EFI_SMBIOS_TABLE_HEADER Point to a SMBIOS record's buffer.\r
-**/  \r
-EFI_SMBIOS_TABLE_HEADER*\r
-GetSmbiosBufferFromHandle (\r
-  IN  EFI_SMBIOS_HANDLE  Handle,\r
-  IN  EFI_SMBIOS_TYPE    Type,\r
-  IN  EFI_HANDLE         ProducerHandle  OPTIONAL\r
-  )\r
-{\r
-  EFI_SMBIOS_PROTOCOL*    Smbios;\r
-  EFI_SMBIOS_HANDLE       SearchingHandle;\r
-  EFI_SMBIOS_TABLE_HEADER *RecordInSmbiosDatabase;\r
-  EFI_STATUS              Status;\r
-  \r
-  SearchingHandle = 0;\r
-  Smbios          = GetSmbiosProtocol();\r
-  ASSERT (Smbios != NULL);\r
-  \r
-  do {\r
-    Status = Smbios->GetNext (Smbios, &SearchingHandle, &Type, &RecordInSmbiosDatabase, NULL);\r
-  } while ((SearchingHandle != Handle) && (Status != EFI_NOT_FOUND));\r
-  \r
-  return RecordInSmbiosDatabase;\r
-}  \r
-\r
-/**\r
-\r
-  Get the full size of smbios structure including optional strings that follow the formatted structure.\r
-\r
-  @param Head                   Pointer to the beginning of smbios structure.\r
-  @param Size                   The returned size.\r
-  @param NumberOfStrings        The returned number of optional strings that follow the formatted structure.\r
-\r
-  @retval EFI_SUCCESS           Size retured in Size.\r
-  @retval EFI_INVALID_PARAMETER Input smbios structure mal-formed or Size is NULL.\r
-  \r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-GetSmbiosStructureSize (\r
-  IN   EFI_SMBIOS_TABLE_HEADER          *Head,\r
-  OUT  UINT32                           *Size,\r
-  OUT  UINT8                            *NumberOfStrings\r
-  )\r
-{\r
-  UINT32 FullSize;\r
-  UINT8  StrLen;\r
-  INT8*  CharInStr;\r
-  \r
-  if (Size == NULL || NumberOfStrings == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  FullSize = Head->Length;\r
-  CharInStr = (INT8*)Head + Head->Length;\r
-  *Size = FullSize;\r
-  *NumberOfStrings = 0;\r
-  StrLen = 0;\r
-  //\r
-  // look for the two consecutive zeros, check the string limit by the way.\r
-  //\r
-  while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
-    if (*CharInStr == 0) {\r
-      *Size += 1;\r
-      CharInStr++;\r
-    }\r
-\r
-    for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {\r
-      if (*(CharInStr+StrLen) == 0) {\r
-        break;\r
-      }  \r
-    }\r
-\r
-    if (StrLen == SMBIOS_STRING_MAX_LENGTH) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-    //\r
-    // forward the pointer\r
-    //\r
-    CharInStr += StrLen;\r
-    *Size += StrLen;\r
-    *NumberOfStrings += 1;\r
-    \r
-  }\r
-\r
-  //\r
-  // count ending two zeros.\r
-  //\r
-  *Size += 2;\r
-  return EFI_SUCCESS;  \r
-}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvLib.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvLib.c
new file mode 100644 (file)
index 0000000..fac1fb7
--- /dev/null
@@ -0,0 +1,786 @@
+/** @file\r
+  Common filling functions used in translating Datahub's record\r
+  to PI SMBIOS's record.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+  Field Filling Function for Cache SubClass record type 5&6 -- Cache SRAM type.\r
+  Offset is mandatory\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldCacheType5 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_CACHE_SRAM_TYPE_DATA SramData;\r
+  UINT32                   Temp;\r
+\r
+  SramData = *(EFI_CACHE_SRAM_TYPE_DATA*)RecordData;\r
+\r
+  //\r
+  // Swap two fields because of inconsistency between smbios and datahub specs\r
+  //\r
+  Temp                  = SramData.Asynchronous;\r
+  SramData.Asynchronous = SramData.Synchronous;\r
+  SramData.Synchronous  = Temp;\r
+  \r
+  //\r
+  // Truncate the data to word\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    (EFI_CACHE_SRAM_TYPE_DATA *) &SramData,\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Cache SubClass record type 10 -- Cache Config.\r
+  Offset is mandatory\r
+\r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldCacheType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+\r
+  UINT16  CacheConfig;\r
+\r
+  CopyMem (&CacheConfig, RecordData, 2);\r
+\r
+  if ((CacheConfig & 0x07) == 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Truncate the data to 2 bytes and make cache level zero-based.\r
+  //\r
+  CacheConfig--;\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    &CacheConfig,\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Enlarge the structure buffer of a structure node in SMBIOS database.\r
+  The function maybe lead the structure pointer for SMBIOS record changed.\r
+  \r
+  @param StructureNode The structure node whose structure buffer is to be enlarged.\r
+  @param NewLength     The new length of SMBIOS record which does not include unformat area.\r
+  @param OldBufferSize The old size of SMBIOS record buffer.\r
+  @param NewBufferSize The new size is targeted for enlarged.\r
+  \r
+  @retval EFI_OUT_OF_RESOURCES  No more memory to allocate new record\r
+  @retval EFI_SUCCESS           Success to enlarge the record buffer size.\r
+**/\r
+EFI_STATUS\r
+SmbiosEnlargeStructureBuffer (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE *StructureNode,\r
+  UINT8                         NewLength,\r
+  UINTN                         OldBufferSize,\r
+  UINTN                         NewBufferSize\r
+  )\r
+{\r
+  EFI_SMBIOS_TABLE_HEADER   *NewRecord;\r
+  EFI_SMBIOS_PROTOCOL       *Smbios;\r
+  EFI_STATUS                Status;\r
+  UINT8                     CountOfString;\r
+  \r
+  NewRecord = NULL;\r
+  Smbios    = GetSmbiosProtocol();\r
+  ASSERT (Smbios != NULL);\r
+  \r
+  NewRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (NewBufferSize);\r
+  if (NewRecord == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  CopyMem (NewRecord, StructureNode->Structure, OldBufferSize);\r
+  \r
+  \r
+  Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  //\r
+  // try to use original handle to enlarge the buffer.\r
+  //\r
+  NewRecord->Length = NewLength;\r
+  Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, NewRecord);\r
+  ASSERT_EFI_ERROR (Status);\r
+  FreePool (NewRecord);\r
+  \r
+  StructureNode->Structure = GetSmbiosBufferFromHandle (\r
+                               StructureNode->SmbiosHandle, \r
+                               StructureNode->SmbiosType, \r
+                               NULL\r
+                               );\r
+  GetSmbiosStructureSize (\r
+    StructureNode->Structure,\r
+    &StructureNode->StructureSize,\r
+    &CountOfString\r
+    );\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Fill a standard Smbios string field. \r
+  \r
+  This function will convert the unicode string to single byte chars, and only\r
+  English language is supported.\r
+  This function changes the Structure pointer value of the structure node, \r
+  which should be noted by Caller.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER   RecordDataSize is too larger\r
+  @retval EFI_OUT_OF_RESOURCES    No memory to allocate new buffer for string\r
+  @retval EFI_SUCCESS             Sucess append string for a SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldString (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  UINT16                  *Data;\r
+  CHAR8                   AsciiData[SMBIOS_STRING_MAX_LENGTH];\r
+  UINT8                   CountOfStrings;\r
+  UINTN                   OrigStringNumber;\r
+  EFI_SMBIOS_PROTOCOL     *Smbios;\r
+  EFI_SMBIOS_HANDLE       SmbiosHandle;\r
+  UINT32                  OrigStructureSize;\r
+  UINTN                   NewStructureSize;\r
+  EFI_SMBIOS_TABLE_HEADER *NewRecord;\r
+  UINT32                  StringLength;\r
+  \r
+  Status            = EFI_SUCCESS;\r
+  OrigStringNumber  = 0;\r
+  OrigStructureSize = 0;\r
+\r
+  //\r
+  // if we have a NULL token,\r
+  //\r
+  if (0 == *((STRING_REF *) RecordData)) {\r
+    *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
+    return EFI_SUCCESS;\r
+  }\r
+  \r
+  //\r
+  // Get the String from the Hii Database\r
+  //\r
+  Data = HiiGetPackageString (\r
+             &(StructureNode->ProducerName),\r
+             *((EFI_STRING_ID *) RecordData),\r
+             NULL\r
+             );\r
+  if (Data == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  StringLength = (UINT32)StrLen (Data);\r
+  //\r
+  // Count the string size including the terminating 0.\r
+  //\r
+  if (StringLength == 0) {\r
+    *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
+    FreePool (Data);\r
+    return EFI_SUCCESS;\r
+  }\r
+  \r
+  if (StringLength > SMBIOS_STRING_MAX_LENGTH) {\r
+    //\r
+    // Too long a string\r
+    //\r
+    FreePool (Data);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+    \r
+  Smbios = GetSmbiosProtocol();\r
+  ASSERT (Smbios != NULL);\r
+  \r
+  //\r
+  // Convert Unicode string to Ascii string which only supported by SMBIOS.\r
+  //\r
+  ZeroMem (AsciiData, SMBIOS_STRING_MAX_LENGTH);\r
+  UnicodeStrToAsciiStr (Data, AsciiData);\r
+  \r
+  //\r
+  // if the field at offset is already filled with some value,\r
+  // find out the string it points to\r
+  //\r
+  OrigStringNumber = *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset);\r
+  if (OrigStringNumber != 0) {\r
+    DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Update %dth string for type[%d],offset[0x%x],handle[0x%x] to [%s]\n", \r
+            OrigStringNumber, StructureNode->SmbiosType, Offset, StructureNode->SmbiosHandle, AsciiData));  \r
+    \r
+    //\r
+    // If original string number is not zero, just update string\r
+    //\r
+    Status = Smbios->UpdateString (Smbios, &StructureNode->SmbiosHandle, &OrigStringNumber, AsciiData);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Fail to update %dth string in offset 0x%x for handle:0x%x type:0x%x\n", \r
+             OrigStringNumber, Offset, StructureNode->SmbiosHandle, StructureNode->SmbiosType));\r
+      ASSERT_EFI_ERROR (Status);\r
+      return Status;\r
+    }\r
+  } else {\r
+    //\r
+    // If the string has not been filled in SMBIOS database, remove it and add again\r
+    // with string appended.\r
+    //\r
+    Status = GetSmbiosStructureSize (StructureNode->Structure, &OrigStructureSize, &CountOfStrings);\r
+    ASSERT_EFI_ERROR (Status);\r
+    \r
+    if (CountOfStrings == 0) {\r
+      NewStructureSize = OrigStructureSize + StringLength;\r
+    } else {\r
+      NewStructureSize = OrigStructureSize + StringLength + 1;\r
+    }\r
+    \r
+    NewRecord = AllocateZeroPool (NewStructureSize);\r
+    if (NewRecord == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    CopyMem (NewRecord, StructureNode->Structure, OrigStructureSize);\r
+    \r
+    //\r
+    // Copy new string into tail of original SMBIOS record buffer.\r
+    //\r
+    if (CountOfStrings == 0) {\r
+      AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 2, AsciiData);\r
+    } else {\r
+      AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 1, AsciiData);\r
+    }\r
+    DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Type(%d) offset(0x%x) StringNumber:%d\n", \r
+            StructureNode->SmbiosType, Offset, CountOfStrings + 1));\r
+    //\r
+    // Update string reference number\r
+    //\r
+    *(UINT8 *) ((UINT8 *) NewRecord + Offset) = (UINT8) (CountOfStrings + 1);\r
+    SmbiosHandle = StructureNode->SmbiosHandle;\r
+    \r
+    //\r
+    // Remove original SMBIOS record and add new one\r
+    //\r
+    Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+    ASSERT_EFI_ERROR (Status);\r
+    \r
+    //\r
+    // Add new SMBIOS record\r
+    //\r
+    Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, NewRecord);\r
+    ASSERT_EFI_ERROR (Status);\r
+    \r
+    StructureNode->SmbiosHandle = SmbiosHandle;\r
+    \r
+    FreePool (NewRecord);\r
+  }\r
+  \r
+  //\r
+  // The SMBIOS record buffer maybe re-allocated in SMBIOS database,\r
+  // so update cached buffer pointer in DataHub structure list.\r
+  //\r
+  StructureNode->Structure = GetSmbiosBufferFromHandle (\r
+                               StructureNode->SmbiosHandle, \r
+                               StructureNode->SmbiosType,\r
+                               NULL\r
+                               );\r
+  ASSERT (StructureNode->Structure != NULL);\r
+  \r
+  //\r
+  // The string update action maybe lead the record is re-allocated in SMBIOS database\r
+  // so update cached record pointer\r
+  //\r
+  Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureNode->StructureSize, &CountOfStrings);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Find a handle that matches the Link Data and the target Smbios type.\r
+  \r
+  @param  TargetType     the Smbios type\r
+  @param  SubClass       the SubClass\r
+  @param  LinkData       Specifies Instance, SubInstance and ProducerName\r
+  @param  Handle         the HandleNum found  \r
+  \r
+  @retval EFI_NOT_FOUND Can not find the record according to handle\r
+  @retval EFI_SUCCESS   Success to find the handle\r
+**/\r
+EFI_STATUS\r
+SmbiosFindHandle (\r
+  IN      UINT8               TargetType,\r
+  IN      EFI_GUID            *SubClass,\r
+  IN      EFI_INTER_LINK_DATA *LinkData,\r
+  IN OUT  UINT16              *HandleNum\r
+  )\r
+{\r
+  LIST_ENTRY        *Link;\r
+  SMBIOS_STRUCTURE_NODE *StructureNode;\r
+\r
+  StructureNode = NULL;\r
+\r
+  //\r
+  // Find out the matching handle\r
+  //\r
+  for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+    StructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
+    if (StructureNode->Structure->Type == TargetType &&\r
+        CompareGuid (&(StructureNode->SubClass), SubClass) &&\r
+        StructureNode->Instance == LinkData->Instance &&\r
+        StructureNode->SubInstance == LinkData->SubInstance\r
+        ) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Link == &mStructureList) {\r
+    return EFI_NOT_FOUND;\r
+  } else {\r
+    *HandleNum = StructureNode->Structure->Handle;\r
+    return EFI_SUCCESS;\r
+  }\r
+}\r
+\r
+/**\r
+  Fill the inter link field for a SMBIOS recorder.\r
+  \r
+  Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
+  maybe another SMBIOS record has not been added, so put the InterLink request into\r
+  a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
+  \r
+  @param StructureNode        Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
+  @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
+  @param LinkSmbiosType       The type of SMBIOS record want to be linked.\r
+  @param InterLink            Point to EFI_INTER_LINK_DATA will be put linked list.\r
+  @param SubClassGuid         The guid of subclass for linked SMBIOS record.\r
+  \r
+  @retval EFI_SUCESS  The linked record is found and no need fixup in future.\r
+  @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldInterLink (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT16                    LinkSmbiosNodeOffset,\r
+  IN      UINT8                     LinkSmbiosType,\r
+  IN      EFI_INTER_LINK_DATA       *InterLink,\r
+  IN      EFI_GUID                  *SubClassGuid\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
+  UINT16                      StructureHandle;\r
+\r
+  Status            = EFI_SUCCESS;\r
+  LinkDataFixupNode = NULL;\r
+\r
+  Status = SmbiosFindHandle (\r
+            LinkSmbiosType, // Smbios type\r
+            SubClassGuid,\r
+            InterLink,\r
+            &StructureHandle\r
+            );\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // Set the handle\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) (StructureNode->Structure) + LinkSmbiosNodeOffset,\r
+      &StructureHandle,\r
+      sizeof (EFI_SMBIOS_HANDLE)\r
+      );\r
+  } else {\r
+    //\r
+    // Hang this in the link data fixup node\r
+    //\r
+    LinkDataFixupNode = AllocateZeroPool (sizeof (SMBIOS_LINK_DATA_FIXUP_NODE));\r
+    if (LinkDataFixupNode == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    LinkDataFixupNode->Signature  = SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE;\r
+    LinkDataFixupNode->Offset     = LinkSmbiosNodeOffset;\r
+    LinkDataFixupNode->TargetType = LinkSmbiosType;\r
+    CopyMem (\r
+      &LinkDataFixupNode->SubClass,\r
+      SubClassGuid,\r
+      sizeof (EFI_GUID)\r
+      );\r
+    CopyMem (\r
+      &LinkDataFixupNode->LinkData,\r
+      InterLink,\r
+      sizeof (EFI_INTER_LINK_DATA)\r
+      );\r
+    InsertTailList (\r
+      &StructureNode->LinkDataFixup,\r
+      &(LinkDataFixupNode->Link)\r
+      );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function. Transform an EFI_EXP_BASE10_DATA to a word, with 'Mega'\r
+  as the unit.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase10ToWordWithMega (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_EXP_BASE10_DATA *Base10Data;\r
+  INT16               Value;\r
+  INT16               Exponent;\r
+\r
+  if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Base10Data  = RecordData;\r
+  Value       = Base10Data->Value;\r
+  Exponent    = Base10Data->Exponent;\r
+\r
+  Exponent -= 6;\r
+  while (Exponent != 0) {\r
+    if (Exponent > 0) {\r
+      Value = (INT16) (Value * 10);\r
+      Exponent--;\r
+    } else {\r
+      Value = (INT16) (Value / 10);\r
+      Exponent++;\r
+    }\r
+  }\r
+\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    &Value,\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 'Kilo'\r
+  as the unit. Granularity implemented for Cache Size.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase2ToWordWithKilo (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_EXP_BASE2_DATA  *Base2Data;\r
+  UINT32              Value;\r
+  UINT16              Exponent;\r
+\r
+  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Base2Data = RecordData;\r
+  Value     = Base2Data->Value;\r
+  Exponent  = Base2Data->Exponent;\r
+\r
+  Exponent -= 10;\r
+  Value <<= Exponent;\r
+  \r
+  //\r
+  // Implement cache size granularity\r
+  //\r
+  if(Value >= 0x8000) {\r
+    Value >>= 6;\r
+    Value |=  0x8000;\r
+  }\r
+  \r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    &Value,\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
+  as the unit.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase2ToByteWith64K (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_EXP_BASE2_DATA  *Base2Data;\r
+  UINT16              Value;\r
+  UINT16              Exponent;\r
+\r
+  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Base2Data = RecordData;\r
+  Value     = Base2Data->Value;\r
+  Exponent  = Base2Data->Exponent;\r
+  Exponent -= 16;\r
+  Value <<= Exponent;\r
+\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    &Value,\r
+    1\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 10exp-9\r
+  as the unit.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase10ToByteWithNano (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_EXP_BASE10_DATA *Base10Data;\r
+  INT16               Value;\r
+  INT16               Exponent;\r
+\r
+  if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Base10Data  = RecordData;\r
+  Value       = Base10Data->Value;\r
+  Exponent    = Base10Data->Exponent;\r
+\r
+  Exponent += 9;\r
+  while (Exponent != 0) {\r
+    if (Exponent > 0) {\r
+      Value = (INT16) (Value * 10);\r
+      Exponent--;\r
+    } else {\r
+      Value = (INT16) (Value / 10);\r
+      Exponent++;\r
+    }\r
+  }\r
+\r
+  * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) Value;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function: truncate record data to byte and fill in the\r
+  field as indicated by Offset.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldTruncateToByte (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  //\r
+  // Truncate the data to 8 bits\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (*(UINT8 *) RecordData);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function: truncate record data to byte and fill in the\r
+  field as indicated by Offset.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  RecordDataSize is invalid. \r
+  @retval EFI_SUCCESS            RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldTruncateToWord (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  //\r
+  // Truncate the data to 8 bits\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    RecordData,\r
+    2\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Check if OEM structure has included 2 trailing 0s in data record.\r
+  \r
+  @param RecordData       Point to record data will be checked.\r
+  @param RecordDataSize   The size of record data.\r
+  \r
+  @retval 0    2 trailing 0s exist in unformatted section\r
+  @retval 1    1 trailing 0 exists at the end of unformatted section\r
+  @retval -1   There is no 0 at the end of unformatted section\r
+**/\r
+INT8\r
+SmbiosCheckTrailingZero (\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  SMBIOS_STRUCTURE  *Smbios;\r
+  CHAR8             *Start;\r
+  CHAR8             *End;\r
+  \r
+  Smbios = (SMBIOS_STRUCTURE *) RecordData;\r
+  \r
+  //\r
+  // Skip over formatted section\r
+  //\r
+  Start = (CHAR8 *) ((UINT8 *) Smbios + Smbios->Length);\r
+  End   = (CHAR8 *) RecordData + RecordDataSize;\r
+  \r
+  //\r
+  // Unformatted section exists\r
+  //\r
+  while (Start < End - 1) {\r
+    //\r
+    // Avoid unaligned issue on IPF\r
+    //\r
+    if ((*Start == 0) && (*(Start + 1) == 0)) {\r
+      //\r
+      // 2 trailing 0s exist in unformatted section\r
+      //\r
+      return 0;\r
+    }\r
+    Start++;\r
+  }\r
+  \r
+  if (Start == End - 1) {\r
+    //\r
+    // Check if there has been already 1 trailing 0\r
+    //\r
+    if (*Start == 0) {\r
+      return 1;\r
+    } \r
+  }\r
+  \r
+  //\r
+  // There is no 0 at the end of unformatted section\r
+  //\r
+  return -1;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvTable.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ConvTable.c
new file mode 100644 (file)
index 0000000..2809748
--- /dev/null
@@ -0,0 +1,1235 @@
+/** @file\r
+  The conversion table that guides the generation of the Smbios struture list.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+///\r
+/// The minimal length includes last two zero bytes.\r
+///\r
+SMBIOS_TYPE_INFO_TABLE_ENTRY  mTypeInfoTable[] = {\r
+  //\r
+  // Type 0: Bios Information\r
+  //\r
+  {\r
+    0,\r
+    0x1a,\r
+    TRUE,\r
+    FALSE\r
+  },  // size includes wo extension bytes\r
+  //\r
+  // Type 1: System Information\r
+  //\r
+  {\r
+    1,\r
+    0x1d,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 2: Base Board Information\r
+  //\r
+  {\r
+    2,\r
+    0x12,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 3: System Enclosure or Chassis\r
+  //\r
+  {\r
+    3,\r
+    0x17, // 0x13 covers till OEM-defined, not right\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 4: Processor\r
+  //\r
+  {\r
+    4,\r
+    0x25,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 5: Memory Controller\r
+  //\r
+  {\r
+    5,\r
+    0x12,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 6: Memory\r
+  //\r
+  {\r
+    6,\r
+    0x0E,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 7: Cache\r
+  //\r
+  {\r
+    7,\r
+    0x15,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 8: Port Connector Information\r
+  //\r
+  {\r
+    8,\r
+    0x0B,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 9: System Slots\r
+  //\r
+  {\r
+    9,\r
+    0x0f,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 10: On Board Device Information\r
+  //\r
+  {\r
+    10,\r
+    0x8,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 11: OEM Strings\r
+  //\r
+  {\r
+    11, \r
+    0x7, \r
+    FALSE, \r
+    FALSE\r
+  },\r
+  //\r
+  // Type 12: System Configuration Options\r
+  //\r
+  {\r
+    12,\r
+    0x7,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 13: BIOS Language Information\r
+  //\r
+  {\r
+    13,\r
+    0x18,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 15: System Event Log\r
+  //\r
+  {\r
+    15,\r
+    0x19,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 16: Physical Memory Array\r
+  //\r
+  {\r
+    16,\r
+    0x11,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 17: Memory Device\r
+  //\r
+  {\r
+    17,\r
+    0x1d,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 18: 32 bit Memory Error Information\r
+  //\r
+  {\r
+    18,\r
+    0x19,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 19: Memory Array Mapped Address\r
+  //\r
+  {\r
+    19,\r
+    0x11,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 20: Memory Device Mapped Address\r
+  //\r
+  {\r
+    20,\r
+    0x15,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 21: Pointing Device\r
+  //\r
+  {\r
+    21,\r
+    0x9,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 22: Portable Battery\r
+  //\r
+  {\r
+    22,\r
+    0x1c,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 23: System Reset\r
+  //\r
+  {\r
+    23,\r
+    0x0f,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 24: Hardware Security\r
+  //\r
+  {\r
+    24,\r
+    0x07,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 25: System Power Controls\r
+  //\r
+  {\r
+    25,\r
+    0x0b,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 26: Voltage Probe\r
+  //\r
+  {\r
+    26,\r
+    0x18,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 27: Cooling Device\r
+  //\r
+  {\r
+    27,\r
+    0x10,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 28: Temperature Probe\r
+  //\r
+  {\r
+    28,\r
+    0x18,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 29: Electrical Current Probe\r
+  //\r
+  {\r
+    29,\r
+    0x18,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 30: Out-of-Band Remote Access\r
+  //\r
+  {\r
+    30,\r
+    0x08,\r
+    FALSE,\r
+    FALSE\r
+  },         \r
+  //\r
+  // Type 31: BIS Entry Point\r
+  //\r
+  {\r
+    31,\r
+    0x1c,\r
+    FALSE,\r
+    FALSE\r
+  },   \r
+  //\r
+  // Type 32: System Boot Information\r
+  //\r
+  {\r
+    32,\r
+    0x16,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 33: 64 bit Memory Error Information\r
+  //\r
+  {\r
+    33,\r
+    0x21,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 34: Management Device\r
+  //\r
+  {\r
+    34,\r
+    0x0d,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 36: Management Device Threshold\r
+  //\r
+  {\r
+    36,\r
+    0x12,\r
+    FALSE,\r
+    FALSE\r
+  },        \r
+  //\r
+  // Type 37: Memory Channel\r
+  //\r
+  {\r
+    37,\r
+    0x0c,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 38: IPMI device info\r
+  //\r
+  {\r
+    38,\r
+    0x12,\r
+    TRUE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 39: Power supply\r
+  //\r
+  {\r
+    39,\r
+    0x18,\r
+    FALSE,\r
+    FALSE\r
+  },  \r
+  //\r
+  // Type 0x80-0xFF: OEM type\r
+  //\r
+  {\r
+    0x80,\r
+    0x6,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Type 127: End of Table\r
+  //\r
+  {\r
+    127,\r
+    0x6,\r
+    FALSE,\r
+    FALSE\r
+  },\r
+  //\r
+  // Terminator\r
+  //\r
+  {\r
+    0,\r
+    0\r
+  }\r
+};\r
+\r
+SMBIOS_CONVERSION_TABLE_ENTRY mConversionTable[] = {\r
+\r
+  {\r
+    //\r
+    // Processor Sub Class -- Record Type 1: Frequency\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorCoreFrequencyRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x16,\r
+    SmbiosFldBase10ToWordWithMega\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 2: Bus Frequency\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorFsbFrequencyRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x12,\r
+    SmbiosFldBase10ToWordWithMega\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 3: Version\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorVersionRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x10,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 4: Manufacturor\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorManufacturerRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x7,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 5: Serial Number\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorSerialNumberRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x20,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 6: ID\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorIdRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x08,\r
+    SmbiosFldProcessorType6\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 7: Type\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorTypeRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x05,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 8: Family\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorFamilyRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x06,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 9: Voltage\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorVoltageRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x11,\r
+    SmbiosFldProcessorType9\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 14: Status\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorStatusRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x18,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 15: Socket Type\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorSocketTypeRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x19,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 16: Socket Name\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorSocketNameRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x04,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 17: Cache Associtation\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    CacheAssociationRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
+    0,\r
+    SmbiosFldProcessorType17\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor Sub Class -- Record Type 18: MaxFrequency\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorMaxCoreFrequencyRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x14,\r
+    SmbiosFldBase10ToWordWithMega\r
+  },\r
+\r
+  {\r
+    //\r
+    // Processor SubClass -- Record Type 19: Asset Tag\r
+    //\r
+    EFI_PROCESSOR_SUBCLASS_GUID,\r
+    ProcessorAssetTagRecordType,\r
+    4,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x21,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 1: Size\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheSizeRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x09,\r
+    SmbiosFldBase2ToWordWithKilo\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 2: Max Size\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    MaximumSizeCacheRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x07,\r
+    SmbiosFldBase2ToWordWithKilo\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 3: Speed\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheSpeedRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x0f,\r
+    SmbiosFldBase10ToByteWithNano\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 4: Socket\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheSocketRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x04,\r
+    SmbiosFldString\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 5: Supported SRAM type\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheSramTypeRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x0b,\r
+    SmbiosFldCacheType5  // Asynchronous and Synchronous are reversed\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 6: Installed SRAM type\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheInstalledSramTypeRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x0d,\r
+    SmbiosFldCacheType5\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 7: error correction type\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheErrorTypeRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x10,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 8: cache type\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheTypeRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x11,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 9: Associativity\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheAssociativityRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x12,\r
+    SmbiosFldTruncateToByte\r
+  },\r
+\r
+  {\r
+    //\r
+    // Cache SubClass -- Record Type 10: Cache configuration\r
+    //\r
+    EFI_CACHE_SUBCLASS_GUID,\r
+    CacheConfigRecordType,\r
+    7,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+    0x05,\r
+    SmbiosFldCacheType10\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 2: Physical Memory Array\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER,\r
+    16,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType2\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 6\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
+    6,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldSMBIOSType6\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 17\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
+    17,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType3\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 4: Memory Array Mapped Address\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER,\r
+    19,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType4\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 5: Memory Device Mapped Address\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER,\r
+    20,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType5\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 6: Memory Channel Type\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER,\r
+    37,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType6\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 7: Memory Channel Device\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER,\r
+    37,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType7\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 8: Memory Controller information\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER,\r
+    5,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType8\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 9: Memory 32 Bit Error Information\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
+    18,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType9\r
+  },\r
+\r
+  {\r
+    //\r
+    // Memory SubClass -- Record Type 10: Memory 64 Bit Error Information\r
+    //\r
+    EFI_MEMORY_SUBCLASS_GUID,\r
+    EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
+    33,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMemoryType10\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 2: Bios Information (SMBIOS Type 0)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_BIOS_VENDOR_RECORD_NUMBER, // 0,\r
+    0,                                  // smbios Type 0\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType0\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 3: System Information (SMBIOS Type 1)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER, // 1,\r
+    1,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType1\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 4: Base Board Manufacturer (SMBIOS Type 2)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER, // 2,\r
+    2,  // SMBIOS Type 2\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType2\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 5: System Enclosure or Chassis (SMBIOS Type 3)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER,  // 3,\r
+    3,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType3\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 6: Port Connector (SMBIOS Type 8)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER,  // 8,\r
+    8,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType8\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 7: System Slots (SMBIOS Type 9)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER, // 9,\r
+    9,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType9\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 8: Onboard Device (SMBIOS Type 10)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER,  // 10,\r
+    10,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType10\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc Subclass -- Record Type 9: OEM strings (SMBIOS Type 11)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_OEM_STRING_RECORD_NUMBER,  // 11,\r
+    11,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType11\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0A: System Options (SMBIOS Type 12)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER,  // 12,\r
+    12,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType12\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0B: Number of Installable Languages (SMBIOS Type 13)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER, // 13,\r
+    13,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType13\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0C: Installable Languages (SMBIOS Type 13)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER, // 13,\r
+    13,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType14\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 20: System Event Log (SMBIOS Type 15)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER, // 15,\r
+    15,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType15\r
+  },  \r
+  \r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0F: Pointing Device (SMBIOS Type 21)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER,  // 21,\r
+    21,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType21\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 10: Portable Battery (SMBIOS Type 22)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER, // 22,\r
+    22,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType22\r
+  },  \r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x11: Reset Capabilities (SMBIOS Type 23)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER,  // 23,\r
+    23,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType23\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x12: Hardware Security (SMBIOS Type 24)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER,  // 24,\r
+    24,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType24\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x13: System Power Controls (SMBIOS Type 25)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER,  // 25,\r
+    25,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType25\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x14: System Power Controls (SMBIOS Type 26)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER,  // 26,\r
+    26,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType26\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x15: Cooling Device (SMBIOS Type 27)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER,  // 27,\r
+    27,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType27\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x16: Temperature Probe (SMBIOS Type 28)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER,  // 28,\r
+    28,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType28\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x17: Electrical Current Probe (SMBIOS Type 29)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER,  // 29,\r
+    29,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType29\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x18: Temperature Probe (SMBIOS Type 30)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER,  // 30,\r
+    30,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType30\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x1A: Boot Information (SMBIOS Type 32)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER, // 32,\r
+    32,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType32\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x1B: Management Device (SMBIOS Type 34)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER, // 34,\r
+    34,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType34\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x21: Management Device Threshold (SMBIOS Type 36)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER, // 36,\r
+    36,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType36\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x1D: Boot Information (SMBIOS Type 38)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER, // 38,\r
+    38,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType38\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x1E: Power supply (SMBIOS Type 39)\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER, // 39,\r
+    39,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType39\r
+  },\r
+\r
+  {\r
+    //\r
+    // Misc SubClass -- Record Type 0x80-0xFF: OEM type\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER, // 0x80,\r
+    0x80,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscTypeOEM\r
+  },\r
+\r
+  {\r
+    //\r
+    // End-of-Table -- Record Type 127\r
+    //\r
+    EFI_MISC_SUBCLASS_GUID,\r
+    127,\r
+    127,\r
+    BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+    BY_FUNCTION,\r
+    0,\r
+    SmbiosFldMiscType127\r
+  },\r
+  //\r
+  // Table Terminator\r
+  //\r
+  {\r
+    {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}},\r
+    0,\r
+    0,\r
+    (SMBIOS_STRUCTURE_LOCATING_METHOD) 0,\r
+    (SMBIOS_FIELD_FILLING_METHOD) 0,\r
+    0,\r
+    0\r
+  }\r
+};\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c
new file mode 100644 (file)
index 0000000..9200738
--- /dev/null
@@ -0,0 +1,1089 @@
+/** @file\r
+  Routines that support Memory SubClass data records translation.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 2 -- Physical Memory\r
+  Array.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType2 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                            Status;\r
+  EFI_MEMORY_ARRAY_LOCATION_DATA        *PhyMemArray;\r
+  FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA  *FrameworkPhyMemArray;\r
+  UINT32                                MemoryCapacity;\r
+  UINT16                                NumberMemoryDevices;\r
+  UINT16                                Test16;\r
+\r
+  Status      = EFI_SUCCESS;\r
+  PhyMemArray = (EFI_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
+  FrameworkPhyMemArray = (FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
+\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Location))  = (UINT8) (PhyMemArray->MemoryArrayLocation);\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Use))  = (UINT8) (PhyMemArray->MemoryArrayUse);\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorCorrection))  = (UINT8) (PhyMemArray->MemoryErrorCorrection);\r
+\r
+  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+    MemoryCapacity = (UINT32) (((UINTN) PhyMemArray->MaximumMemoryCapacity.Value) << PhyMemArray->MaximumMemoryCapacity.Exponent);\r
+    NumberMemoryDevices = PhyMemArray->NumberMemoryDevices;\r
+  } else {\r
+    //\r
+    // Support EDk/Framework defined Data strucutre.\r
+    //\r
+    MemoryCapacity      = FrameworkPhyMemArray->MaximumMemoryCapacity;\r
+    NumberMemoryDevices = FrameworkPhyMemArray->NumberMemoryDevices;\r
+  }\r
+\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE16, MaximumCapacity),\r
+    &MemoryCapacity,\r
+    4\r
+    );\r
+\r
+  Test16 = 0xfffe;\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorInformationHandle),\r
+    &Test16,\r
+    2\r
+    );\r
+  \r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, NumberOfMemoryDevices),\r
+    &NumberMemoryDevices,\r
+    2\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 3 -\r
+  - Memory Device: SMBIOS Type 17\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType3 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_ARRAY_LINK_DATA       *MemDevice;\r
+  FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
+  UINT64                           MemoryDeviceSize;\r
+  BOOLEAN                          MemoryDeviceSizeUnitMega;\r
+  UINT16                           MemoryDeviceSpeed;\r
+  UINT16                           MemoryDeviceExponent;\r
+  UINT16                           Test16;\r
+\r
+  MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+  FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+  MemoryDeviceSpeed  = 0;\r
+  MemoryDeviceExponent = 0;\r
+\r
+  //\r
+  // Memory Device Locator\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceLocator),\r
+    &(MemDevice->MemoryDeviceLocator),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Bank Locator\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, BankLocator),\r
+    &(MemDevice->MemoryBankLocator),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Manufacturer\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, Manufacturer),\r
+    &(MemDevice->MemoryManufacturer),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Serial Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, SerialNumber),\r
+    &(MemDevice->MemorySerialNumber),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Asset Tag\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, AssetTag),\r
+    &(MemDevice->MemoryAssetTag),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Part Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE17, PartNumber),\r
+    &(MemDevice->MemoryPartNumber),\r
+    sizeof (STRING_REF)\r
+    );\r
+\r
+  //\r
+  // Memory Array Link\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryArrayHandle),\r
+    16, // SMBIOS type 16\r
+    &MemDevice->MemoryArrayLink,\r
+    &gEfiMemorySubClassGuid\r
+    );\r
+\r
+  //\r
+  // Set Memory Error Information Handle to Not supported\r
+  //\r
+  Test16 = 0xfffe;\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryErrorInformationHandle),\r
+    &Test16,\r
+    sizeof (EFI_SMBIOS_HANDLE)\r
+    ); \r
+     \r
+  //\r
+  // Total width\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TotalWidth),\r
+    &MemDevice->MemoryTotalWidth,\r
+    2\r
+    );\r
+\r
+  //\r
+  // Data Width\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DataWidth),\r
+    &MemDevice->MemoryDataWidth,\r
+    2\r
+    );\r
+\r
+  //\r
+  // Device Size\r
+  //\r
+  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+    //\r
+    // Form Factor\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
+      &MemDevice->MemoryFormFactor,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Device Set\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
+      &MemDevice->MemoryDeviceSet,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Type\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
+      &MemDevice->MemoryType,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Type Detail\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
+      &MemDevice->MemoryTypeDetail,\r
+      2\r
+      );\r
+  \r
+    //\r
+    // Speed\r
+    //\r
+    MemoryDeviceSpeed    = MemDevice->MemorySpeed.Value;\r
+    MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
+    while (MemoryDeviceExponent-- > 0) {\r
+      MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
+    }\r
+\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
+      &MemoryDeviceSpeed,\r
+      2\r
+      );\r
+\r
+    MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
+  } else {\r
+    //\r
+    // Form Factor\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
+      &FrameworkMemDevice->MemoryFormFactor,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Device Set\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
+      &FrameworkMemDevice->MemoryDeviceSet,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Type\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
+      &FrameworkMemDevice->MemoryType,\r
+      1\r
+      );\r
+  \r
+    //\r
+    // Type Detail\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
+      &FrameworkMemDevice->MemoryTypeDetail,\r
+      2\r
+      );\r
+  \r
+    //\r
+    // Speed\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
+      &FrameworkMemDevice->MemorySpeed,\r
+      2\r
+      );\r
+\r
+    MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
+  }\r
+\r
+  MemoryDeviceSizeUnitMega  = FALSE;\r
+  MemoryDeviceSize          = RShiftU64 (MemoryDeviceSize, 10);\r
+  //\r
+  // kilo as unit\r
+  //\r
+  if (MemoryDeviceSize > 0xffff) {\r
+    MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
+    //\r
+    // Mega as unit\r
+    //\r
+    MemoryDeviceSizeUnitMega = TRUE;\r
+  }\r
+\r
+  MemoryDeviceSize = MemoryDeviceSize & 0x7fff;\r
+  if (MemoryDeviceSize != 0 && !MemoryDeviceSizeUnitMega) {\r
+    MemoryDeviceSize |= 0x8000;\r
+  }\r
+\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Size),\r
+    &MemoryDeviceSize,\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 3 -\r
+  - Memory Device: SMBIOS Type 6\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldSMBIOSType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_ARRAY_LINK_DATA       *MemDevice;\r
+  UINT64                           MemoryDeviceSize;\r
+  UINT8                            MemSize;\r
+  UINT16                           MemType;\r
+  UINT8                            MemSpeed;\r
+  FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
+  UINT16                           MemoryDeviceSpeed;\r
+  UINT16                           MemoryDeviceExponent;\r
+\r
+  MemDevice            = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+  FrameworkMemDevice   = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+  MemoryDeviceExponent = 0;\r
+\r
+  //\r
+  // Memory Device Locator\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE6, SocketDesignation),\r
+    &(MemDevice->MemoryDeviceLocator),\r
+    2\r
+    );\r
+  \r
+  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+    MemoryDeviceSpeed    = MemDevice->MemorySpeed.Value;\r
+    MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
+    while (MemoryDeviceExponent-- > 0) {\r
+      MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
+    }\r
+    MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
+  } else {\r
+    //\r
+    // Support EDk/Framework defined Data strucutre.\r
+    //\r
+    MemoryDeviceSpeed = FrameworkMemDevice->MemorySpeed;\r
+    MemoryDeviceSize  = FrameworkMemDevice->MemoryDeviceSize;\r
+  }\r
+  \r
+  if (MemoryDeviceSpeed == 0) {\r
+    MemSpeed = 0;\r
+  } else {\r
+    //\r
+    // Memory speed is in ns unit\r
+    //\r
+    MemSpeed = (UINT8)(1000 / MemoryDeviceSpeed);\r
+  }\r
+\r
+  CopyMem (\r
+   (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentSpeed),\r
+   &MemSpeed,\r
+   1\r
+  );\r
+\r
+\r
+  //\r
+  // Device Size\r
+  //\r
+  MemSize = 0;\r
+  if (MemoryDeviceSize == 0) {\r
+    MemSize = 0x7F;\r
+  } else {\r
+    MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 21);\r
+    while (MemoryDeviceSize != 0) {\r
+      MemSize++;\r
+      MemoryDeviceSize = RShiftU64(MemoryDeviceSize,1);\r
+    }\r
+  }\r
+\r
+  CopyMem (\r
+    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, InstalledSize),\r
+    &MemSize,\r
+    1\r
+    );\r
+\r
+  CopyMem (\r
+    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, EnabledSize),\r
+    &MemSize,\r
+    1\r
+    );\r
+\r
+  //\r
+  // According SMBIOS SPEC Type 6 definition\r
+  //\r
+  MemType = 0;\r
+  if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+    if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
+        MemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
+      MemType |= 1<<8;\r
+    }\r
+    \r
+    if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
+      MemType |= 1<<7;\r
+    }\r
+    \r
+    if (MemDevice->MemoryType == EfiMemoryTypeSdram) {\r
+      MemType |= 1<<10;\r
+    }\r
+    \r
+    if (MemDevice->MemoryTypeDetail.Edo == 1) {\r
+      MemType |= 1<<4;\r
+    }\r
+    \r
+    if (MemDevice->MemoryTypeDetail.FastPaged == 1) {\r
+      MemType |= 1<<3;\r
+    }\r
+  } else {\r
+    //\r
+    // Support EDk/Framework defined Data strucutre.\r
+    //\r
+    if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
+        FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
+      MemType |= 1<<8;\r
+    }\r
+    \r
+    if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
+      MemType |= 1<<7;\r
+    }\r
+    \r
+    if (FrameworkMemDevice->MemoryType == EfiMemoryTypeSdram) {\r
+      MemType |= 1<<10;\r
+    }\r
+    \r
+    if (FrameworkMemDevice->MemoryTypeDetail.Edo == 1) {\r
+      MemType |= 1<<4;\r
+    }\r
+    \r
+    if (FrameworkMemDevice->MemoryTypeDetail.FastPaged == 1) {\r
+      MemType |= 1<<3;\r
+    }\r
+  }\r
+  //\r
+  // Form Factor\r
+  //\r
+  CopyMem (\r
+    (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentMemoryType),\r
+    &MemType,\r
+    2\r
+    );\r
+\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 4\r
+  -- Memory Array Mapped Address: SMBIOS Type 19\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType4 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_ARRAY_START_ADDRESS_DATA  *Masa;\r
+  EFI_PHYSICAL_ADDRESS                 TempData;\r
+\r
+  Masa = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) RecordData;\r
+\r
+  //\r
+  // Starting Address\r
+  //\r
+  TempData = RShiftU64 (Masa->MemoryArrayStartAddress, 10);\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, StartingAddress),\r
+    &TempData,\r
+    4\r
+    );\r
+\r
+  //\r
+  // Ending Address\r
+  //\r
+  TempData = RShiftU64 (Masa->MemoryArrayEndAddress, 10);\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, EndingAddress),\r
+    &TempData,\r
+    4\r
+    );\r
+\r
+  //\r
+  // Partition Width\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, PartitionWidth),\r
+    &Masa->MemoryArrayPartitionWidth,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Physical Memory Array Link\r
+  //\r
+  return SmbiosFldInterLink (\r
+          StructureNode,\r
+          (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE19, MemoryArrayHandle),\r
+          16, // SMBIOS type 16\r
+          &Masa->PhysicalMemoryArrayLink,\r
+          &gEfiMemorySubClassGuid\r
+          );\r
+\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 5\r
+  -- Memory Device Mapped Address: SMBIOS Type 20\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType5 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_DEVICE_START_ADDRESS_DATA *Mdsa;\r
+  EFI_PHYSICAL_ADDRESS                 TempData;\r
+\r
+  Mdsa = (EFI_MEMORY_DEVICE_START_ADDRESS_DATA *) RecordData;\r
+\r
+  //\r
+  // Starting Address\r
+  //\r
+  TempData = RShiftU64 (Mdsa->MemoryDeviceStartAddress, 10);\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, StartingAddress),\r
+    &TempData,\r
+    4\r
+    );\r
+\r
+  //\r
+  // Ending Address\r
+  //\r
+  TempData = RShiftU64 (Mdsa->MemoryDeviceEndAddress, 10);\r
+  CopyMem (\r
+    (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, EndingAddress),\r
+    &TempData,\r
+    4\r
+    );\r
+\r
+  //\r
+  // Memory Device Link\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryDeviceHandle),\r
+    17, // SMBIOS type 17\r
+    &Mdsa->PhysicalMemoryDeviceLink,\r
+    &gEfiMemorySubClassGuid\r
+    );\r
+\r
+  //\r
+  // Memory Array Mapped Address Link\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryArrayMappedAddressHandle),\r
+    19, // SMBIOS type 19\r
+    &Mdsa->PhysicalMemoryArrayLink,\r
+    &gEfiMemorySubClassGuid\r
+    );\r
+\r
+  //\r
+  // Memory Device Partition Row Position\r
+  //\r
+  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, PartitionRowPosition)) = (UINT8) Mdsa->MemoryDevicePartitionRowPosition;\r
+\r
+  //\r
+  // Memory Device Interleave Position\r
+  //\r
+  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavePosition)) = (UINT8) Mdsa->MemoryDeviceInterleavePosition;\r
+\r
+  //\r
+  // Memory Device Interleave Data Depth\r
+  //\r
+  *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavedDataDepth)) = (UINT8) Mdsa->MemoryDeviceInterleaveDataDepth;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 6\r
+  -- Memory Channel Type: SMBIOS Type 37\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_CHANNEL_TYPE_DATA  *McTa;\r
+  EFI_STATUS                    Status;\r
+\r
+  McTa  = (EFI_MEMORY_CHANNEL_TYPE_DATA *) RecordData;\r
+\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, ChannelType))  = (UINT8) (McTa->MemoryChannelType);\r
+\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MaximumChannelLoad))  = (UINT8) (McTa->MemoryChannelMaximumLoad);\r
+\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDeviceCount))  = (UINT8) (McTa->MemoryChannelDeviceCount);\r
+\r
+  //\r
+  // Update the length field\r
+  // Multiple device loads are filled through SmbiosFldMemoryType7\r
+  //\r
+  StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
+                                       sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount);\r
+  Status = SmbiosEnlargeStructureBuffer(\r
+             StructureNode, \r
+             StructureNode->Structure->Length,\r
+             StructureNode->StructureSize,\r
+             StructureNode->StructureSize + sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount\r
+             );\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 7\r
+  -- Memory Channel Device: SMBIOS Type 37\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType7 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_CHANNEL_DEVICE_DATA  *Mcdd;\r
+  UINTN                           DeviceLoadOffset;\r
+  UINTN                           DeviceLoadHandleOffset;\r
+\r
+  Mcdd = (EFI_MEMORY_CHANNEL_DEVICE_DATA *) RecordData;\r
+\r
+  if (Mcdd->DeviceId < 1) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  DeviceLoadOffset        = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[0]) + 3 * (Mcdd->DeviceId - 1);\r
+  DeviceLoadHandleOffset  = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[1]) + 3 * (Mcdd->DeviceId - 1);\r
+\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + DeviceLoadOffset) = (UINT8) (Mcdd->MemoryChannelDeviceLoad);\r
+\r
+  //\r
+  // Memory Device Handle Link\r
+  //\r
+  return SmbiosFldInterLink (\r
+          StructureNode,\r
+          (UINT16) DeviceLoadHandleOffset,\r
+          17, // Smbios type 17 -- Physical Memory Device\r
+          &Mcdd->DeviceLink,\r
+          &gEfiMemorySubClassGuid\r
+          );\r
+\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type 8\r
+  -- Memory Controller information: SMBIOS Type 5\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType8 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_CONTROLLER_INFORMATION_DATA *MemoryController;\r
+  UINT32                                 NewMinimalSize;\r
+  UINT16                                 Count;\r
+  EFI_INTER_LINK_DATA                    *Link; \r
+  EFI_STATUS                             Status;\r
+  \r
+  NewMinimalSize   = 0;\r
+\r
+  //\r
+  // There is an update from EFI_MEMORY_CONTROLLER_INFORMATION to\r
+  // EFI_MEMORY_CONTROLLER_INFORMATION_DATA. Multiple MemoryModuleConfig\r
+  // handles are filled.\r
+  //\r
+  MemoryController = (EFI_MEMORY_CONTROLLER_INFORMATION_DATA *)RecordData;\r
+  \r
+  //\r
+  // ErrorDetectingMethod\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrDetectMethod),\r
+    &MemoryController->ErrorDetectingMethod,\r
+    1\r
+    );  \r
+\r
+  //\r
+  // ErrorCorrectingCapability\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrCorrectCapability),\r
+    &MemoryController->ErrorCorrectingCapability,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // MemorySupportedInterleave\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportInterleave),\r
+    &MemoryController->MemorySupportedInterleave,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // MemoryCurrentInterleave\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, CurrentInterleave),\r
+    &MemoryController->MemoryCurrentInterleave,\r
+    1\r
+    );  \r
+    \r
+  //\r
+  // MaxMemoryModuleSize\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MaxMemoryModuleSize),\r
+    &MemoryController->MaxMemoryModuleSize,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // MemorySpeedType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportSpeed),\r
+    &MemoryController->MemorySpeedType,\r
+    2\r
+    );                             \r
+\r
+  //\r
+  // MemorySupportedType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportMemoryType),\r
+    &MemoryController->MemorySupportedType,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // MemoryModuleVoltage\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleVoltage),\r
+    &MemoryController->MemoryModuleVoltage,\r
+    1\r
+    ); \r
+\r
+  //\r
+  // NumberofMemorySlot\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, AssociatedMemorySlotNum),\r
+    &MemoryController->NumberofMemorySlot,\r
+    1\r
+    ); \r
+  \r
+  if (MemoryController->NumberofMemorySlot == 0) {\r
+    //\r
+    // EnabledCorrectingCapability\r
+    //\r
+    CopyMem (\r
+      (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles),\r
+      &MemoryController->EnabledCorrectingCapability,\r
+      1\r
+      );     \r
+  } else {\r
+    //\r
+    // Memory module configuration handles exist\r
+    // we should enlarge smbios entry buffer from minimal size\r
+    //\r
+    NewMinimalSize = (MemoryController->NumberofMemorySlot) * sizeof(UINT16) + StructureNode->StructureSize;\r
+    StructureNode->Structure->Length = (UINT8) (NewMinimalSize - 2);\r
+    Status = SmbiosEnlargeStructureBuffer (StructureNode, StructureNode->Structure->Length, StructureNode->StructureSize, NewMinimalSize);\r
+    ASSERT_EFI_ERROR (Status);\r
+    \r
+    //\r
+    // MemoryModuleConfigHandles\r
+    //\r
+    for (Count = 0, Link = MemoryController->MemoryModuleConfig; \r
+         Count < MemoryController->NumberofMemorySlot; \r
+         Count++, Link++) {\r
+      SmbiosFldInterLink (\r
+        StructureNode,\r
+        (UINT16) (OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + Count * sizeof(UINT16)),\r
+        6, // SMBIOS type 6\r
+        Link,\r
+        &gEfiMemorySubClassGuid\r
+        );\r
+    }\r
+         \r
+    //\r
+    // EnabledCorrectingCapability\r
+    //  \r
+    CopyMem (\r
+      (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + (MemoryController->NumberofMemorySlot) * sizeof(UINT16),\r
+      &MemoryController->EnabledCorrectingCapability,\r
+      1\r
+      );\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type \r
+  -- Memory 32 Bit Error Information: SMBIOS Type 18\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_32BIT_ERROR_INFORMATION *MemoryInfo;\r
+  \r
+  MemoryInfo = (EFI_MEMORY_32BIT_ERROR_INFORMATION *)RecordData;\r
+  \r
+  //\r
+  // MemoryErrorType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorType),\r
+    &MemoryInfo->MemoryErrorType,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // MemoryErrorGranularity\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorGranularity),\r
+    &MemoryInfo->MemoryErrorGranularity,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // MemoryErrorOperation\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorOperation),\r
+    &MemoryInfo->MemoryErrorOperation,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // VendorSyndrome\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, VendorSyndrome),\r
+    &MemoryInfo->VendorSyndrome,\r
+    4\r
+    );    \r
+\r
+  //\r
+  // MemoryArrayErrorAddress\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, MemoryArrayErrorAddress),\r
+    &MemoryInfo->MemoryArrayErrorAddress,\r
+    4\r
+    ); \r
+\r
+  //\r
+  // DeviceErrorAddress\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, DeviceErrorAddress),\r
+    &MemoryInfo->DeviceErrorAddress,\r
+    4\r
+    ); \r
+\r
+  //\r
+  // DeviceErrorResolution\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorResolution),\r
+    &MemoryInfo->DeviceErrorResolution,\r
+    4\r
+    ); \r
+    \r
+  return EFI_SUCCESS;    \r
+}\r
+\r
+/**\r
+  Field Filling Function for Memory SubClass record type \r
+  -- Memory 64 Bit Error Information: SMBIOS Type 33\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MEMORY_64BIT_ERROR_INFORMATION *MemoryInfo;\r
+  \r
+  MemoryInfo = (EFI_MEMORY_64BIT_ERROR_INFORMATION *)RecordData;\r
+  \r
+  //\r
+  // MemoryErrorType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorType),\r
+    &MemoryInfo->MemoryErrorType,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // MemoryErrorGranularity\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorGranularity),\r
+    &MemoryInfo->MemoryErrorGranularity,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // MemoryErrorOperation\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorOperation),\r
+    &MemoryInfo->MemoryErrorOperation,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // VendorSyndrome\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, VendorSyndrome),\r
+    &MemoryInfo->VendorSyndrome,\r
+    4\r
+    );    \r
+\r
+  //\r
+  // MemoryArrayErrorAddress\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, MemoryArrayErrorAddress),\r
+    &MemoryInfo->MemoryArrayErrorAddress,\r
+    8\r
+    ); \r
+\r
+  //\r
+  // DeviceErrorAddress\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, DeviceErrorAddress),\r
+    &MemoryInfo->DeviceErrorAddress,\r
+    8\r
+    ); \r
+\r
+  //\r
+  // DeviceErrorResolution\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorResolution),\r
+    &MemoryInfo->DeviceErrorResolution,\r
+    4\r
+    ); \r
+    \r
+  return EFI_SUCCESS;    \r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MiscConv.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MiscConv.c
new file mode 100644 (file)
index 0000000..3ffbbe5
--- /dev/null
@@ -0,0 +1,2444 @@
+/** @file\r
+  Routines that support Misc SubClass data records translation.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 0 -- Bios Information.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType0 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_MISC_BIOS_VENDOR_DATA  *BiosInfo;\r
+\r
+  Status    = EFI_SUCCESS;\r
+  BiosInfo  = NULL;\r
+\r
+  BiosInfo  = (EFI_MISC_BIOS_VENDOR_DATA *) RecordData;\r
+\r
+  //\r
+  // Bios Vendor\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE0, Vendor),\r
+    &(BiosInfo->BiosVendor),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Bios Version\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosVersion),\r
+    &(BiosInfo->BiosVersion),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Bios Release Date\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosReleaseDate),\r
+    &(BiosInfo->BiosReleaseDate),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Bios Starting Address Segment\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSegment),\r
+    &BiosInfo->BiosStartingAddress,\r
+    2\r
+    );\r
+\r
+  //\r
+  // Bios Physical device size\r
+  //\r
+  SmbiosFldBase2ToByteWith64K (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize),\r
+    &BiosInfo->BiosPhysicalDeviceSize,\r
+    sizeof (EFI_EXP_BASE2_DATA)\r
+    );\r
+  (*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize)))--;\r
+\r
+  //\r
+  // Bios Characteristics\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics),\r
+    &BiosInfo->BiosCharacteristics1,\r
+    4\r
+    );\r
+  \r
+  //\r
+  // Bios Characteristics higher four bytes\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics) + 4,\r
+    &BiosInfo->BiosCharacteristics2,\r
+    4\r
+    ); \r
+\r
+  //\r
+  // Bios Characteristics Extension1/2\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BIOSCharacteristicsExtensionBytes),\r
+    (UINT8 *) &BiosInfo->BiosCharacteristics1 + 4,\r
+    2\r
+    );\r
+\r
+  //\r
+  // System BIOS Major Release\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMajorRelease),\r
+    (UINT8 *) &BiosInfo->BiosMajorRelease,\r
+    1\r
+    );\r
+\r
+  //\r
+  // System BIOS Minor Release\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMinorRelease),\r
+    (UINT8 *) &BiosInfo->BiosMinorRelease,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Embedded Controller Firmware Major Release\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMajorRelease),\r
+    (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMajorRelease,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Embedded Controller Firmware Minor Release\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMinorRelease),\r
+    (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMinorRelease,\r
+    1\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 1 -- System Information.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType1 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EFI_MISC_SYSTEM_MANUFACTURER_DATA  *SystemInfo;\r
+\r
+  Status      = EFI_SUCCESS;\r
+  SystemInfo  = NULL;\r
+\r
+  SystemInfo  = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) RecordData;\r
+\r
+  //\r
+  // System Manufacturer\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, Manufacturer),\r
+    &(SystemInfo->SystemManufacturer),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // System Product Name\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, ProductName),\r
+    &(SystemInfo->SystemProductName),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // System Version\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, Version),\r
+    &(SystemInfo->SystemVersion),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // System Serial Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, SerialNumber),\r
+    &(SystemInfo->SystemSerialNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Uuid\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, Uuid),\r
+    &SystemInfo->SystemUuid,\r
+    16\r
+    );\r
+\r
+  //\r
+  // Wakeup Type\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, WakeUpType),\r
+    &SystemInfo->SystemWakeupType,\r
+    1\r
+    );\r
+\r
+  //\r
+  // System SKU Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, SKUNumber),\r
+    &(SystemInfo->SystemSKUNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // System Family\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE1, Family),\r
+    &(SystemInfo->SystemFamily),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for record type 2 -- Base Board Manufacture.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType2 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                             Status;\r
+  EFI_MISC_BASE_BOARD_MANUFACTURER_DATA  *Bbm;\r
+  Status  = EFI_SUCCESS;\r
+  Bbm     = (EFI_MISC_BASE_BOARD_MANUFACTURER_DATA *) RecordData;\r
+\r
+  //\r
+  // Manufacturer\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, Manufacturer),\r
+    &(Bbm->BaseBoardManufacturer),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Product\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, ProductName),\r
+    &(Bbm->BaseBoardProductName),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Version\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, Version),\r
+    &(Bbm->BaseBoardVersion),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Serial Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, SerialNumber),\r
+    &(Bbm->BaseBoardSerialNumber),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Asset Tag\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, AssetTag),\r
+    &(Bbm->BaseBoardAssetTag),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Location in Chassis\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE2, LocationInChassis),\r
+    &(Bbm->BaseBoardChassisLocation),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Feature Flags\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, FeatureFlag),\r
+    &Bbm->BaseBoardFeatureFlags,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Board Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, BoardType)) = (UINT8) Bbm->BaseBoardType;\r
+\r
+  //\r
+  // Chassis Handle\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE2, ChassisHandle),\r
+    3,  // SMBIOS type 3 - System Enclosure or Chassis\r
+    &Bbm->BaseBoardChassisLink,\r
+    &gEfiMiscSubClassGuid\r
+    );\r
+\r
+  //\r
+  // Number of Contained Object Handles\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, NumberOfContainedObjectHandles)) = (UINT8) Bbm->BaseBoardNumberLinks;\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 3 -\r
+  - System Enclosure or Chassis.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType3 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EFI_MISC_CHASSIS_MANUFACTURER_DATA *Ec;\r
+  EFI_MISC_ELEMENTS                  *Element;\r
+  UINT16                             Index;\r
+  UINT8                              ContainedElementType;\r
+  Status  = EFI_SUCCESS;\r
+  Ec      = (EFI_MISC_CHASSIS_MANUFACTURER_DATA *) RecordData;\r
+\r
+  //\r
+  // Chassis Type\r
+  //\r
+  *(UINT8*)((UINT8 *) (StructureNode->Structure) + \r
+            OFFSET_OF (SMBIOS_TABLE_TYPE3, Type)) \r
+            = (UINT8) (Ec->ChassisType.ChassisType | Ec->ChassisType.ChassisLockPresent << 7);\r
+\r
+\r
+  //\r
+  // Chassis Bootup State\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, BootupState),\r
+    &Ec->ChassisBootupState,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Chassis Power Supply State\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, PowerSupplyState),\r
+    &Ec->ChassisPowerSupplyState,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Chassis Thermal State\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, ThermalState),\r
+    &Ec->ChassisThermalState,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Chassis Security State\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, SecurityStatus),\r
+    &Ec->ChassisSecurityState,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Chassis Oem Defined\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, OemDefined),\r
+    &Ec->ChassisOemDefined,\r
+    4\r
+    );\r
+\r
+  //\r
+  // Chassis Height\r
+  //\r
+  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+            OFFSET_OF (SMBIOS_TABLE_TYPE3, Height)) \r
+            = (UINT8)Ec->ChassisHeight;\r
+\r
+  //\r
+  // Chassis Number Power Cords\r
+  //\r
+  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+            OFFSET_OF (SMBIOS_TABLE_TYPE3, NumberofPowerCords)) \r
+            = (UINT8)Ec->ChassisNumberPowerCords;\r
+  \r
+  //\r
+  // Chassis Element Count\r
+  //\r
+  *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+            OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementCount)) \r
+            = (UINT8)Ec->ChassisElementCount;\r
+\r
+  if( Ec->ChassisElementCount ) {\r
+    //\r
+    // Element Record Length\r
+    // Current solution covers first 3 bytes; user can extend to meet its requirements.\r
+    //\r
+    *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+              OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementRecordLength)) \r
+              = (UINT8)sizeof(CONTAINED_ELEMENT);\r
+\r
+    //\r
+    // Update the structure's length and StructureSize\r
+    //\r
+    StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
+                                               Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT));\r
+    Status = SmbiosEnlargeStructureBuffer (\r
+               StructureNode,\r
+               StructureNode->Structure->Length,\r
+               StructureNode->StructureSize,\r
+               StructureNode->StructureSize + Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT)\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+    \r
+    //\r
+    // Contained Elements\r
+    //\r
+    for (Index=0, Element = &Ec->ChassisElements; \r
+         Index < Ec->ChassisElementCount; \r
+         Index += 1, Element ++) {\r
+\r
+      //\r
+      // ContainedElementType\r
+      //\r
+      ContainedElementType = (UINT8)((Element->ChassisElementType.RecordType == 1)\r
+                                      ? (UINT8)(Element->ChassisElementType.RecordType << 7 | Element->ChassisElementType.Type)\r
+                                      : (UINT8)(Element->ChassisBaseBoard));\r
+      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+                Index * sizeof(CONTAINED_ELEMENT) + \r
+                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementType)) \r
+                = ContainedElementType;\r
+\r
+      //\r
+      // ContainedElementMinimum\r
+      //\r
+      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+                Index * sizeof(CONTAINED_ELEMENT) + \r
+                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMinimum))\r
+                = (UINT8)Element->ChassisElementMinimum;\r
+\r
+      //\r
+      // ContainedElementMaximum\r
+      //\r
+      *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+                OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+                Index * sizeof(CONTAINED_ELEMENT) + \r
+                OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMaximum)) \r
+                = (UINT8)Element->ChassisElementMaximum;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Move the filling of following four String fields after Contained Elements \r
+  // because they would break SMBIOS table.\r
+  // Chassis Manufacturer\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE3, Manufacturer),\r
+    &(Ec->ChassisManufacturer),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Chassis Version\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE3, Version),\r
+    &(Ec->ChassisVersion),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Chassis Serial Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE3, SerialNumber),\r
+    &(Ec->ChassisSerialNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Chassis Asset Tag\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE3, AssetTag),\r
+    &(Ec->ChassisAssetTag),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+  \r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 8 -- Port Connector.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType8 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                                       Status;\r
+  EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *Picd;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Picd    = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData;\r
+\r
+  //\r
+  // Internal Connector Designator\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalReferenceDesignator),\r
+    &(Picd->PortInternalConnectorDesignator),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Internal Connector Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalConnectorType)) = (UINT8) Picd->PortInternalConnectorType;\r
+\r
+  //\r
+  // External Connector Designator\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalReferenceDesignator),\r
+    &(Picd->PortExternalConnectorDesignator),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Internal Connector Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalConnectorType)) = (UINT8) Picd->PortExternalConnectorType;\r
+\r
+  //\r
+  // Internal Connector Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, PortType)) = (UINT8) Picd->PortType;\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 9 -- System slot.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                             Status;\r
+  EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA  *Slot;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Slot    = (EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA *) RecordData;\r
+\r
+  //\r
+  // Slot Designation\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDesignation),\r
+    &(Slot->SlotDesignation),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Slot Type\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotType),\r
+    &Slot->SlotType,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Slot Data Bus Width\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDataBusWidth),\r
+    &Slot->SlotDataBusWidth,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Slot Usage\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, CurrentUsage),\r
+    &Slot->SlotUsage,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Slot Length\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotLength),\r
+    &Slot->SlotLength,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Slot Id\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotID),\r
+    &Slot->SlotId,\r
+    2\r
+    );\r
+\r
+  //\r
+  // Slot Characteristics\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotCharacteristics1),\r
+    &Slot->SlotCharacteristics,\r
+    2\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 10 - Onboard Device.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  EFI_MISC_ONBOARD_DEVICE_DATA *OnboardDevice;\r
+  UINTN                        NumberOfDevices;\r
+  UINTN                        Index;\r
+  UINT8                        StatusAndType;\r
+\r
+  Status          = EFI_SUCCESS;\r
+  OnboardDevice   = (EFI_MISC_ONBOARD_DEVICE_DATA *) RecordData;\r
+\r
+  NumberOfDevices = (StructureNode->Structure->Length - 4) / 2;\r
+  for (Index = 0; Index < NumberOfDevices; Index += 1) {\r
+    //\r
+    // OnBoard Device Description\r
+    //\r
+    SmbiosFldString (\r
+      StructureNode,\r
+      (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + 1 + (2 * Index)),\r
+      &(OnboardDevice->OnBoardDeviceDescription),\r
+      2 // 64 * sizeof(CHAR16)\r
+      );\r
+\r
+    //\r
+    // Status & Type: Bit 7    Devicen Status, Bits 6:0 Type of Device\r
+    //\r
+    StatusAndType = (UINT8) OnboardDevice->OnBoardDeviceStatus.DeviceType;\r
+    if (OnboardDevice->OnBoardDeviceStatus.DeviceEnabled != 0) {\r
+      StatusAndType |= 0x80;\r
+    } else {\r
+      StatusAndType &= 0x7F;\r
+    }\r
+\r
+    * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + (2 * Index))) = StatusAndType;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 11 - OEM Strings.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType11 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_OEM_STRING_DATA *OemString;\r
+\r
+  OemString = (EFI_MISC_OEM_STRING_DATA *)RecordData;\r
+  //\r
+  // OEM String data\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE11, StringCount),\r
+    &(OemString->OemStringRef[0]),\r
+    2\r
+    );\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 12 - System Options.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType12 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EFI_MISC_SYSTEM_OPTION_STRING_DATA *Sos;\r
+  UINTN                              NumberOfInstallableLanguages;\r
+  UINTN                              Index;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Sos     = (EFI_MISC_SYSTEM_OPTION_STRING_DATA *) RecordData;\r
+\r
+  //\r
+  // As MiscDataHub spec defines,\r
+  // NumberOfInstallableLanguages should retrieve from Type 13.\r
+  //\r
+  NumberOfInstallableLanguages = (StructureNode->Structure->Length - 4);\r
+  for (Index = 0; Index < NumberOfInstallableLanguages; Index += 1) {\r
+    //\r
+    // OnBoard Device Description\r
+    //\r
+    SmbiosFldString (\r
+      StructureNode,\r
+      (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE12, StringCount) + (Index)),\r
+      &(Sos->SystemOptionStringRef[Index]),\r
+      2\r
+      );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 13 - BIOS Language.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType13 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA  *InstallableLanguage;\r
+\r
+  InstallableLanguage = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA *) RecordData;\r
+\r
+  //\r
+  // Number Of Installable Languages\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, InstallableLanguages)) = (UINT8) (InstallableLanguage->NumberOfInstallableLanguages);\r
+\r
+  //\r
+  // Language Flags\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, Flags),\r
+    &InstallableLanguage->LanguageFlags,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Current Language Number\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+    &(InstallableLanguage->CurrentLanguageNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 14 - System Language String\r
+  Current solution assumes that EFI_MISC_SYSTEM_LANGUAGE_STRINGs are logged with\r
+  their LanguageId having ascending orders.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType14 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  UINT16                           CurrentLanguageNumber;\r
+  EFI_MISC_SYSTEM_LANGUAGE_STRING  *LanguageString;\r
+  \r
+  LanguageString = (EFI_MISC_SYSTEM_LANGUAGE_STRING *) RecordData;\r
+\r
+  //\r
+  // Backup CurrentLanguage\r
+  //\r
+  CopyMem (\r
+    &CurrentLanguageNumber,\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Clear the field so that SmbiosFldString can be reused\r
+  //\r
+  *(UINT8 *)((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages)) = 0;\r
+  \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+    &(LanguageString->SystemLanguageString),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // Restore CurrentLanguage\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+    &CurrentLanguageNumber,\r
+    1\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 15 -- System Event Log.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType15 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  EFI_MISC_SYSTEM_EVENT_LOG_DATA  *SystemEventLog;\r
+\r
+  Status          = EFI_SUCCESS;\r
+  SystemEventLog  = NULL;\r
+\r
+  SystemEventLog  = (EFI_MISC_SYSTEM_EVENT_LOG_DATA *) RecordData;\r
+\r
+  //\r
+  // Log Area Length\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogAreaLength),\r
+    &(SystemEventLog->LogAreaLength),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Log Header Start Offset\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderStartOffset),\r
+    &(SystemEventLog->LogHeaderStartOffset),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Log Data Start Offset\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogDataStartOffset),\r
+    &(SystemEventLog->LogDataStartOffset),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Access Method\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethod),\r
+    &(SystemEventLog->AccessMethod),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Log Status\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogStatus),\r
+    &(SystemEventLog->LogStatus),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Log Change Token\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogChangeToken),\r
+    &(SystemEventLog->LogChangeToken),\r
+    4\r
+    );\r
+\r
+  //\r
+  // Access Method Address\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethodAddress),\r
+    &(SystemEventLog->AccessMethodAddress),\r
+    4\r
+    );\r
+\r
+  //\r
+  // Log Header Format\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderFormat),\r
+    &(SystemEventLog->LogHeaderFormat),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Number of Supported Log Type Descriptors\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, NumberOfSupportedLogTypeDescriptors),\r
+    &(SystemEventLog->NumberOfSupportedLogType),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Length of each Log Type Descriptor\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LengthOfLogTypeDescriptor),\r
+    &(SystemEventLog->LengthOfLogDescriptor),\r
+    1\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 21 - Pointing Device.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType21 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_POINTING_DEVICE_TYPE_DATA *PointingDeviceData;\r
+\r
+  PointingDeviceData = (EFI_MISC_POINTING_DEVICE_TYPE_DATA *) RecordData;\r
+\r
+  //\r
+  // Pointing Device Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Type)) = (UINT8) (PointingDeviceData->PointingDeviceType);\r
+\r
+  //\r
+  // Pointing Device Interface\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Interface)) = (UINT8) (PointingDeviceData->PointingDeviceInterface);\r
+\r
+  //\r
+  // Number Pointing Device Buttons\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, NumberOfButtons)) = (UINT8) (PointingDeviceData->NumberPointingDeviceButtons);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 22 - Portable Battery.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_PORTABLE_BATTERY *PortableBattery;\r
+  STRING_REF                Chemistry;\r
+  PortableBattery = (EFI_MISC_PORTABLE_BATTERY *)RecordData;\r
+  \r
+  //\r
+  // Location\r
+  // \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, Location),\r
+    &(PortableBattery->Location),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+  \r
+  //\r
+  // Manufacturer\r
+  // \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, Manufacturer),\r
+    &(PortableBattery->Manufacturer),\r
+    2 \r
+    );  \r
+\r
+  //\r
+  // ManufactureDate\r
+  // \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, ManufactureDate),\r
+    &(PortableBattery->ManufactureDate),\r
+    2 \r
+    );    \r
+\r
+  //\r
+  // SerialNumber\r
+  // \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, SerialNumber),\r
+    &(PortableBattery->SerialNumber),\r
+    2 \r
+    );\r
+\r
+  //\r
+  // DeviceName\r
+  // \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceName),\r
+    &(PortableBattery->DeviceName),\r
+    2 \r
+  );   \r
+  \r
+  //\r
+  // DeviceChemistry\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceChemistry),\r
+    &PortableBattery->DeviceChemistry,\r
+    1\r
+    );\r
+\r
+  //\r
+  // DesignCapacity\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceCapacity),\r
+    &PortableBattery->DesignCapacity,\r
+    2\r
+    );\r
+    \r
+  //\r
+  // DesignVoltage\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignVoltage),\r
+    &PortableBattery->DesignVoltage,\r
+    2\r
+    );    \r
\r
+  //\r
+  // SBDSVersionNumber\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSVersionNumber),\r
+    &(PortableBattery->SBDSVersionNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+\r
+  //\r
+  // MaximumError\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, MaximumErrorInBatteryData),\r
+    &PortableBattery->MaximumError,\r
+    1\r
+    ); \r
+    \r
+  //\r
+  // SBDSSerialNumber\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSSerialNumber),\r
+    &PortableBattery->SBDSSerialNumber,\r
+    2\r
+    );      \r
+\r
+  //\r
+  // SBDSManufactureDate\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSManufactureDate),\r
+    &PortableBattery->SBDSManufactureDate,\r
+    2\r
+    );\r
+\r
+  //\r
+  // Avoid alignment issue on IPF\r
+  //\r
+  CopyMem (\r
+    &Chemistry, \r
+    &PortableBattery->SBDSDeviceChemistry,\r
+    2\r
+    );\r
+\r
+  //\r
+  // SBDSDeviceChemistry\r
+  //    \r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSDeviceChemistry),\r
+    &Chemistry,\r
+    2 // 64 * sizeof(CHAR16)\r
+    ); \r
+    \r
+  //\r
+  // DesignCapacityMultiplier\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignCapacityMultiplier),\r
+    &PortableBattery->DesignCapacityMultiplier,\r
+    1\r
+    );             \r
\r
+  //\r
+  // OEMSpecific\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, OEMSpecific),\r
+    &PortableBattery->OEMSpecific,\r
+    4\r
+    );\r
+    \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 23 - System Reset.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType23 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_RESET_CAPABILITIES_DATA  *SystemResetData;\r
+\r
+  SystemResetData = (EFI_MISC_RESET_CAPABILITIES_DATA *) RecordData;\r
+\r
+  //\r
+  // Reset Capabilities\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Capabilities),\r
+    &(SystemResetData->ResetCapabilities),\r
+    1\r
+    );\r
+\r
+  //\r
+  // Reset Count\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetCount),\r
+    &(SystemResetData->ResetCount),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Reset Limit\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetLimit),\r
+    &(SystemResetData->ResetLimit),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Reset Timer Interval\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, TimerInterval),\r
+    &(SystemResetData->ResetTimerInterval),\r
+    2\r
+    );\r
+\r
+  //\r
+  // Reset Timeout\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Timeout),\r
+    &(SystemResetData->ResetTimeout),\r
+    2\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 24 - Hardware Security.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType24 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *HardwareSecurity;\r
+  \r
+  HardwareSecurity = (EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *)RecordData;\r
+  \r
+  //\r
+  // Hardware Security Settings\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE24, HardwareSecuritySettings),\r
+    &HardwareSecurity->HardwareSecuritySettings,\r
+    1\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 25 - System Power Controls.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType25 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_SCHEDULED_POWER_ON_MONTH *PowerOnMonth;\r
+  \r
+  PowerOnMonth = (EFI_MISC_SCHEDULED_POWER_ON_MONTH *)RecordData;\r
+  \r
+  //\r
+  // ScheduledPoweronMonth\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMonth),\r
+    &PowerOnMonth->ScheduledPoweronMonth,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // ScheduledPoweronDayOfMonth\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnDayOfMonth),\r
+    &PowerOnMonth->ScheduledPoweronDayOfMonth,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // ScheduledPoweronHour\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnHour),\r
+    &PowerOnMonth->ScheduledPoweronHour,\r
+    1\r
+    );   \r
+\r
+  //\r
+  // ScheduledPoweronMinute\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMinute),\r
+    &PowerOnMonth->ScheduledPoweronMinute,\r
+    1\r
+    );   \r
+\r
+  //\r
+  // ScheduledPoweronSecond\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnSecond),\r
+    &PowerOnMonth->ScheduledPoweronSecond,\r
+    1\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 26 - Voltage Probe.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType26 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *VoltageProbe;\r
+  \r
+  VoltageProbe = (EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *)RecordData;\r
+  \r
+  //\r
+  // VoltageProbe Description\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE26, Description),\r
+    &(VoltageProbe->VoltageProbeDescription),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );  \r
+    \r
+  //\r
+  // VoltageProbeLocation\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, LocationAndStatus),\r
+    &VoltageProbe->VoltageProbeLocation,\r
+    1\r
+    );    \r
+    \r
+  //\r
+  // VoltageProbeMaximumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MaximumValue),\r
+    &VoltageProbe->VoltageProbeMaximumValue,\r
+    2\r
+    );    \r
+    \r
+  //\r
+  // VoltageProbeMinimumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MinimumValue),\r
+    &VoltageProbe->VoltageProbeMinimumValue,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // VoltageProbeResolution\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Resolution),\r
+    &VoltageProbe->VoltageProbeResolution,\r
+    2\r
+    );    \r
+\r
+  //\r
+  // VoltageProbeTolerance\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Tolerance),\r
+    &VoltageProbe->VoltageProbeTolerance,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // VoltageProbeAccuracy\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Accuracy),\r
+    &VoltageProbe->VoltageProbeAccuracy,\r
+    2\r
+    );  \r
+    \r
+  //\r
+  // VoltageProbeNominalValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, NominalValue),\r
+    &VoltageProbe->VoltageProbeNominalValue,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // VoltageProbeOemDefined\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, OEMDefined),\r
+    &VoltageProbe->VoltageProbeOemDefined,\r
+    4\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 27 - Cooling Device.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType27 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_COOLING_DEVICE_TEMP_LINK *CoolingDevice;\r
+  \r
+  CoolingDevice = (EFI_MISC_COOLING_DEVICE_TEMP_LINK *)RecordData;\r
+  \r
+  //\r
+  // Device Type\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, DeviceTypeAndStatus),\r
+    &CoolingDevice->CoolingDeviceType,\r
+    1\r
+    );\r
+  \r
+  //\r
+  // Temperature Probe\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE27, TemperatureProbeHandle),\r
+    28,  // SMBIOS type 28 - Temperature Probe\r
+    &CoolingDevice->CoolingDeviceTemperatureLink,\r
+    &gEfiMiscSubClassGuid\r
+    );\r
+  \r
+  //\r
+  // CoolingDeviceUnitGroup\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, CoolingUnitGroup),\r
+    &CoolingDevice->CoolingDeviceUnitGroup,\r
+    1\r
+    );\r
+\r
+  //\r
+  // CoolingDeviceUnitGroup\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, OEMDefined),\r
+    &CoolingDevice->CoolingDeviceOemDefined,\r
+    4\r
+    );\r
+\r
+  //\r
+  // CoolingDeviceNominalSpeed\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, NominalSpeed),\r
+    &CoolingDevice->CoolingDeviceNominalSpeed,\r
+    2\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 28 -- Temperature Probe.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType28 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *TemperatureProbe;\r
+  \r
+  TemperatureProbe = (EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *)RecordData;\r
+  \r
+  //\r
+  // TemperatureProbeDescription\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE28, Description),\r
+    &(TemperatureProbe->TemperatureProbeDescription),\r
+    2\r
+    );\r
+    \r
+  //\r
+  // TemperatureProbeLocation\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, LocationAndStatus),\r
+    &TemperatureProbe->TemperatureProbeLocation,\r
+    1\r
+    ); \r
+    \r
+  //\r
+  // TemperatureProbeMaximumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MaximumValue),\r
+    &TemperatureProbe->TemperatureProbeMaximumValue,\r
+    2\r
+    );        \r
+\r
+  //\r
+  // TemperatureProbeMinimumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MinimumValue),\r
+    &TemperatureProbe->TemperatureProbeMinimumValue,\r
+    2\r
+    );  \r
+\r
+  //\r
+  // TemperatureProbeResolution\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Resolution),\r
+    &TemperatureProbe->TemperatureProbeResolution,\r
+    2\r
+    );  \r
+  \r
+\r
+  //\r
+  // TemperatureProbeTolerance\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Tolerance),\r
+    &TemperatureProbe->TemperatureProbeTolerance,\r
+    2\r
+    );  \r
+\r
+  //\r
+  // TemperatureProbeAccuracy\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Accuracy),\r
+    &TemperatureProbe->TemperatureProbeAccuracy,\r
+    2\r
+    );\r
+\r
+  //\r
+  // TemperatureProbeNominalValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, NominalValue),\r
+    &TemperatureProbe->TemperatureProbeNominalValue,\r
+    2\r
+    );\r
+\r
+  //\r
+  // TemperatureProbeOemDefined\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, OEMDefined),\r
+    &TemperatureProbe->TemperatureProbeOemDefined,\r
+    4\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}  \r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 29 -- Electrical Current Probe.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType29 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *ElectricalProbe;\r
+  \r
+  ElectricalProbe = (EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *)RecordData;\r
+  \r
+  //\r
+  // ElectricalCurrentProbeDescription\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE29, Description),\r
+    &(ElectricalProbe->ElectricalCurrentProbeDescription),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );\r
+    \r
+  //\r
+  // ElectricalCurrentProbeLocation\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, LocationAndStatus),\r
+    &ElectricalProbe->ElectricalCurrentProbeLocation,\r
+    1\r
+    );\r
+    \r
+  //\r
+  // ElectricalCurrentProbeMaximumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MaximumValue),\r
+    &ElectricalProbe->ElectricalCurrentProbeMaximumValue,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // ElectricalCurrentProbeMinimumValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MinimumValue),\r
+    &ElectricalProbe->ElectricalCurrentProbeMinimumValue,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // ElectricalCurrentProbeResolution\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Resolution),\r
+    &ElectricalProbe->ElectricalCurrentProbeResolution,\r
+    2\r
+    );     \r
+\r
+  //\r
+  // ElectricalCurrentProbeTolerance\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Tolerance),\r
+    &ElectricalProbe->ElectricalCurrentProbeTolerance,\r
+    2\r
+    );     \r
+\r
+  //\r
+  // ElectricalCurrentProbeAccuracy\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Accuracy),\r
+    &ElectricalProbe->ElectricalCurrentProbeAccuracy,\r
+    2\r
+    );   \r
+  //\r
+  // ElectricalCurrentProbeNominalValue\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, NominalValue),\r
+    &ElectricalProbe->ElectricalCurrentProbeNominalValue,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // ElectricalCurrentProbeOemDefined\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, OEMDefined),\r
+    &ElectricalProbe->ElectricalCurrentProbeOemDefined,\r
+    4\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 30 -- Out-of-Band Remote Access.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType30 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *RemoteData;\r
+  \r
+  RemoteData = (EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *)RecordData;\r
+  \r
+  //\r
+  // ManufacturerNameDescription\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE30, ManufacturerName),\r
+    &(RemoteData->RemoteAccessManufacturerNameDescription),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );  \r
+    \r
+  //\r
+  // RemoteAccessConnections\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE30, Connections),\r
+    &RemoteData->RemoteAccessConnections,\r
+    1\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 32 -- System Boot Information.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType32 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                             Status;\r
+  EFI_MISC_BOOT_INFORMATION_STATUS_DATA  *BootInfo;\r
+\r
+  Status    = EFI_SUCCESS;\r
+  BootInfo  = (EFI_MISC_BOOT_INFORMATION_STATUS_DATA *) RecordData;\r
+\r
+  //\r
+  // Set reserved bytes\r
+  //\r
+  ZeroMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, Reserved), 6);\r
+\r
+  //\r
+  // Set BootInformation Status\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus),\r
+    &BootInfo->BootInformationStatus,\r
+    1\r
+    );\r
+\r
+  //\r
+  // Set Additional Data\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus) + 1,\r
+    &BootInfo->BootInformationData,\r
+    9\r
+    );\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 34 -- Management Device.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType34 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *ManagementDevice;\r
+  \r
+  ManagementDevice = (EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *)RecordData;\r
+  \r
+  //\r
+  // ManagementDeviceDescription\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE34, Description),\r
+    &(ManagementDevice->ManagementDeviceDescription),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );  \r
+    \r
+  //\r
+  // ManagementDeviceType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Type),\r
+    &ManagementDevice->ManagementDeviceType,\r
+    1\r
+    );    \r
+\r
+  //\r
+  // ManagementDeviceAddress\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Address),\r
+    &ManagementDevice->ManagementDeviceAddress,\r
+    4\r
+    );    \r
+\r
+  //\r
+  // ManagementDeviceAddressType\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, AddressType),\r
+    &ManagementDevice->ManagementDeviceAddressType,\r
+    1\r
+    );  \r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 36 -- Management Device Threshold.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType36 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *DeviceThreshold;\r
+  \r
+  DeviceThreshold = (EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *)RecordData;\r
+\r
+  //\r
+  // LowerThresNonCritical\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonCritical),\r
+    &DeviceThreshold->LowerThresNonCritical,\r
+    2\r
+    );    \r
+\r
+  //\r
+  // UpperThresNonCritical\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonCritical),\r
+    &DeviceThreshold->UpperThresNonCritical,\r
+    2\r
+    );\r
+    \r
+  //\r
+  // LowerThresCritical\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdCritical),\r
+    &DeviceThreshold->LowerThresCritical,\r
+    2\r
+    );          \r
+\r
+  //\r
+  // UpperThresCritical\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdCritical),\r
+    &DeviceThreshold->UpperThresCritical,\r
+    2\r
+    );   \r
+\r
+  //\r
+  // LowerThresNonRecover\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonRecoverable),\r
+    &DeviceThreshold->LowerThresNonRecover,\r
+    2\r
+    );\r
+\r
+  //\r
+  // UpperThresNonRecover\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonRecoverable),\r
+    &DeviceThreshold->UpperThresNonRecover,\r
+    2\r
+    );          \r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 38 -- IPMI device info.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_IPMI_INTERFACE_TYPE_DATA  *IpmiInfo;\r
+\r
+  IpmiInfo  = (EFI_MISC_IPMI_INTERFACE_TYPE_DATA *) RecordData;\r
+\r
+  //\r
+  // Interface Type\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, InterfaceType)) = (UINT8) (IpmiInfo->IpmiInterfaceType);\r
+\r
+  //\r
+  // IPMI specification revision\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, IPMISpecificationRevision)) = \r
+  (UINT8) ((IpmiInfo->IpmiSpecificationRevision.IpmiSpecLeastSignificantDigit) + \\r
+           (IpmiInfo->IpmiSpecificationRevision.IpmiSpecMostSignificantDigit << 4));\r
+\r
+  //\r
+  // I2C slave address\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, I2CSlaveAddress)) = (UINT8) (IpmiInfo->IpmiI2CSlaveAddress);\r
+\r
+  //\r
+  // NV storage device address\r
+  //\r
+  *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, NVStorageDeviceAddress)) = (UINT8) (IpmiInfo->IpmiNvDeviceAddress);\r
+\r
+  //\r
+  // Base address\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, BaseAddress),\r
+    &IpmiInfo->IpmiBaseAddress,\r
+    8\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 39 -- Power supply.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType39 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_MISC_SYSTEM_POWER_SUPPLY *PowerSupply;\r
+  \r
+  PowerSupply = (EFI_MISC_SYSTEM_POWER_SUPPLY *)RecordData;\r
+  \r
+  //\r
+  // PowerUnitGroup\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerUnitGroup),\r
+    &PowerSupply->PowerUnitGroup,\r
+    1\r
+    );  \r
+    \r
+  //\r
+  // PowerSupplyLocation\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, Location),\r
+    &(PowerSupply->PowerSupplyLocation),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );    \r
+\r
+  //\r
+  // PowerSupplyDeviceName\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, DeviceName),\r
+    &(PowerSupply->PowerSupplyDeviceName),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );   \r
+\r
+  //\r
+  // PowerSupplyManufacturer\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, Manufacturer),\r
+    &(PowerSupply->PowerSupplyManufacturer),\r
+    2 // 64 * sizeof(CHAR16)\r
+    ); \r
+\r
+  //\r
+  // PowerSupplySerialNumber\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, SerialNumber),\r
+    &(PowerSupply->PowerSupplySerialNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );  \r
+    \r
+  //\r
+  // PowerSupplyAssetTagNumber\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, AssetTagNumber),\r
+    &(PowerSupply->PowerSupplyAssetTagNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );      \r
+\r
+  //\r
+  // PowerSupplyModelPartNumber\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, ModelPartNumber),\r
+    &(PowerSupply->PowerSupplyModelPartNumber),\r
+    2 // 64 * sizeof(CHAR16)\r
+    ); \r
+    \r
+  //\r
+  // PowerSupplyRevisionLevel\r
+  //\r
+  SmbiosFldString (\r
+    StructureNode,\r
+    OFFSET_OF (SMBIOS_TABLE_TYPE39, RevisionLevel),\r
+    &(PowerSupply->PowerSupplyRevisionLevel),\r
+    2 // 64 * sizeof(CHAR16)\r
+    );      \r
+\r
+  //\r
+  // PowerSupplyMaxPowerCapacity\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, MaxPowerCapacity),\r
+    &PowerSupply->PowerSupplyMaxPowerCapacity,\r
+    2\r
+    );\r
+\r
+  //\r
+  // PowerSupplyCharacteristics\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerSupplyCharacteristics),\r
+    &PowerSupply->PowerSupplyCharacteristics,\r
+    2\r
+    );\r
+    \r
+  //\r
+  // PowerSupplyInputVoltageProbeLink\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputVoltageProbeHandle),\r
+    26,  // SMBIOS type 26 - Voltage Probe\r
+    &PowerSupply->PowerSupplyInputVoltageProbeLink,\r
+    &gEfiMiscSubClassGuid\r
+    );    \r
+\r
+  //\r
+  // PowerSupplyCoolingDeviceLink\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, CoolingDeviceHandle),\r
+    27,  // SMBIOS type 27 - Cooling Device\r
+    &PowerSupply->PowerSupplyCoolingDeviceLink,\r
+    &gEfiMiscSubClassGuid\r
+    );   \r
+\r
+  //\r
+  // PowerSupplyInputCurrentProbeLink\r
+  //\r
+  SmbiosFldInterLink (\r
+    StructureNode,\r
+    (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputCurrentProbeHandle),\r
+    29,  // SMBIOS type 29 - Electrical Current Probe\r
+    &PowerSupply->PowerSupplyInputCurrentProbeLink,\r
+    &gEfiMiscSubClassGuid\r
+    );  \r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 0x80-0xFF -- OEM.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscTypeOEM (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_STATUS                            Status;\r
+  UINT8                                 *NewRecordData;\r
+  UINT32                                IncrementDataSize;\r
+  UINT16                                Handle;\r
+  INT8                                  Result;\r
+  UINT32                                StructureSize;\r
+  UINT8                                 CountOfString;\r
+  \r
+  Status             = EFI_SUCCESS;\r
+  NewRecordData      = NULL;\r
+\r
+  //\r
+  // Check if OEM structure has included 2 trailing 0s in data record, if not, \r
+  // we append them at the end to ensure OEM structure is always correct with 2 trailing 0s.\r
+  //\r
+  Result = SmbiosCheckTrailingZero (RecordData, RecordDataSize);\r
+  \r
+  if (Result != 0) {\r
+    DEBUG ((EFI_D_ERROR, "OEM SMBIOS type %x is not valid!!\n", ((SMBIOS_STRUCTURE *) RecordData) -> Type));\r
+    if (Result == -1) {\r
+      //\r
+      // No 2 trailing 0s exist\r
+      //\r
+      DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has NO 2 trailing 0s!!\n"));\r
+      IncrementDataSize = 2;\r
+    } else {\r
+      //\r
+      // Only 1 trailing 0 exist at the end\r
+      //\r
+      DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has only 1 trailing 0!!\n"));\r
+      IncrementDataSize = 1;\r
+    }\r
+    NewRecordData = AllocateZeroPool (RecordDataSize + IncrementDataSize);\r
+    ASSERT (NewRecordData != NULL);\r
+    CopyMem (NewRecordData, RecordData, RecordDataSize);\r
+    RecordData = NewRecordData;\r
+    RecordDataSize += IncrementDataSize;\r
+  }\r
+  \r
+  Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureSize, &CountOfString);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  if (StructureSize < RecordDataSize) {\r
+    Status = SmbiosEnlargeStructureBuffer (\r
+               StructureNode,\r
+               ((EFI_SMBIOS_TABLE_HEADER *)RecordData)->Length,\r
+               StructureSize,\r
+               RecordDataSize\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+  \r
+  //\r
+  // Copy the entire data (including the Smbios structure header),\r
+  // but preserve the handle that is already allocated.\r
+  //\r
+  Handle = StructureNode->Structure->Handle;\r
+  CopyMem (\r
+    StructureNode->Structure,\r
+    RecordData,\r
+    RecordDataSize\r
+    );\r
+  StructureNode->Structure->Handle = Handle;\r
+  StructureNode->StructureSize = RecordDataSize;\r
+  \r
+  if (NewRecordData != NULL) {\r
+    FreePool (NewRecordData);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Misc SubClass record type 127 - End-of-Table.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType127 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/PiSmbiosRecordOnDataHubSmbiosRecordThunk.inf b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/PiSmbiosRecordOnDataHubSmbiosRecordThunk.inf
new file mode 100644 (file)
index 0000000..782d64a
--- /dev/null
@@ -0,0 +1,75 @@
+#/** @file\r
+#  This thunk driver register a filter for DataHub protocol, once a data hub record\r
+#  is added via EFI_DATA_HUB_PROTOCOL->LogData(), this filter will be invoked to \r
+#  translate the datahub's record to SMBIOS record.\r
+#\r
+#  Copyright (c) 2009, Intel Corporation\r
+#\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
+#  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
+#\r
+#**/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = Datahub2SmbiosThunk\r
+  FILE_GUID                      = 9F8B12CF-E796-408f-9D59-3ACDDC0AFBE3\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  EDK_RELEASE_VERSION            = 0x00020000\r
+  EFI_SPECIFICATION_VERSION      = 0x00020000\r
+\r
+  ENTRY_POINT                    = ThunkEntry\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources.common]\r
+  Thunk.c\r
+  Thunk.h\r
+  Translate.c\r
+  ConvLib.c\r
+  ConvTable.c\r
+  ProcessorConv.c\r
+  MemoryConv.c\r
+  MiscConv.c\r
+  \r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
+  \r
+  \r
+[LibraryClasses]\r
+  UefiBootServicesTableLib\r
+  MemoryAllocationLib\r
+  UefiDriverEntryPoint\r
+  BaseMemoryLib\r
+  HiiLib\r
+  DebugLib\r
+  BaseLib\r
+  PcdLib\r
+\r
+[Protocols]\r
+  gEfiDataHubProtocolGuid     ## CONSUMES\r
+  gEfiSmbiosProtocolGuid      ## CONSUMES\r
+\r
+[Guids]  \r
+  gEfiMemorySubClassGuid      ## CONSUMES\r
+  gEfiMiscSubClassGuid        ## CONSUMES\r
+  gEfiCacheSubClassGuid       ## CONSUMES\r
+  \r
+[FeaturePcd]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport\r
+    \r
+[Depex]\r
+  gEfiDataHubProtocolGuid AND gEfiSmbiosProtocolGuid
\ No newline at end of file
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ProcessorConv.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/ProcessorConv.c
new file mode 100644 (file)
index 0000000..5bd3207
--- /dev/null
@@ -0,0 +1,164 @@
+/** @file\r
+  Routines that support Processor SubClass data records translation.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+  Field Filling Function for Processor SubClass record type 17 -- Cache association.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType17 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
+  EFI_INTER_LINK_DATA       *LinkData;\r
+  UINT16                    FieldOffset;\r
+  UINT8                     *Pointer;\r
+\r
+  DataHeader  = (EFI_SUBCLASS_TYPE1_HEADER *) RecordData;\r
+  LinkData    = (EFI_INTER_LINK_DATA *) (DataHeader + 1);\r
+  if (RecordDataSize != sizeof (EFI_INTER_LINK_DATA) + sizeof (EFI_SUBCLASS_TYPE1_HEADER)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Determine the cache level\r
+  //\r
+  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
+  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle), 2, 0xFF);\r
+  }\r
+\r
+  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
+  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle), 2, 0xFF);\r
+  }\r
+\r
+  Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
+  if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+    SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle), 2, 0xFF);\r
+  }\r
+\r
+  if (LinkData->SubInstance == 1) {\r
+    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
+  } else if (LinkData->SubInstance == 2) {\r
+    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
+  } else if (LinkData->SubInstance == 3) {\r
+    FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
+  } else {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  return SmbiosFldInterLink (\r
+          StructureNode,\r
+          FieldOffset,\r
+          7,                  // Smbios type 7 -- Cache Information\r
+          LinkData,\r
+          &gEfiCacheSubClassGuid // gProcessorSubClassName\r
+          );\r
+}\r
+\r
+/**\r
+  Field Filling Function for Processor SubClass record type 6 -- ProcessorID.\r
+  Offset is mandatory.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_PROCESSOR_ID_DATA *ProcessorIdData;\r
+\r
+  ProcessorIdData = RecordData;\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset,\r
+    &(ProcessorIdData->Signature),\r
+    4\r
+    );\r
+\r
+  CopyMem (\r
+    (UINT8 *) (StructureNode->Structure) + Offset + 4,\r
+    &(ProcessorIdData->FeatureFlags),\r
+    4\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Field Filling Function for Processor SubClass record type 9 -- Voltage.\r
+  Offset is mandatory.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+{\r
+  EFI_EXP_BASE10_DATA *Base10Data;\r
+  INT16               Value;\r
+  INT16               Exponent;\r
+\r
+  if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Base10Data  = RecordData;\r
+  Value       = Base10Data->Value;\r
+  Exponent    = Base10Data->Exponent;\r
+\r
+  Exponent += 1;\r
+  while (Exponent != 0) {\r
+    if (Exponent > 0) {\r
+      Value = (INT16) (Value * 10);\r
+      Exponent--;\r
+    } else {\r
+      Value = (INT16) (Value / 10);\r
+      Exponent++;\r
+    }\r
+  }\r
+\r
+  * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (Value | BIT7);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.c
new file mode 100644 (file)
index 0000000..797f803
--- /dev/null
@@ -0,0 +1,160 @@
+/** @file\r
+  Thunk driver's entry that install filter for DataRecord.\r
+  \r
+Copyright (c) 2009 Intel Corporation. <BR>\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+//\r
+// Global variables\r
+//\r
+LIST_ENTRY  mStructureList;\r
+\r
+/**\r
+  Entry Point of thunk driver.\r
+\r
+  @param[in] ImageHandle  Image handle of this driver.\r
+  @param[in] SystemTable  Pointer to EFI system table.\r
+\r
+  @retval EFI_SUCCESS          The event handlers were registered.\r
+  @retval EFI_DEVICE_ERROR     Failed to register the event handlers\r
+**/  \r
+EFI_STATUS\r
+EFIAPI\r
+ThunkEntry (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_DATA_HUB_PROTOCOL *DataHub;\r
+  EFI_EVENT             FilterEvent;\r
+    \r
+  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**) &DataHub);\r
+  ASSERT_EFI_ERROR (Status);\r
+  ASSERT (DataHub != NULL);\r
+\r
+  InitializeListHead (&mStructureList);\r
+\r
+  //\r
+  // Register SmBios Data Filter Function.\r
+  // This function is notified at TPL_CALLBACK.\r
+  //\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  SmbiosDataFilter,\r
+                  NULL,\r
+                  &FilterEvent\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = DataHub->RegisterFilterDriver (\r
+                      DataHub,\r
+                      FilterEvent,\r
+                      TPL_APPLICATION,\r
+                      EFI_DATA_RECORD_CLASS_DATA,\r
+                      NULL\r
+                      );\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->CloseEvent (FilterEvent);\r
+    return Status;\r
+  }\r
+\r
+  return Status;\r
+\r
+} \r
+\r
+/**\r
+  Smbios data filter function. This function is invoked when there is data records\r
+  available in the Data Hub. \r
+\r
+  @param Event         The event that is signaled.\r
+  @param Context       not used here.\r
+**/\r
+VOID\r
+EFIAPI\r
+SmbiosDataFilter (\r
+  IN EFI_EVENT    Event,\r
+  IN VOID         *Context\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  EFI_DATA_HUB_PROTOCOL   *DataHub;\r
+  EFI_HANDLE              DataHubHandle;\r
+  UINTN                   HandleSize;\r
+  UINT64                  MonotonicCount;\r
+  EFI_DATA_RECORD_HEADER  *Record;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  DataHub = NULL;\r
+\r
+  //\r
+  // Get the Data Hub Protocol. Assume only one instance\r
+  // of Data Hub Protocol is availabe in the system.\r
+  //\r
+  HandleSize = sizeof (EFI_HANDLE);\r
+\r
+  Status = gBS->LocateHandle (\r
+                  ByProtocol,\r
+                  &gEfiDataHubProtocolGuid,\r
+                  NULL,\r
+                  &HandleSize,\r
+                  &DataHubHandle\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  DataHubHandle,\r
+                  &gEfiDataHubProtocolGuid,\r
+                  (VOID **) &DataHub\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+  //\r
+  // Get all available data records from data hub\r
+  //\r
+  MonotonicCount  = 0;\r
+  Record          = NULL;\r
+\r
+  do {\r
+\r
+    Status = DataHub->GetNextRecord (\r
+                        DataHub,\r
+                        &MonotonicCount,\r
+                        &Event,\r
+                        &Record\r
+                        );\r
+\r
+    if (!EFI_ERROR (Status)) {\r
+      if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
+      \r
+        //\r
+        // It's of expected Data Type. Process it.\r
+        //\r
+        SmbiosProcessDataRecord (Record);\r
+      }\r
+    }\r
+  } while (!EFI_ERROR (Status) && (MonotonicCount != 0));\r
+\r
+Done:\r
+\r
+  return ;\r
+\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.h b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Thunk.h
new file mode 100644 (file)
index 0000000..2069fa9
--- /dev/null
@@ -0,0 +1,842 @@
+/** @file\r
+  The common header file for the thunk driver.\r
+  \r
+Copyright (c) 2009 Intel Corporation. <BR>\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
+**/\r
+\r
+#ifndef _DATAHUB_TO_SMBIOS_THUNK_\r
+#define _DATAHUB_TO_SMBIOS_THUNK_\r
+\r
+#include <FrameworkDxe.h>\r
+#include <IndustryStandard/SmBios.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+#include <Guid/SmBios.h>\r
+#include <Protocol/DataHub.h>\r
+#include <Guid/DataHubRecords.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/Smbios.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+//\r
+// Conversion Table that describes the translation method for\r
+// Data Hub Data Records of certain SubClass and RecordNumber\r
+//\r
+typedef enum {\r
+  BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+  BY_SUBCLASS_INSTANCE_PRODUCER,\r
+  MAX_LOCATING_METHOD\r
+} SMBIOS_STRUCTURE_LOCATING_METHOD;\r
+\r
+typedef enum {\r
+  RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED,\r
+  BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+  BY_FUNCTION,\r
+  BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
+  MAX_FIELD_FILLING_METHOD\r
+} SMBIOS_FIELD_FILLING_METHOD;\r
+\r
+typedef struct _SMBIOS_STRUCTURE_NODE SMBIOS_STRUCTURE_NODE;\r
+\r
+typedef struct {\r
+  UINT8   Type;\r
+  UINT8   Length;\r
+  UINT16  Handle;\r
+  UINT8   Tailing[2];\r
+} EFI_SMBIOS_TABLE_TYPE127;\r
+\r
+typedef\r
+EFI_STATUS\r
+(*SMBIOS_FIELD_FILLING_FUNCTION) (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE                     * StructureNode,\r
+  IN      UINT32                                    Offset          OPTIONAL,\r
+  IN      VOID                                      *RecordData,\r
+  IN      UINT32                                    RecordDataSize\r
+  );\r
+\r
+typedef struct {\r
+  //\r
+  // Data Hub Data Record's SubClass and RecordNumber\r
+  //\r
+  EFI_GUID                          SubClass;\r
+  UINT32                            RecordType;\r
+\r
+  //\r
+  // Translation method applied\r
+  //\r
+  UINT8                             SmbiosType;\r
+  SMBIOS_STRUCTURE_LOCATING_METHOD  StructureLocatingMethod;\r
+  SMBIOS_FIELD_FILLING_METHOD       FieldFillingMethod;\r
+  UINT32                            FieldOffset;\r
+  SMBIOS_FIELD_FILLING_FUNCTION     FieldFillingFunction;\r
+\r
+} SMBIOS_CONVERSION_TABLE_ENTRY;\r
+\r
+//\r
+// SMBIOS_LINK_DATA_FIXUP nodes indicate the Link fields that\r
+// need to be fixed up when creating the resulting Smbios image.\r
+//\r
+#define SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'l', 'n')\r
+\r
+typedef struct {\r
+\r
+  UINT32              Signature;\r
+  LIST_ENTRY          Link;\r
+\r
+  UINT32              Offset;\r
+  UINT8               TargetType;\r
+  EFI_GUID            SubClass;\r
+  EFI_INTER_LINK_DATA LinkData;\r
+\r
+} SMBIOS_LINK_DATA_FIXUP_NODE;\r
+\r
+//\r
+// The global Structure List node.\r
+// The Structure List is populated as more and more\r
+// Structures (of various types) are discovered and inserted.\r
+// The nodes in the Structure List will be concatenated\r
+// to form the ultimate SMBIOS table.\r
+//\r
+#define SMBIOS_STRUCTURE_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'b', 's')\r
+\r
+struct _SMBIOS_STRUCTURE_NODE {\r
+\r
+  UINT32            Signature;\r
+  LIST_ENTRY        Link;\r
+\r
+  //\r
+  // Tags\r
+  //\r
+  EFI_GUID          SubClass;\r
+  UINT16            Instance;\r
+  UINT16            SubInstance;\r
+  EFI_GUID          ProducerName;\r
+\r
+  //\r
+  // the Smbios structure\r
+  //\r
+  UINT32            StructureSize;        // Actual structure size including strings\r
+\r
+  EFI_SMBIOS_TABLE_HEADER *Structure;\r
+  \r
+  \r
+  EFI_SMBIOS_HANDLE SmbiosHandle;         // Smbios Handle in SMBIOS database.\r
+  \r
+  EFI_SMBIOS_TYPE   SmbiosType;\r
+  \r
+  LIST_ENTRY    LinkDataFixup;\r
+  \r
+};\r
+\r
+//\r
+// Smbios type info table. Indicates minimum length\r
+// for each Smbios type as the indicator of the initial size of buffer\r
+// allocated for the structure instance of a specific type.\r
+//\r
+typedef struct {\r
+\r
+  UINT8   Type;\r
+  UINT8   MinLength;  // Minimal structure size including\r
+  // TWO trailing bytes of 0x00\r
+  //\r
+  BOOLEAN IsRequired; // Required structure type defined by Smbios Spec\r
+  BOOLEAN IsCreated;  // Created in this run\r
+} SMBIOS_TYPE_INFO_TABLE_ENTRY;\r
+\r
+//\r
+// EDK framwork Memory Data hub definition to support EDK/Framework driver.\r
+//\r
+typedef struct {\r
+  STRING_REF                  MemoryDeviceLocator;\r
+  STRING_REF                  MemoryBankLocator;\r
+  STRING_REF                  MemoryManufacturer;\r
+  STRING_REF                  MemorySerialNumber;\r
+  STRING_REF                  MemoryAssetTag;\r
+  STRING_REF                  MemoryPartNumber;\r
+  EFI_INTER_LINK_DATA         MemoryArrayLink;\r
+  EFI_INTER_LINK_DATA         MemorySubArrayLink;\r
+  UINT16                      MemoryTotalWidth;\r
+  UINT16                      MemoryDataWidth;\r
+  UINT64                      MemoryDeviceSize;\r
+  EFI_MEMORY_FORM_FACTOR      MemoryFormFactor;\r
+  UINT8                       MemoryDeviceSet;\r
+  EFI_MEMORY_ARRAY_TYPE       MemoryType;\r
+  EFI_MEMORY_TYPE_DETAIL      MemoryTypeDetail;\r
+  UINT16                      MemorySpeed;\r
+  EFI_MEMORY_STATE            MemoryState;\r
+  UINT8                       MemoryAttributes;\r
+} FRAMEWORK_MEMORY_ARRAY_LINK_DATA;\r
+\r
+typedef struct {\r
+  EFI_MEMORY_ARRAY_LOCATION   MemoryArrayLocation;\r
+  EFI_MEMORY_ARRAY_USE        MemoryArrayUse;\r
+  EFI_MEMORY_ERROR_CORRECTION MemoryErrorCorrection;\r
+  UINT32                      MaximumMemoryCapacity;\r
+  UINT16                      NumberMemoryDevices;\r
+} FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA;\r
+\r
+//\r
+// Global variables\r
+//\r
+extern SMBIOS_CONVERSION_TABLE_ENTRY  mConversionTable[];\r
+extern SMBIOS_TYPE_INFO_TABLE_ENTRY   mTypeInfoTable[];\r
+extern LIST_ENTRY                     mStructureList;\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+/**\r
+  Smbios data filter function. This function is invoked when there is data records\r
+  available in the Data Hub. \r
+\r
+  @param Event         The event that is signaled.\r
+  @param Context       not used here.\r
+**/\r
+VOID\r
+EFIAPI\r
+SmbiosDataFilter (\r
+  IN EFI_EVENT    Event,\r
+  IN VOID         *Context\r
+  );\r
+\r
+//\r
+// Function prototypes\r
+//\r
+/**\r
+  Process a datahub's record and find corresponding translation way to translate\r
+  to SMBIOS record.\r
+  \r
+  @param Record  Point to datahub record.\r
+**/\r
+VOID\r
+SmbiosProcessDataRecord (\r
+  IN EFI_DATA_RECORD_HEADER  *Record\r
+  )\r
+;\r
+\r
+/**\r
+  Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
+  to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
+  \r
+  @param Type  SMBIOS's type.\r
+  \r
+  @return the minimal length of a smbios record.\r
+**/\r
+UINT32\r
+SmbiosGetTypeMinimalLength (\r
+  IN UINT8  Type\r
+  )\r
+;\r
+\r
+/**\r
+  Enlarge the structure buffer of a structure node in SMBIOS database.\r
+  The function maybe lead the structure pointer for SMBIOS record changed.\r
+  \r
+  @param StructureNode The structure node whose structure buffer is to be enlarged.\r
+  @param NewLength     The new length of SMBIOS record which does not include unformat area.\r
+  @param OldBufferSize The old size of SMBIOS record buffer.\r
+  @param NewBufferSize The new size is targeted for enlarged.\r
+  \r
+  @retval EFI_OUT_OF_RESOURCES  No more memory to allocate new record\r
+  @retval EFI_SUCCESS           Success to enlarge the record buffer size.\r
+**/\r
+EFI_STATUS\r
+SmbiosEnlargeStructureBuffer (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE *StructureNode,\r
+  UINT8                         NewLength,\r
+  UINTN                         OldBufferSize,\r
+  UINTN                         NewBufferSize\r
+  );\r
+\r
+/**\r
+  Field Filling Function. Fill a standard Smbios string field. \r
+  Convert the unicode string to single byte chars.\r
+  Only English language is supported.\r
+\r
+  This function changes the Structure pointer value of the structure node, \r
+  which should be noted by Caller.\r
+  \r
+  @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+  @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
+  @param RecordData       RecordData buffer will be filled.\r
+  @param RecordDataSize   The size of RecordData buffer.\r
+  \r
+  @retval EFI_INVALID_PARAMETER   RecordDataSize is too larger\r
+  @retval EFI_OUT_OF_RESOURCES    No memory to allocate new buffer for string\r
+  @retval EFI_SUCCESS             Sucess append string for a SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldString (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+/**\r
+  Fill the inter link field for a SMBIOS recorder.\r
+  \r
+  Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
+  maybe another SMBIOS record has not been added, so put the InterLink request into\r
+  a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
+  \r
+  @param StructureNode        Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
+  @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
+  @param LinkSmbiosType       The type of SMBIOS record want to be linked.\r
+  @param InterLink            Point to EFI_INTER_LINK_DATA will be put linked list.\r
+  @param SubClassGuid         The guid of subclass for linked SMBIOS record.\r
+  \r
+  @retval EFI_SUCESS  The linked record is found and no need fixup in future.\r
+  @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldInterLink (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT16                    LinkSmbiosNodeOffset,\r
+  IN      UINT8                     LinkSmbiosType,\r
+  IN      EFI_INTER_LINK_DATA       *InterLink,\r
+  IN      EFI_GUID                  *SubClassGuid\r
+  )\r
+;\r
+\r
+/**\r
+  Find a handle that matches the Link Data and the target Smbios type.\r
+  \r
+  @param  TargetType     the Smbios type\r
+  @param  SubClass       the SubClass\r
+  @param  LinkData       Specifies Instance, SubInstance and ProducerName\r
+  @param  Handle         the HandleNum found  \r
+  \r
+  @retval EFI_NOT_FOUND Can not find the record according to handle\r
+  @retval EFI_SUCCESS   Success to find the handle\r
+**/\r
+EFI_STATUS\r
+SmbiosFindHandle (\r
+  IN      UINT8               TargetType,\r
+  IN      EFI_GUID            *SubClass,\r
+  IN      EFI_INTER_LINK_DATA *LinkData,\r
+  IN OUT  UINT16              *HandleNum\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase10ToWordWithMega (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase2ToWordWithKilo (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldTruncateToByte (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType17 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase10ToByteWithNano (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldTruncateToWord (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldCacheType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+INT8\r
+SmbiosCheckTrailingZero (\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldCacheType5 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType2 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType3 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType4 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType5 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType7 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType8 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType0 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase2ToByteWith64K (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType1 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType2 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType3 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType8 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType9 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType10 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType11 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType12 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType13 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType14 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType15 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType21 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType32 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  );\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscTypeOEM (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldSMBIOSType6 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset, \r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType23 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType24 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType25 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType26 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType27 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType28 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType29 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType30 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType34 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType36 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType39 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType127 (\r
+  IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
+  IN      UINT32                    Offset,\r
+  IN      VOID                      *RecordData,\r
+  IN      UINT32                    RecordDataSize\r
+  )\r
+;\r
+    \r
+EFI_STATUS\r
+SmbiosProtocolCreateRecord (\r
+  IN      EFI_HANDLE              ProducerHandle, OPTIONAL\r
+  IN      SMBIOS_STRUCTURE_NODE   *StructureNode\r
+  );\r
+  \r
+EFI_SMBIOS_PROTOCOL*\r
+GetSmbiosProtocol (\r
+  VOID\r
+  );\r
+    \r
+EFI_SMBIOS_TABLE_HEADER*\r
+GetSmbiosBufferFromHandle (\r
+  IN  EFI_SMBIOS_HANDLE  Handle,\r
+  IN  EFI_SMBIOS_TYPE    Type,\r
+  IN  EFI_HANDLE         ProducerHandle  OPTIONAL\r
+  );\r
+          \r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosStructureSize (\r
+  IN   EFI_SMBIOS_TABLE_HEADER          *Head,\r
+  OUT  UINT32                           *Size,\r
+  OUT  UINT8                            *NumberOfStrings\r
+  );\r
+            \r
+#endif\r
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Translate.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/Translate.c
new file mode 100644 (file)
index 0000000..3230d96
--- /dev/null
@@ -0,0 +1,591 @@
+/** @file\r
+  Translate the DataHub records via EFI_DATA_HUB_PROTOCOL to Smbios recorders \r
+  via EFI_SMBIOS_PROTOCOL.\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
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+EFI_GUID  ZeroGuid = { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } };\r
+EFI_SMBIOS_PROTOCOL  *mSmbiosProtocol = NULL;\r
+\r
+/**\r
+  Release the structure Node. \r
+  \r
+  @param StructureNode  Point to SMBIOS_STRUCTURE_NODE which will be removed.\r
+**/\r
+VOID\r
+ReleaseStructureNode (\r
+  SMBIOS_STRUCTURE_NODE  *StructureNode\r
+  )\r
+{\r
+  EFI_SMBIOS_PROTOCOL *Smbios;\r
+  \r
+  RemoveEntryList (&(StructureNode->Link));\r
+  Smbios = GetSmbiosProtocol();\r
+  ASSERT (Smbios != NULL);\r
+  Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+  gBS->FreePool (StructureNode);\r
+}\r
+\r
+/**\r
+  Process a datahub's record and find corresponding translation way to translate\r
+  to SMBIOS record.\r
+  \r
+  @param Record  Point to datahub record.\r
+**/\r
+VOID\r
+SmbiosProcessDataRecord (\r
+  IN EFI_DATA_RECORD_HEADER  *Record\r
+  )\r
+{\r
+  EFI_DATA_RECORD_HEADER        *RecordHeader;\r
+  EFI_SUBCLASS_TYPE1_HEADER     *DataHeader;\r
+  UINTN                         Index;\r
+  SMBIOS_CONVERSION_TABLE_ENTRY *Conversion;\r
+  UINT8                         *SrcData;\r
+  UINTN                         SrcDataSize;\r
+  LIST_ENTRY                    *Link;\r
+  SMBIOS_STRUCTURE_NODE         *StructureNode;\r
+  BOOLEAN                       StructureCreated;\r
+  EFI_STATUS                    Status;\r
+  \r
+  Conversion        = NULL;\r
+  StructureNode     = NULL;\r
+  StructureCreated  = FALSE;\r
+  RecordHeader      = Record;\r
+  DataHeader        = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
+  SrcData           = (UINT8 *) (DataHeader + 1);\r
+  SrcDataSize       = RecordHeader->RecordSize - RecordHeader->HeaderSize - sizeof (EFI_SUBCLASS_TYPE1_HEADER);\r
+\r
+  if (DataHeader->HeaderSize != sizeof (EFI_SUBCLASS_TYPE1_HEADER) ||\r
+      DataHeader->Instance == EFI_SUBCLASS_INSTANCE_RESERVED ||\r
+      DataHeader->SubInstance == EFI_SUBCLASS_INSTANCE_RESERVED\r
+      ) {\r
+    //\r
+    // Invalid Data Record\r
+    //\r
+    goto Done;\r
+  }\r
+\r
+  Index = 0;\r
+  while(TRUE) {\r
+    //\r
+    // Find a matching entry in the conversion table for this\r
+    // (SubClass, RecordNumber) pair\r
+    //\r
+    for (; !CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid); Index++) {\r
+      if (CompareGuid (\r
+            &(mConversionTable[Index].SubClass),\r
+            &(RecordHeader->DataRecordGuid)\r
+            )) {\r
+        if (mConversionTable[Index].RecordType == DataHeader->RecordType) {\r
+          break;\r
+        }\r
+      }\r
+    }\r
+\r
+    if (CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid)) {\r
+      //\r
+      // We cannot find a matching entry in conversion table,\r
+      // this means this data record cannot be used for SMBIOS.\r
+      // Just skip it.\r
+      //\r
+      goto Done;\r
+    }\r
+\r
+    Conversion = &mConversionTable[Index++];\r
+\r
+    //\r
+    // Find corresponding structure in the Structure List\r
+    //\r
+    for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+\r
+      StructureNode = CR (\r
+                        Link,\r
+                        SMBIOS_STRUCTURE_NODE,\r
+                        Link,\r
+                        SMBIOS_STRUCTURE_NODE_SIGNATURE\r
+                        );\r
+\r
+      if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
+        //\r
+        // Look at SubClass, Instance, SubInstance and ProducerName for a matching\r
+        // node\r
+        //\r
+        if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
+            StructureNode->Instance == DataHeader->Instance &&\r
+            StructureNode->SubInstance == DataHeader->SubInstance &&\r
+            CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
+              ) {\r
+          if (Conversion->SmbiosType >= 0X80) {\r
+            if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
+              break;\r
+            }\r
+          } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
+            break;\r
+          }\r
+        }\r
+\r
+      } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
+        //\r
+        // Look at SubClass, Instance and ProducerName for a matching node\r
+        //\r
+        if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
+            StructureNode->Instance == DataHeader->Instance &&\r
+            CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
+              ) {\r
+          if (Conversion->SmbiosType >= 0X80) {\r
+            if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
+              break;\r
+            }\r
+          } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
+            break;\r
+          }\r
+        }\r
+\r
+      } else {\r
+        //\r
+        // Invalid conversion table entry\r
+        //\r
+        goto Done;\r
+      }\r
+    }\r
+\r
+    if (Link == &mStructureList) {\r
+\r
+      //\r
+      // Not found, create a new structure\r
+      //\r
+      StructureNode = AllocateZeroPool (sizeof (SMBIOS_STRUCTURE_NODE));\r
+\r
+      if (StructureNode == NULL) {\r
+        goto Done;\r
+      }\r
+\r
+      if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
+        //\r
+        // Fill in SubClass, Instance, SubInstance and ProducerName\r
+        //\r
+        CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
+        StructureNode->Instance     = DataHeader->Instance;\r
+        StructureNode->SubInstance  = DataHeader->SubInstance;\r
+        CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
+\r
+      } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
+        //\r
+        // Fill in at SubClass, Instance and ProducerName, mark SubInstance as Non\r
+        // Applicable\r
+        //\r
+        CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
+        StructureNode->Instance     = DataHeader->Instance;\r
+        StructureNode->SubInstance  = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
+        CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
+\r
+      }\r
+      //\r
+      // Allocate the structure instance\r
+      //\r
+      StructureNode->StructureSize = SmbiosGetTypeMinimalLength (Conversion->SmbiosType);\r
+      StructureNode->SmbiosType    = Conversion->SmbiosType;\r
+      \r
+      //\r
+      // StructureSize include the TWO trailing zero byte.\r
+      //\r
+      if (StructureNode->StructureSize < (sizeof(SMBIOS_STRUCTURE) + 2)) {\r
+        //\r
+        // Invalid Type\r
+        //\r
+        gBS->FreePool (StructureNode);\r
+        goto Done;\r
+      }\r
+\r
+      StructureNode->SmbiosType          = Conversion->SmbiosType;\r
+      StructureNode->SmbiosHandle        = 0;\r
+      Status = SmbiosProtocolCreateRecord (\r
+                 NULL, \r
+                 StructureNode\r
+                 );\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+      //\r
+      // Temporary cache the structrue pointer to Smbios database.\r
+      //\r
+      StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
+      \r
+      InitializeListHead (&StructureNode->LinkDataFixup);\r
+\r
+      //\r
+      // Insert the Structure Node into the Strucutre List\r
+      //\r
+      StructureNode->Signature = SMBIOS_STRUCTURE_NODE_SIGNATURE;\r
+      InsertTailList (&mStructureList, &(StructureNode->Link));\r
+\r
+      StructureCreated = TRUE;\r
+\r
+    }\r
+    \r
+    \r
+    //\r
+    // Re-calculate the structure pointer to Smbios database.\r
+    //\r
+    StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
+    \r
+    //\r
+    // Fill the Structure's field corresponding to this data record\r
+    //\r
+    if (Conversion->FieldFillingMethod == RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED) {\r
+      //\r
+      // Field data is just the record data without transforming and\r
+      // offset is specified directly in the conversion table entry\r
+      //\r
+      if (Conversion->FieldOffset + SrcDataSize > StructureNode->Structure->Length) {\r
+        //\r
+        // Invalid Conversion Table Entry\r
+        //\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+      \r
+      CopyMem ((UINT8 *) (StructureNode->Structure) + Conversion->FieldOffset, SrcData, SrcDataSize);\r
+\r
+    } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_OFFSET_SPECIFIED) {\r
+      //\r
+      // Field offfset is specified in the conversion table entry, but\r
+      // record data needs to be transformed to be filled into the field,\r
+      // so let the FieldFillingFunction do it.\r
+      //\r
+      if (Conversion->FieldFillingFunction == NULL) {\r
+        //\r
+        // Invalid Conversion Table Entry\r
+        //\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+\r
+      Status = Conversion->FieldFillingFunction (\r
+                            StructureNode,\r
+                            Conversion->FieldOffset,\r
+                            SrcData,\r
+                            (UINT32) SrcDataSize\r
+                            );\r
+      if (EFI_ERROR (Status)) {\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+    } else if (Conversion->FieldFillingMethod == BY_FUNCTION) {\r
+      //\r
+      // Both field offset and field content are determined by\r
+      // FieldFillingFunction\r
+      //\r
+      if (Conversion->FieldFillingFunction == NULL) {\r
+        //\r
+        // Invalid Conversion Table Entry\r
+        //\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+\r
+      Status = Conversion->FieldFillingFunction (\r
+                            StructureNode,\r
+                            0,\r
+                            SrcData,\r
+                            (UINT32) SrcDataSize\r
+                            );\r
+      if (EFI_ERROR (Status)) {\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+    } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_WHOLE_DATA_RECORD) {\r
+      //\r
+      // Both field offset and field content are determined by\r
+      // FieldFillingFunction and the function accepts the whole data record\r
+      // including the data header\r
+      //\r
+      if (Conversion->FieldFillingFunction == NULL) {\r
+        //\r
+        // Invalid Conversion Table Entry\r
+        //\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+\r
+      Status = Conversion->FieldFillingFunction (\r
+                            StructureNode,\r
+                            0,\r
+                            DataHeader,\r
+                            RecordHeader->RecordSize - RecordHeader->HeaderSize\r
+                            );\r
+      if (EFI_ERROR (Status)) {\r
+        if (StructureCreated) {\r
+          ReleaseStructureNode (StructureNode);\r
+        }\r
+\r
+        goto Done;\r
+      }\r
+    } else {\r
+      //\r
+      // Invalid Conversion Table Entry\r
+      //\r
+      if (StructureCreated) {\r
+        ReleaseStructureNode (StructureNode);\r
+      }\r
+\r
+      goto Done;\r
+    }\r
+  }\r
+Done:\r
+  return ;\r
+}\r
+\r
+/**\r
+  Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
+  to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
+  \r
+  @param Type  SMBIOS's type.\r
+  \r
+  @return the minimal length of a smbios record.\r
+**/\r
+UINT32\r
+SmbiosGetTypeMinimalLength (\r
+  IN UINT8  Type\r
+  )\r
+{\r
+  UINTN Index;\r
+\r
+  for (Index = 0; mTypeInfoTable[Index].MinLength != 0; Index++) {\r
+    if (mTypeInfoTable[Index].Type == Type) {\r
+      return mTypeInfoTable[Index].MinLength;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+  Get pointer of EFI_SMBIOS_PROTOCOL.\r
+  \r
+  @return pointer of EFI_SMBIOS_PROTOCOL.\r
+**/\r
+EFI_SMBIOS_PROTOCOL*\r
+GetSmbiosProtocol(\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  \r
+  if (mSmbiosProtocol == NULL) {\r
+    Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID*) &mSmbiosProtocol);\r
+    ASSERT_EFI_ERROR (Status);\r
+  } \r
+  \r
+  ASSERT (mSmbiosProtocol != NULL);\r
+  return mSmbiosProtocol; \r
+}  \r
+\r
+/**\r
+  Create a blank smbios record. The datahub record is only a field of smbios record.\r
+  So before fill any field from datahub's record. A blank smbios record need to be \r
+  created.\r
+  \r
+  @param ProducerHandle   The produce handle for a datahub record\r
+  @param StructureNode    Point to SMBIOS_STRUCTURE_NODE\r
+  \r
+  @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for new blank SMBIOS record.\r
+  @retval EFI_SUCCESS          Success to create blank smbios record.\r
+**/\r
+EFI_STATUS\r
+SmbiosProtocolCreateRecord (\r
+  IN      EFI_HANDLE              ProducerHandle, OPTIONAL\r
+  IN      SMBIOS_STRUCTURE_NODE   *StructureNode\r
+  )\r
+{\r
+  EFI_SMBIOS_PROTOCOL         *Smbios;\r
+  EFI_SMBIOS_TABLE_HEADER     *BlankRecord;\r
+  EFI_STATUS                  Status;\r
+  SMBIOS_STRUCTURE_NODE       *RefStructureNode;\r
+  LIST_ENTRY                  *Link;\r
+  LIST_ENTRY                  *Link1;\r
+  LIST_ENTRY                  *Link2;  \r
+  SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
+  UINT8                       *BufferPointer;\r
+  \r
+  Smbios = GetSmbiosProtocol();\r
+  ASSERT (Smbios != NULL);\r
+  \r
+  //\r
+  // Prepare a blank smbios record.\r
+  //\r
+  BlankRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (StructureNode->StructureSize);\r
+  if (BlankRecord == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  BlankRecord->Type   = StructureNode->SmbiosType;\r
+  BlankRecord->Length = (UINT8) (StructureNode->StructureSize - 2);\r
+  \r
+  //\r
+  // Add blank record into SMBIOS database.\r
+  //\r
+  Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, BlankRecord);\r
+  FreePool (BlankRecord);\r
+  \r
+  //\r
+  // Fix up the InterLink node for new added smbios record if some other\r
+  // existing smbios record want to link this new record's handle.\r
+  //\r
+  for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+    RefStructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
+    for (Link1 = RefStructureNode->LinkDataFixup.ForwardLink; Link1 != &RefStructureNode->LinkDataFixup;) {\r
+      LinkDataFixupNode = CR (Link1, SMBIOS_LINK_DATA_FIXUP_NODE, Link, SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE);\r
+      Link2 = Link1;\r
+      Link1 = Link1->ForwardLink;\r
+            \r
+      if ((StructureNode->SmbiosType != LinkDataFixupNode->TargetType) ||\r
+          !(CompareGuid (&StructureNode->SubClass, &LinkDataFixupNode->SubClass)) ||\r
+          (StructureNode->Instance != LinkDataFixupNode->LinkData.Instance) ||\r
+          (StructureNode->SubInstance != LinkDataFixupNode->LinkData.SubInstance)) {\r
+        continue;\r
+      }\r
+      \r
+      //\r
+      // Fill the field with the handle found\r
+      //\r
+      BufferPointer         = (UINT8 *) (RefStructureNode->Structure) + LinkDataFixupNode->Offset;\r
+      *BufferPointer        = (UINT8) (StructureNode->SmbiosHandle & 0xFF);\r
+      *(BufferPointer + 1)  = (UINT8) ((StructureNode->SmbiosHandle >> 8) & 0xFF);\r
+      BufferPointer         = NULL;\r
+\r
+      RemoveEntryList (Link2);\r
+      FreePool (LinkDataFixupNode);\r
+    }\r
+  }\r
+  \r
+  return Status;\r
+}  \r
+\r
+/**\r
+  Get pointer of a SMBIOS record's buffer according to its handle.\r
+  \r
+  @param Handle         The handle of SMBIOS record want to be searched.\r
+  @param Type           The type of SMBIOS record want to be searched.\r
+  @param ProducerHandle The producer handle of SMBIOS record.\r
+  \r
+  @return EFI_SMBIOS_TABLE_HEADER Point to a SMBIOS record's buffer.\r
+**/  \r
+EFI_SMBIOS_TABLE_HEADER*\r
+GetSmbiosBufferFromHandle (\r
+  IN  EFI_SMBIOS_HANDLE  Handle,\r
+  IN  EFI_SMBIOS_TYPE    Type,\r
+  IN  EFI_HANDLE         ProducerHandle  OPTIONAL\r
+  )\r
+{\r
+  EFI_SMBIOS_PROTOCOL*    Smbios;\r
+  EFI_SMBIOS_HANDLE       SearchingHandle;\r
+  EFI_SMBIOS_TABLE_HEADER *RecordInSmbiosDatabase;\r
+  EFI_STATUS              Status;\r
+  \r
+  SearchingHandle = 0;\r
+  Smbios          = GetSmbiosProtocol();\r
+  ASSERT (Smbios != NULL);\r
+  \r
+  do {\r
+    Status = Smbios->GetNext (Smbios, &SearchingHandle, &Type, &RecordInSmbiosDatabase, NULL);\r
+  } while ((SearchingHandle != Handle) && (Status != EFI_NOT_FOUND));\r
+  \r
+  return RecordInSmbiosDatabase;\r
+}  \r
+\r
+/**\r
+\r
+  Get the full size of smbios structure including optional strings that follow the formatted structure.\r
+\r
+  @param Head                   Pointer to the beginning of smbios structure.\r
+  @param Size                   The returned size.\r
+  @param NumberOfStrings        The returned number of optional strings that follow the formatted structure.\r
+\r
+  @retval EFI_SUCCESS           Size retured in Size.\r
+  @retval EFI_INVALID_PARAMETER Input smbios structure mal-formed or Size is NULL.\r
+  \r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosStructureSize (\r
+  IN   EFI_SMBIOS_TABLE_HEADER          *Head,\r
+  OUT  UINT32                           *Size,\r
+  OUT  UINT8                            *NumberOfStrings\r
+  )\r
+{\r
+  UINT32 FullSize;\r
+  UINT8  StrLen;\r
+  INT8*  CharInStr;\r
+  \r
+  if (Size == NULL || NumberOfStrings == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  FullSize = Head->Length;\r
+  CharInStr = (INT8*)Head + Head->Length;\r
+  *Size = FullSize;\r
+  *NumberOfStrings = 0;\r
+  StrLen = 0;\r
+  //\r
+  // look for the two consecutive zeros, check the string limit by the way.\r
+  //\r
+  while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
+    if (*CharInStr == 0) {\r
+      *Size += 1;\r
+      CharInStr++;\r
+    }\r
+\r
+    for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {\r
+      if (*(CharInStr+StrLen) == 0) {\r
+        break;\r
+      }  \r
+    }\r
+\r
+    if (StrLen == SMBIOS_STRING_MAX_LENGTH) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+    //\r
+    // forward the pointer\r
+    //\r
+    CharInStr += StrLen;\r
+    *Size += StrLen;\r
+    *NumberOfStrings += 1;\r
+    \r
+  }\r
+\r
+  //\r
+  // count ending two zeros.\r
+  //\r
+  *Size += 2;\r
+  return EFI_SUCCESS;  \r
+}\r
index ec1a62bc116a0ffd37a1f37b98ddf3cf308b7753..05201e549414eae6887b1cdb3025f9b00fc5aa00 100644 (file)
@@ -243,7 +243,7 @@ define GCC_MACRO                 = -DEFI_SPECIFICATION_VERSION=0x00020000 -DPI_S
   EdkCompatibilityPkg/Compatibility/UcOnUc2Thunk/UcOnUc2Thunk.inf\r
   EdkCompatibilityPkg/Compatibility/PrintThunk/PrintThunk.inf\r
   EdkCompatibilityPkg/Compatibility/LegacyRegion2OnLegacyRegionThunk/LegacyRegion2OnLegacyRegionThunk.inf\r
-  EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/DataHubSmBiosRecordsOnPiSmBiosThunk.inf\r
+  EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/PiSmbiosRecordOnDataHubSmbiosRecordThunk.inf\r
   EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf\r
 \r
   #\r