]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/X86Xen.c
UefiCpuPkg CpuCommFeaturesLib: Fix GP fault issue about ProcTrace
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / X86Xen.c
CommitLineData
3e92a997
LE
1/** @file\r
2 Detect Xen hvmloader SMBIOS data for usage by OVMF.\r
3\r
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
5 Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
6\r
b26f0cf9 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
3e92a997
LE
8\r
9**/\r
10\r
11#include "SmbiosPlatformDxe.h"\r
12#include <Library/HobLib.h>\r
13#include <Guid/XenInfo.h>\r
14\r
15#define XEN_SMBIOS_PHYSICAL_ADDRESS 0x000EB000\r
16#define XEN_SMBIOS_PHYSICAL_END 0x000F0000\r
17\r
18/**\r
19 Validates the SMBIOS entry point structure\r
20\r
21 @param EntryPointStructure SMBIOS entry point structure\r
22\r
23 @retval TRUE The entry point structure is valid\r
24 @retval FALSE The entry point structure is not valid\r
25\r
26**/\r
27STATIC\r
28BOOLEAN\r
29IsEntryPointStructureValid (\r
30 IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure\r
31 )\r
32{\r
33 UINTN Index;\r
34 UINT8 Length;\r
35 UINT8 Checksum;\r
36 UINT8 *BytePtr;\r
37\r
38 BytePtr = (UINT8*) EntryPointStructure;\r
39 Length = EntryPointStructure->EntryPointLength;\r
40 Checksum = 0;\r
41\r
42 for (Index = 0; Index < Length; Index++) {\r
43 Checksum = Checksum + (UINT8) BytePtr[Index];\r
44 }\r
45\r
46 if (Checksum != 0) {\r
47 return FALSE;\r
48 } else {\r
49 return TRUE;\r
50 }\r
51}\r
52\r
53/**\r
54 Locates the Xen SMBIOS data if it exists\r
55\r
56 @return SMBIOS_TABLE_ENTRY_POINT Address of Xen SMBIOS data\r
57\r
58**/\r
59SMBIOS_TABLE_ENTRY_POINT *\r
60GetXenSmbiosTables (\r
61 VOID\r
62 )\r
63{\r
64 UINT8 *XenSmbiosPtr;\r
65 SMBIOS_TABLE_ENTRY_POINT *XenSmbiosEntryPointStructure;\r
66 EFI_HOB_GUID_TYPE *GuidHob;\r
67\r
68 //\r
69 // See if a XenInfo HOB is available\r
70 //\r
71 GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);\r
72 if (GuidHob == NULL) {\r
73 return NULL;\r
74 }\r
75\r
76 for (XenSmbiosPtr = (UINT8*)(UINTN) XEN_SMBIOS_PHYSICAL_ADDRESS;\r
77 XenSmbiosPtr < (UINT8*)(UINTN) XEN_SMBIOS_PHYSICAL_END;\r
78 XenSmbiosPtr += 0x10) {\r
79\r
80 XenSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) XenSmbiosPtr;\r
81\r
82 if (!AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->AnchorString, "_SM_", 4) &&\r
83 !AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) &&\r
84 IsEntryPointStructureValid (XenSmbiosEntryPointStructure)) {\r
85\r
86 return XenSmbiosEntryPointStructure;\r
87\r
88 }\r
89 }\r
90\r
91 return NULL;\r
92}\r