blob: e0b1b29f80dbb4c3e943cb2ec2ba4752945a78b0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/** @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 "SmbiosPlatformDxe.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;
}
|