]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/SmbiosPlatformDxe: Add OVMF SMBIOS driver (with Xen support)
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 13 Aug 2011 22:54:37 +0000 (22:54 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 13 Aug 2011 22:54:37 +0000 (22:54 +0000)
Locates Xen SMBIOS data and installs it using the SMBIOS
protocol.

Signed-off-by: gavinguan
Reviewed-by: Andrei Warkentin <andreiw@motorola.com>
Signed-off-by: jljusten
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12125 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32.fdf
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgIa32X64.fdf
OvmfPkg/OvmfPkgX64.dsc
OvmfPkg/OvmfPkgX64.fdf
OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c [new file with mode: 0644]
OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h [new file with mode: 0644]
OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf [new file with mode: 0644]
OvmfPkg/SmbiosPlatformDxe/Xen.c [new file with mode: 0644]

index d3d4a470f0d21d4af35aa62dfa03c038170025ca..8a5b3524ca4f3d3c948c2d398229b71da0d8cba3 100644 (file)
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
   MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
   PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
   UefiCpuPkg/CpuDxe/CpuDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+  #\r
+  # SMBIOS Support\r
+  #\r
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
   #\r
   # ACPI Support\r
   #\r
index ed152021a36abbde9a709f52250540c03246af85..04e5b65bec669029097e2a5b892d6e82f8e8a3d1 100644 (file)
@@ -152,7 +152,6 @@ INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
 INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
 INF  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
 INF  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
 INF  UefiCpuPkg/CpuDxe/CpuDxe.inf\r
@@ -198,6 +197,9 @@ INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 INF  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+INF  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
 INF  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf\r
 INF  MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf\r
 INF  RuleOverride=ACPITABLE OvmfPkg/AcpiTables/AcpiTables.inf\r
index 77095b383713a6d5d44f1b22dd78592aa894f632..98d3a29248a374a8bcdf5cda6579e532f9cb97f8 100644 (file)
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
   MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
   PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
   UefiCpuPkg/CpuDxe/CpuDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+  #\r
+  # SMBIOS Support\r
+  #\r
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
   #\r
   # ACPI Support\r
   #\r
index df212659bab60178a3b082bf03c0b9c1eeba6a18..0efd16837b999dba2ef42bc132dfd24e9d1cdf4f 100644 (file)
@@ -152,7 +152,6 @@ INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
 INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
 INF  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
 INF  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
 INF  UefiCpuPkg/CpuDxe/CpuDxe.inf\r
@@ -198,6 +197,9 @@ INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 INF  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+INF  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
 INF  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf\r
 INF  MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf\r
 INF  RuleOverride=ACPITABLE OvmfPkg/AcpiTables/AcpiTables.inf\r
index 3604a322df447538f37f6824524a916072480108..9117136538a6bf1660fa7741424697e873029b6a 100644 (file)
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
   MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
   PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
   UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
   UefiCpuPkg/CpuDxe/CpuDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
   IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+  #\r
+  # SMBIOS Support\r
+  #\r
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
   #\r
   # ACPI Support\r
   #\r
index f0388b12c204794fbc00388cbbd121c46ecc0543..a9241ef7dc6bd354a2d622301048354e9e1ebb40 100644 (file)
@@ -152,7 +152,6 @@ INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
 INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
-INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
 INF  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
 INF  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
 INF  UefiCpuPkg/CpuDxe/CpuDxe.inf\r
@@ -198,6 +197,9 @@ INF  IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
 INF  IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf\r
 INF  IntelFrameworkModulePkg/Bus/Isa/IsaFloppyDxe/IsaFloppyDxe.inf\r
 \r
+INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+INF  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf\r
+\r
 INF  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf\r
 INF  MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf\r
 INF  RuleOverride=ACPITABLE OvmfPkg/AcpiTables/AcpiTables.inf\r
diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
new file mode 100644 (file)
index 0000000..dc84c3a
--- /dev/null
@@ -0,0 +1,170 @@
+/** @file\r
+  This driver installs SMBIOS information for OVMF\r
+\r
+  Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
+  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+  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 "SmbiosPlatformDxe.h"\r
+\r
+\r
+/**\r
+  Validates the SMBIOS entry point structure\r
+\r
+  @param  EntryPointStructure  SMBIOS entry point structure\r
+\r
+  @retval TRUE   The entry point structure is valid\r
+  @retval FALSE  The entry point structure is not valid\r
+\r
+**/\r
+BOOLEAN\r
+IsEntryPointStructureValid (\r
+  IN SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure\r
+  )\r
+{\r
+  UINTN                     Index;\r
+  UINT8                     Length;\r
+  UINT8                     Checksum;\r
+  UINT8                     *BytePtr;\r
+\r
+  BytePtr = (UINT8*) EntryPointStructure;\r
+  Length = EntryPointStructure->EntryPointLength;\r
+  Checksum = 0;\r
+\r
+  for (Index = 0; Index < Length; Index++) {\r
+    Checksum += BytePtr[Index];\r
+  }\r
+\r
+  if (Checksum != 0) {\r
+    return FALSE;\r
+  } else {\r
+    return TRUE;\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  Get SMBIOS record length.\r
+\r
+  @param  SmbiosTable   SMBIOS pointer.\r
+\r
+**/\r
+UINTN\r
+SmbiosTableLength (\r
+  IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
+  )\r
+{\r
+  CHAR8  *AChar;\r
+  UINTN  Length;\r
+\r
+  AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
+\r
+  //\r
+  // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
+  //\r
+  while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
+    AChar ++;\r
+  }\r
+  Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
+\r
+  return Length;\r
+}\r
+\r
+\r
+/**\r
+  Install all structures from the given SMBIOS structures block\r
+\r
+  @param  Smbios               SMBIOS protocol\r
+  @param  EntryPointStructure  SMBIOS entry point structures block\r
+\r
+**/\r
+EFI_STATUS\r
+InstallAllStructures (\r
+  IN EFI_SMBIOS_PROTOCOL       *Smbios,\r
+  IN SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  SMBIOS_STRUCTURE_POINTER  SmbiosTable;\r
+  EFI_SMBIOS_HANDLE         SmbiosHandle;\r
+\r
+  SmbiosTable.Raw = (UINT8*)(UINTN) EntryPointStructure->TableAddress;\r
+  if (SmbiosTable.Raw == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  while (SmbiosTable.Hdr->Type != 127) {\r
+    //\r
+    // Log the SMBIOS data for this structure\r
+    //\r
+    SmbiosHandle = 0;\r
+    Status = Smbios->Add (\r
+                       Smbios,\r
+                       NULL,\r
+                       &SmbiosHandle,\r
+                       (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw\r
+                       );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    //\r
+    // Get the next structure address\r
+    //\r
+    SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Installs SMBIOS information for OVMF\r
+\r
+  @param ImageHandle     Module's image handle\r
+  @param SystemTable     Pointer of EFI_SYSTEM_TABLE\r
+\r
+  @retval EFI_SUCCESS    Smbios data successfully installed\r
+  @retval Other          Smbios data was not installed\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosTablePublishEntry (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_SMBIOS_PROTOCOL       *Smbios;\r
+  SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure;\r
+\r
+  //\r
+  // Find the SMBIOS protocol\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiSmbiosProtocolGuid,\r
+                  NULL,\r
+                  (VOID**)&Smbios\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Add Xen SMBIOS data if found\r
+  //\r
+  EntryPointStructure = GetXenSmbiosTables ();\r
+  if (EntryPointStructure != NULL) {\r
+    Status = InstallAllStructures (Smbios, EntryPointStructure);\r
+  }\r
+\r
+  return Status;\r
+}\r
diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h
new file mode 100644 (file)
index 0000000..bf99e43
--- /dev/null
@@ -0,0 +1,56 @@
+/** @file\r
+  This driver installs SMBIOS information for OVMF\r
+\r
+  Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
+  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+  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 _SMBIOS_PLATFORM_DXE_H_\r
+#define _SMBIOS_PLATFORM_DXE_H_\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/Smbios.h>\r
+#include <IndustryStandard/SmBios.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+\r
+/**\r
+  Locates the Xen SMBIOS data if it exists\r
+\r
+  @return SMBIOS_TABLE_ENTRY_POINT   Address of Xen SMBIOS data\r
+\r
+**/\r
+SMBIOS_TABLE_ENTRY_POINT *\r
+GetXenSmbiosTables (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Validates the SMBIOS entry point structure\r
+\r
+  @param  EntryPointStructure  SMBIOS entry point structure\r
+\r
+  @retval TRUE   The entry point structure is valid\r
+  @retval FALSE  The entry point structure is not valid\r
+\r
+**/\r
+BOOLEAN\r
+IsEntryPointStructureValid (\r
+  IN SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure\r
+  );\r
+\r
+#endif\r
diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
new file mode 100644 (file)
index 0000000..7058284
--- /dev/null
@@ -0,0 +1,57 @@
+## @file\r
+#  This driver installs SMBIOS information for OVMF\r
+#\r
+#  Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
+#  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  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
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = SmbiosPlatformDxe\r
+  FILE_GUID                      = 4110465d-5ff3-4f4b-b580-24ed0d06747a\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+\r
+  ENTRY_POINT                    = SmbiosTablePublishEntry\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]\r
+  SmbiosPlatformDxe.h\r
+  SmbiosPlatformDxe.c\r
+  Xen.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  OvmfPkg/OvmfPkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiBootServicesTableLib\r
+  BaseMemoryLib\r
+  BaseLib\r
+  UefiDriverEntryPoint\r
+  DebugLib\r
+  HobLib\r
+\r
+[Protocols]\r
+  gEfiSmbiosProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED\r
+\r
+[Guids]\r
+  gEfiXenInfoGuid\r
+\r
+[Depex]\r
+  gEfiSmbiosProtocolGuid\r
+\r
diff --git a/OvmfPkg/SmbiosPlatformDxe/Xen.c b/OvmfPkg/SmbiosPlatformDxe/Xen.c
new file mode 100644 (file)
index 0000000..93b8f74
--- /dev/null
@@ -0,0 +1,63 @@
+/** @file
+  Detect Xen hvmloader SMBIOS data for usage by OVMF.
+
+  Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>
+  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+#include <Library/HobLib.h>
+#include <Guid/XenInfo.h>
+
+#define XEN_SMBIOS_PHYSICAL_ADDRESS       0x000EB000
+#define XEN_SMBIOS_PHYSICAL_END           0x000F0000
+
+/**
+  Locates the Xen SMBIOS data if it exists
+
+  @return SMBIOS_TABLE_ENTRY_POINT   Address of Xen SMBIOS data
+
+**/
+SMBIOS_TABLE_ENTRY_POINT *
+GetXenSmbiosTables (
+  VOID
+  )
+{
+  UINT8                     *XenSmbiosPtr;
+  SMBIOS_TABLE_ENTRY_POINT  *XenSmbiosEntryPointStructure;
+  EFI_HOB_GUID_TYPE         *GuidHob;
+
+  //
+  // See if a XenInfo HOB is available
+  //
+  GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
+  if (GuidHob == NULL) {
+    return NULL;
+  }
+
+  for (XenSmbiosPtr = (UINT8*) XEN_SMBIOS_PHYSICAL_ADDRESS;
+       XenSmbiosPtr < (UINT8*) XEN_SMBIOS_PHYSICAL_END;
+       XenSmbiosPtr += 0x10) {
+
+    XenSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) XenSmbiosPtr;
+
+    if (!AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->AnchorString, "_SM_", 4) &&
+        !AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) &&
+        IsEntryPointStructureValid (XenSmbiosEntryPointStructure)) {
+
+      return XenSmbiosEntryPointStructure;
+
+    }
+  }
+
+  return NULL;
+}