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