| /** @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> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <Library/BaseLib.h> // AsciiStrnCmp() | |
| #include <Library/HobLib.h> // GetFirstGuidHob() | |
| #include <Pi/PiHob.h> // EFI_HOB_GUID_TYPE | |
| #include "XenSmbiosPlatformDxe.h" | |
| #define XEN_SMBIOS_PHYSICAL_ADDRESS 0x000EB000 | |
| #define XEN_SMBIOS_PHYSICAL_END 0x000F0000 | |
| /** | |
| Validates the SMBIOS entry point structure | |
| @param EntryPointStructure SMBIOS entry point structure | |
| @retval TRUE The entry point structure is valid | |
| @retval FALSE The entry point structure is not valid | |
| **/ | |
| STATIC | |
| BOOLEAN | |
| IsEntryPointStructureValid ( | |
| IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure | |
| ) | |
| { | |
| UINTN Index; | |
| UINT8 Length; | |
| UINT8 Checksum; | |
| UINT8 *BytePtr; | |
| BytePtr = (UINT8 *)EntryPointStructure; | |
| Length = EntryPointStructure->EntryPointLength; | |
| Checksum = 0; | |
| for (Index = 0; Index < Length; Index++) { | |
| Checksum = Checksum + (UINT8)BytePtr[Index]; | |
| } | |
| if (Checksum != 0) { | |
| return FALSE; | |
| } else { | |
| return TRUE; | |
| } | |
| } | |
| /** | |
| 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 *)(UINTN)XEN_SMBIOS_PHYSICAL_ADDRESS; | |
| XenSmbiosPtr < (UINT8 *)(UINTN)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; | |
| } |