+/**\r
+ Copy SMBIOS table to EfiReservedMemoryType of memory for legacy boot.\r
+\r
+**/\r
+VOID\r
+CreateSmbiosTableInReservedMemory (\r
+ VOID\r
+ )\r
+{\r
+ SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure;\r
+ \r
+ if ((mRuntimeSmbiosEntryPoint == NULL) || \r
+ (mReserveSmbiosEntryPoint == 0) || \r
+ (mStructureTableAddress == 0)) {\r
+ return;\r
+ }\r
+ \r
+ EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) mRuntimeSmbiosEntryPoint;\r
+ \r
+ //\r
+ // Copy SMBIOS Entry Point Structure\r
+ //\r
+ CopyMem (\r
+ (VOID *)(UINTN) mReserveSmbiosEntryPoint,\r
+ EntryPointStructure,\r
+ EntryPointStructure->EntryPointLength\r
+ );\r
+ \r
+ //\r
+ // Copy SMBIOS Structure Table into EfiReservedMemoryType memory\r
+ //\r
+ CopyMem (\r
+ (VOID *)(UINTN) mStructureTableAddress,\r
+ (VOID *)(UINTN) EntryPointStructure->TableAddress,\r
+ EntryPointStructure->TableLength\r
+ );\r
+ \r
+ //\r
+ // Update TableAddress in Entry Point Structure\r
+ //\r
+ EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN) mReserveSmbiosEntryPoint;\r
+ EntryPointStructure->TableAddress = (UINT32)(UINTN) mStructureTableAddress;\r
+ \r
+ //\r
+ // Fixup checksums in the Entry Point Structure\r
+ //\r
+ EntryPointStructure->IntermediateChecksum = 0;\r
+ EntryPointStructure->EntryPointStructureChecksum = 0;\r
+\r
+ EntryPointStructure->IntermediateChecksum = \r
+ CalculateCheckSum8 (\r
+ (UINT8 *) EntryPointStructure + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString), \r
+ EntryPointStructure->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString)\r
+ );\r
+ EntryPointStructure->EntryPointStructureChecksum =\r
+ CalculateCheckSum8 ((UINT8 *) EntryPointStructure, EntryPointStructure->EntryPointLength);\r
+}\r