]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/SmbiosPlatformDxe/X86Xen.c
OvmfPkg/PlatformDxe: list "Platform.h" in the INF file
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / X86Xen.c
1 /** @file
2 Detect Xen hvmloader SMBIOS data for usage by OVMF.
3
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>
5 Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
6
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #include "SmbiosPlatformDxe.h"
18 #include <Library/HobLib.h>
19 #include <Guid/XenInfo.h>
20
21 #define XEN_SMBIOS_PHYSICAL_ADDRESS 0x000EB000
22 #define XEN_SMBIOS_PHYSICAL_END 0x000F0000
23
24 /**
25 Validates the SMBIOS entry point structure
26
27 @param EntryPointStructure SMBIOS entry point structure
28
29 @retval TRUE The entry point structure is valid
30 @retval FALSE The entry point structure is not valid
31
32 **/
33 STATIC
34 BOOLEAN
35 IsEntryPointStructureValid (
36 IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure
37 )
38 {
39 UINTN Index;
40 UINT8 Length;
41 UINT8 Checksum;
42 UINT8 *BytePtr;
43
44 BytePtr = (UINT8*) EntryPointStructure;
45 Length = EntryPointStructure->EntryPointLength;
46 Checksum = 0;
47
48 for (Index = 0; Index < Length; Index++) {
49 Checksum = Checksum + (UINT8) BytePtr[Index];
50 }
51
52 if (Checksum != 0) {
53 return FALSE;
54 } else {
55 return TRUE;
56 }
57 }
58
59 /**
60 Locates the Xen SMBIOS data if it exists
61
62 @return SMBIOS_TABLE_ENTRY_POINT Address of Xen SMBIOS data
63
64 **/
65 SMBIOS_TABLE_ENTRY_POINT *
66 GetXenSmbiosTables (
67 VOID
68 )
69 {
70 UINT8 *XenSmbiosPtr;
71 SMBIOS_TABLE_ENTRY_POINT *XenSmbiosEntryPointStructure;
72 EFI_HOB_GUID_TYPE *GuidHob;
73
74 //
75 // See if a XenInfo HOB is available
76 //
77 GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
78 if (GuidHob == NULL) {
79 return NULL;
80 }
81
82 for (XenSmbiosPtr = (UINT8*)(UINTN) XEN_SMBIOS_PHYSICAL_ADDRESS;
83 XenSmbiosPtr < (UINT8*)(UINTN) XEN_SMBIOS_PHYSICAL_END;
84 XenSmbiosPtr += 0x10) {
85
86 XenSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) XenSmbiosPtr;
87
88 if (!AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->AnchorString, "_SM_", 4) &&
89 !AsciiStrnCmp ((CHAR8 *) XenSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) &&
90 IsEntryPointStructureValid (XenSmbiosEntryPointStructure)) {
91
92 return XenSmbiosEntryPointStructure;
93
94 }
95 }
96
97 return NULL;
98 }